From 3fa45148a1ccad976ab747eddc1762135c063bec Mon Sep 17 00:00:00 2001 From: Joe Neeman Date: Mon, 18 Jun 2007 13:15:00 +1000 Subject: [PATCH] include accidentals and arpeggios in note spacing --- lily/accidental-engraver.cc | 14 +++++++++ lily/accidental-placement.cc | 45 +++++----------------------- lily/arpeggio-engraver.cc | 9 ------ lily/include/accidental-placement.hh | 6 +--- lily/note-spacing.cc | 5 ++-- lily/rhythmic-column-engraver.cc | 17 +++++++++++ lily/separation-item.cc | 2 +- 7 files changed, 43 insertions(+), 55 deletions(-) diff --git a/lily/accidental-engraver.cc b/lily/accidental-engraver.cc index 351ab2045a..910c62d282 100644 --- a/lily/accidental-engraver.cc +++ b/lily/accidental-engraver.cc @@ -17,6 +17,7 @@ #include "pitch.hh" #include "protected-scm.hh" #include "rhythmic-head.hh" +#include "separation-item.hh" #include "side-position-interface.hh" #include "stream-event.hh" #include "tie.hh" @@ -64,6 +65,7 @@ protected: void acknowledge_arpeggio (Grob_info); void acknowledge_rhythmic_head (Grob_info); void acknowledge_finger (Grob_info); + void acknowledge_note_column (Grob_info); void stop_translation_timestep (); void process_acknowledged (); @@ -81,6 +83,7 @@ public: vector accidentals_; vector ties_; + vector note_columns_; }; /* @@ -521,6 +524,10 @@ Accidental_engraver::stop_translation_timestep () } } + if (accidental_placement_) + for (vsize i = 0; i < note_columns_.size (); i++) + Separation_item::add_conditional_item (note_columns_[i], accidental_placement_); + accidental_placement_ = 0; accidentals_.clear (); left_objects_.clear (); @@ -558,6 +565,12 @@ Accidental_engraver::acknowledge_tie (Grob_info info) ties_.push_back (dynamic_cast (info.grob ())); } +void +Accidental_engraver::acknowledge_note_column (Grob_info info) +{ + note_columns_.push_back (info.grob ()); +} + void Accidental_engraver::acknowledge_arpeggio (Grob_info info) { @@ -582,6 +595,7 @@ ADD_ACKNOWLEDGER (Accidental_engraver, arpeggio); ADD_ACKNOWLEDGER (Accidental_engraver, finger); ADD_ACKNOWLEDGER (Accidental_engraver, rhythmic_head); ADD_ACKNOWLEDGER (Accidental_engraver, tie); +ADD_ACKNOWLEDGER (Accidental_engraver, note_column); ADD_TRANSLATOR (Accidental_engraver, diff --git a/lily/accidental-placement.cc b/lily/accidental-placement.cc index 8e75206dc8..bb1419977e 100644 --- a/lily/accidental-placement.cc +++ b/lily/accidental-placement.cc @@ -76,54 +76,23 @@ Accidental_placement::split_accidentals (Grob *accs, } vector -Accidental_placement::get_break_reminder_accidentals (vector const &elts, Grob *left) +Accidental_placement::get_relevant_accidentals (vector const &elts, Grob *left) { vector br; vector ra; vector ret; - - if (dynamic_cast (left)->break_status_dir () != RIGHT) - return vector (); + bool right = dynamic_cast (left)->break_status_dir () == RIGHT; for (vsize i = 0; i < elts.size (); i++) { split_accidentals (elts[i], &br, &ra); - ret.insert (ret.end (), br.begin (), br.end ()); - } - return ret; -} - -/* - Accidentals are special, because they appear and disappear after - ties at will. -*/ -Interval -Accidental_placement::get_relevant_accidental_extent (Grob *me, - Item *item_col, - Grob *left_object) -{ - vector br, ra; - vector *which = 0; - - Accidental_placement::split_accidentals (me, &br, &ra); - concat (br, ra); - - if (dynamic_cast (left_object)->break_status_dir () == RIGHT) - which = &br; - else - which = &ra; - - Interval extent; - for (vsize i = 0; i < which->size (); i++) - extent.unite (which->at (i)->extent (item_col, X_AXIS)); + + ret.insert (ret.end (), ra.begin (), ra.end ()); - if (!extent.is_empty ()) - { - Real p = robust_scm2double (me->get_property ("left-padding"), 0.2); - extent[LEFT] -= p; + if (right) + ret.insert (ret.end (), br.begin (), br.end ()); } - - return extent; + return ret; } struct Accidental_placement_entry diff --git a/lily/arpeggio-engraver.cc b/lily/arpeggio-engraver.cc index 0528f71d9f..399823408f 100644 --- a/lily/arpeggio-engraver.cc +++ b/lily/arpeggio-engraver.cc @@ -26,7 +26,6 @@ public: void acknowledge_stem (Grob_info); void acknowledge_rhythmic_head (Grob_info); - void acknowledge_note_column (Grob_info); protected: void process_music (); void stop_translation_timestep (); @@ -73,13 +72,6 @@ Arpeggio_engraver::acknowledge_rhythmic_head (Grob_info info) Side_position_interface::add_support (arpeggio_, info.grob ()); } -void -Arpeggio_engraver::acknowledge_note_column (Grob_info info) -{ - if (arpeggio_) - info.grob ()->set_object ("arpeggio", arpeggio_->self_scm ()); -} - void Arpeggio_engraver::process_music () { @@ -98,7 +90,6 @@ Arpeggio_engraver::stop_translation_timestep () ADD_ACKNOWLEDGER (Arpeggio_engraver, stem); ADD_ACKNOWLEDGER (Arpeggio_engraver, rhythmic_head); -ADD_ACKNOWLEDGER (Arpeggio_engraver, note_column); ADD_TRANSLATOR (Arpeggio_engraver, /* doc */ "Generate an Arpeggio symbol", diff --git a/lily/include/accidental-placement.hh b/lily/include/accidental-placement.hh index f6c17621ed..99281a5b14 100644 --- a/lily/include/accidental-placement.hh +++ b/lily/include/accidental-placement.hh @@ -18,11 +18,7 @@ public: DECLARE_SCHEME_CALLBACK (alignment_callback, (SCM element)); static void add_accidental (Grob *, Grob *); - static vector get_break_reminder_accidentals (vector const &elts, - Grob *left); - static Interval get_relevant_accidental_extent (Grob *me, - Item *item_col, - Grob *acc); + static vector get_relevant_accidentals (vector const &elts, Grob *left); static void split_accidentals (Grob *accs, vector *break_reminder, vector *real_acc); diff --git a/lily/note-spacing.cc b/lily/note-spacing.cc index a952455f7e..a886c31a41 100644 --- a/lily/note-spacing.cc +++ b/lily/note-spacing.cc @@ -66,7 +66,8 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, */ Real min_dist = Spacing_interface::minimum_distance (me); - *fixed = max (min_dist, left_head_end + min_dist/2); + *fixed = max (left_head_end + (min_dist - left_head_end) / 2, + min_dist - (base_space - increment) / 2); /* We don't do complicated stuff: (base_space - increment) is the @@ -85,7 +86,7 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, up-stem + down-stem should get extra space, the combination down-stem + up-stem less. - TODO: have to check wether the stems are in the same staff. + TODO: have to check whether the stems are in the same staff. */ void Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, diff --git a/lily/rhythmic-column-engraver.cc b/lily/rhythmic-column-engraver.cc index fc21e618eb..d57c1c49a5 100644 --- a/lily/rhythmic-column-engraver.cc +++ b/lily/rhythmic-column-engraver.cc @@ -46,6 +46,7 @@ class Rhythmic_column_engraver : public Engraver Grob *stem_; Grob *note_column_; Grob *dotcol_; + Grob *arpeggio_; TRANSLATOR_DECLARATIONS (Rhythmic_column_engraver); protected: @@ -53,6 +54,7 @@ protected: DECLARE_ACKNOWLEDGER (dot_column); DECLARE_ACKNOWLEDGER (stem); DECLARE_ACKNOWLEDGER (rhythmic_head); + DECLARE_ACKNOWLEDGER (arpeggio); void process_acknowledged (); void stop_translation_timestep (); }; @@ -63,6 +65,7 @@ Rhythmic_column_engraver::Rhythmic_column_engraver () stem_ = 0; note_column_ = 0; dotcol_ = 0; + arpeggio_ = 0; } @@ -96,6 +99,12 @@ Rhythmic_column_engraver::process_acknowledged () Note_column::set_stem (note_column_, stem_); stem_ = 0; } + + if (arpeggio_) + { + Pointer_group_interface::add_grob (note_column_, ly_symbol2scm ("elements"), arpeggio_); + note_column_->set_object ("arpeggio", arpeggio_->self_scm ()); + } } } @@ -117,17 +126,25 @@ Rhythmic_column_engraver::acknowledge_dot_column (Grob_info i) dotcol_ = i.grob (); } +void +Rhythmic_column_engraver::acknowledge_arpeggio (Grob_info i) +{ + arpeggio_ = i.grob (); +} + void Rhythmic_column_engraver::stop_translation_timestep () { note_column_ = 0; dotcol_ = 0; stem_ = 0; + arpeggio_ = 0; } ADD_ACKNOWLEDGER (Rhythmic_column_engraver, dot_column); ADD_ACKNOWLEDGER (Rhythmic_column_engraver, stem); ADD_ACKNOWLEDGER (Rhythmic_column_engraver, rhythmic_head); +ADD_ACKNOWLEDGER (Rhythmic_column_engraver, arpeggio); ADD_TRANSLATOR (Rhythmic_column_engraver, /* doc */ "Generates NoteColumn, an objects that groups stems, noteheads and rests.", diff --git a/lily/separation-item.cc b/lily/separation-item.cc index 8a83e2b7a1..ab40c3905e 100644 --- a/lily/separation-item.cc +++ b/lily/separation-item.cc @@ -97,7 +97,7 @@ Separation_item::boxes (Grob *me, Grob *left) vector elts; if (left) - elts = Accidental_placement::get_break_reminder_accidentals (read_only_elts, left); + elts = Accidental_placement::get_relevant_accidentals (read_only_elts, left); else elts = read_only_elts; -- 2.39.5