]> git.donarmstrong.com Git - lilypond.git/commitdiff
include accidentals and arpeggios in note spacing
authorJoe Neeman <joeneeman@gmail.com>
Mon, 18 Jun 2007 03:15:00 +0000 (13:15 +1000)
committerJoe Neeman <joeneeman@gmail.com>
Mon, 18 Jun 2007 03:15:00 +0000 (13:15 +1000)
lily/accidental-engraver.cc
lily/accidental-placement.cc
lily/arpeggio-engraver.cc
lily/include/accidental-placement.hh
lily/note-spacing.cc
lily/rhythmic-column-engraver.cc
lily/separation-item.cc

index 351ab2045a035df90825c9ce8edd99c973b05d8f..910c62d282040d55021db4cca8703f4bcdd0520c 100644 (file)
@@ -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<Accidental_entry> accidentals_;
   vector<Spanner*> ties_;
+  vector<Grob*> 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<Spanner *> (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,
                
index 8e75206dc81bafeb5da5451d625ac70b4d1ca8aa..bb1419977ef262fb9ef7a4fada49be8362c15e87 100644 (file)
@@ -76,54 +76,23 @@ Accidental_placement::split_accidentals (Grob *accs,
 }
 
 vector<Grob*>
-Accidental_placement::get_break_reminder_accidentals (vector<Grob*> const &elts, Grob *left)
+Accidental_placement::get_relevant_accidentals (vector<Grob*> const &elts, Grob *left)
 {
   vector<Grob*> br;
   vector<Grob*> ra;
   vector<Grob*> ret;
-
-  if (dynamic_cast<Item *> (left)->break_status_dir () != RIGHT)
-    return vector<Grob*> ();
+  bool right = dynamic_cast<Item *> (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<Grob*> br, ra;
-  vector<Grob*> *which = 0;
-
-  Accidental_placement::split_accidentals (me, &br, &ra);
-  concat (br, ra);
-
-  if (dynamic_cast<Item *> (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
index 0528f71d9f576b644c3cd730c17e26b6903e5fee..399823408f88d501a246a97a3ae5cd54fa321ce2 100644 (file)
@@ -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",
index f6c17621edb9f81c13143fb75bd49c3a79eb8301..99281a5b14b1dbbe2d0a415b05f892e21c368663 100644 (file)
@@ -18,11 +18,7 @@ public:
   DECLARE_SCHEME_CALLBACK (alignment_callback, (SCM element));
   static void add_accidental (Grob *, Grob *);
 
-  static vector<Grob*> get_break_reminder_accidentals (vector<Grob*> const &elts,
-                                                      Grob *left);
-  static Interval get_relevant_accidental_extent (Grob *me,
-                                                 Item *item_col,
-                                                 Grob *acc);
+  static vector<Grob*> get_relevant_accidentals (vector<Grob*> const &elts, Grob *left);
   static void split_accidentals (Grob *accs,
                                 vector<Grob*> *break_reminder,
                                 vector<Grob*> *real_acc);
index a952455f7efca24fd3e754bf0d430a5cdb2bf5e9..a886c31a417f0d15f3a60c8d3a0d0dc09be118a8 100644 (file)
@@ -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,
index fc21e618eb202059a234c64e33e29101aed22721..d57c1c49a5528f4c5280dac2d574afc0b6c37e62 100644 (file)
@@ -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.",
index 8a83e2b7a1e2eefeec1b5bdbaa3e75281fd5b2c1..ab40c3905ebbbb0c4264830a10ae71325079c2ea 100644 (file)
@@ -97,7 +97,7 @@ Separation_item::boxes (Grob *me, Grob *left)
   vector<Grob*> 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;