]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-1.3.68
authorfred <fred>
Tue, 26 Mar 2002 23:24:19 +0000 (23:24 +0000)
committerfred <fred>
Tue, 26 Mar 2002 23:24:19 +0000 (23:24 +0000)
34 files changed:
CHANGES
input/test/orchestscore.ly
lily/crescendo.cc
lily/dynamic-engraver.cc
lily/hara-kiri-engraver.cc
lily/hara-kiri-group-spanner.cc
lily/include/bar.hh
lily/include/crescendo.hh
lily/include/hara-kiri-group-spanner.hh
lily/include/multi-measure-rest.hh
lily/include/paper-column.hh
lily/include/spanner.hh
lily/include/stem-tremolo.hh
lily/include/system-start-delimiter.hh
lily/include/tie-column.hh
lily/include/tie.hh
lily/include/tuplet-spanner.hh
lily/include/volta-spanner.hh
lily/local-key-engraver.cc
lily/multi-measure-rest-engraver.cc
lily/multi-measure-rest.cc
lily/repeat-engraver.cc
lily/stem-engraver.cc
lily/stem-tremolo.cc
lily/system-start-delimiter.cc
lily/tie-column.cc
lily/tie-engraver.cc
lily/tie.cc
lily/tuplet-engraver.cc
lily/tuplet-spanner.cc
lily/volta-spanner.cc
ly/engraver.ly
scripts/convert-mudela.py
scripts/ly2dvi.py

diff --git a/CHANGES b/CHANGES
index f14c1d313c772d4ca595b6e24beace9e4b4118e8..31c3968012e24085aec0373798b5d38fbb80b7ea 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,25 @@
-1.3.66.hwn1
-===========
+1.3.68
+======
+
+* ly2dvi: changed back to original semantics of latexheaders.
+
+* Stem_tremolo, Crescendo, Hara_kiri_group_spanner, Tuplet_spanner,
+Volta_spanner changed into interface.
+
+* Related cleanups for Tie, Tie_column cleanups.
+
+* Made Time_signature, Single_malt_grouping_item, Script_column,
+Chord_name, Dot_column, Breathing_sign, Key_item type into interface.
+
+* Removed const declaration from callback arguments.
+
+* Pagebreak support. See input/test/between-systems.ly
+
+* Fixed a problem with accidentals in combination with
+non-nil key signatures.
+
+1.3.67
+======
 
 * Use callbacks for augmentation dot positioning.
 
index c9b7da53168ab64b8f0aa3e838d22a7740310154..4f3fc240b2cb35bc1feed972399beca48b14720c 100644 (file)
@@ -5,6 +5,11 @@ m = \notes \relative c''{
 c1 | c2 c | c c | c c | \break c c | c c | c c | c c | 
 }
 
+M = \notes \relative c''{
+
+c1 | c2 c | c c | R1*5 
+}
+
 \score{ < 
   \context StaffGroup = wood <
     \context Staff = flauto <
@@ -37,14 +42,14 @@ c1 | c2 c | c c | c c | \break c c | c c | c c | c c |
     \context Staff = cor <
       \property Staff.instrument = "2 Corni in F"
       \property Staff.instr = "Cor."
-      \context Voice = corI { \stemup \m }
-      \context Voice = corII { \stemdown \m }
+      \context Voice = corI { \stemup \M }
+      \context Voice = corII { \stemdown \M }
     >
     \context Staff = trp <
       \property Staff.instrument = "2 Trp. in B\\textflat  "
       \property Staff.instr = "Trp."
-      \context Voice = trpI { \stemup \m }
-      \context Voice = trpII { \stemdown \m }
+      \context Voice = trpI { \stemup \M }
+      \context Voice = trpII { \stemdown \M }
     >
   >
     \context StaffGroup = percussion <\context Staff = timpani <
@@ -90,12 +95,10 @@ c1 | c2 c | c c | c c | \break c c | c c | c c | c c |
     \translator {
        \OrchestralScoreContext
        barNumberScriptPadding = 10;
-        minVerticalAlign = 2.2*\staffheight;
-
     }
     \translator { \HaraKiriStaffContext
-       \consists "Instrument_name_engraver";
         marginScriptPadding = 15.0;
+%        StaffMinimumVerticalExtent = #(cons -0.0 0.0)
     }
   }
 }
index 7890d5cf0057c631b37ed5e8eaaa951be0650064..8ba2b7ef9e6e309a87d74ec2981bc3a53ae79718 100644 (file)
@@ -8,51 +8,48 @@
 
 #include "molecule.hh"
 #include "crescendo.hh"
+#include "spanner.hh"
 #include "lookup.hh"
 #include "dimensions.hh"
 #include "paper-def.hh"
 #include "debug.hh"
 #include "paper-column.hh"
 
-
-Crescendo::Crescendo (SCM s)
-  : Spanner (s)
+void
+Crescendo::set_interface (Score_element*s)
 {
-  set_elt_property ("dynamic-drul", gh_cons (SCM_BOOL_F, SCM_BOOL_F));
+  s->set_elt_pointer ("dynamic-drul", gh_cons (SCM_UNDEFINED, SCM_UNDEFINED));
 }
 
 
 
-
-GLUE_SCORE_ELEMENT(Crescendo,brew_molecule);
-
+MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Crescendo,brew_molecule);
 SCM
-Crescendo::member_brew_molecule () const
+Crescendo::brew_molecule (SCM smob) 
 {
-  Real absdyn_dim = paper_l ()-> get_var ("crescendo_shorten");
-  Real extra_left =  get_broken_left_end_align ();
+  Score_element *me= unsmob_element (smob);
+  Spanner * sp = dynamic_cast<Spanner*>(me);
+  Real absdyn_dim = me->paper_l ()-> get_var ("crescendo_shorten");
+  Real extra_left =  sp->get_broken_left_end_align ();
 
-  SCM dir = get_elt_property("grow-direction");
-  SCM dyns = get_elt_property ("dynamic-drul");
+  SCM dir = me->get_elt_property("grow-direction");
+  SCM dyns = me->get_elt_property ("dynamic-drul");
 
   if (!isdir_b (dir) || !gh_pair_p (dyns))
     {
-      Crescendo * me = (Crescendo*)this;
       me->suicide ();
       return SCM_EOL;
     }
   
   Direction gd = to_dir (dir);
 
-  bool dynleft= to_boolean (gh_car (dyns));
-  bool dynright = to_boolean (gh_cdr (dyns));
+  bool dynleft= unsmob_element (gh_car (dyns));
+  bool dynright = unsmob_element (gh_cdr (dyns));
   
   if (dynleft)
     extra_left += absdyn_dim;
 
-  
-
-  Real width = spanner_length()- get_broken_left_end_align ();
+  Real width = sp->spanner_length()- sp->get_broken_left_end_align ();
 
   if (dynleft)
     {
@@ -73,7 +70,7 @@ Crescendo::member_brew_molecule () const
   Direction d = LEFT;
   do
     {
-      Paper_column* s = dynamic_cast<Paper_column*>(get_bound (d)); // UGH
+      Paper_column* s = dynamic_cast<Paper_column*>(sp->get_bound (d)); // UGH
       broken[d] = (!s->musical_b ());
     }
   while (flip (&d) != LEFT);
@@ -82,15 +79,15 @@ Crescendo::member_brew_molecule () const
   Molecule m;
   
   Real pad = 0;
-  SCM s = get_elt_property ("start-text");
+  SCM s = me->get_elt_property ("start-text");
   if (gh_string_p (s))
     {
-      Molecule start_text (lookup_l ()->text ("italic",
+      Molecule start_text (me->lookup_l ()->text ("italic",
                                              ly_scm2string (s),
-                                             paper_l ()));
+                                                 me->paper_l ()));
       m.add_molecule (start_text);
 
-      pad = paper_l ()->get_var ("interline") / 2;
+      pad = me->paper_l ()->get_var ("interline") / 2;
 
       width -= start_text.extent (X_AXIS).length ();
       width -= pad;
@@ -98,12 +95,12 @@ Crescendo::member_brew_molecule () const
     }
 
   SCM at;
-  s = get_elt_property ("spanner");
+  s =me->get_elt_property ("spanner");
   Real height;
   if (gh_string_p (s) && ly_scm2string (s) == "dashed-line")
     {
-      Real thick = paper_l ()->get_var ("crescendo_dash_thickness");
-      Real dash = paper_l ()->get_var ("crescendo_dash");
+      Real thick = me->paper_l ()->get_var ("crescendo_dash_thickness");
+      Real dash = me->paper_l ()->get_var ("crescendo_dash");
       height = thick;
       at = gh_list (ly_symbol2scm (ly_scm2string (s).ch_C ()),
                    gh_double2scm (thick),
@@ -114,8 +111,8 @@ Crescendo::member_brew_molecule () const
   else
     {
       bool continued = broken[Direction (-gd)];
-      height = paper_l()->get_var ("crescendo_height");
-      Real thick = paper_l ()->get_var ("crescendo_thickness");
+      height = me->paper_l()->get_var ("crescendo_height");
+      Real thick = me->paper_l ()->get_var ("crescendo_thickness");
       
       const char* hairpin = (gd < 0)? "decrescendo" :  "crescendo";
 
index 8224b1f6f6939f39d2691f2c9764fd4b213ea6d9..1e329f4f7342c7134e1251835fc71c51bb0493f7 100644 (file)
@@ -7,22 +7,15 @@
 */
 #include "debug.hh"
 #include "dimensions.hh"
-#include "dimension-cache.hh"
 #include "crescendo.hh"
 #include "musical-request.hh"
-#include "lookup.hh"
-#include "paper-def.hh"
 #include "paper-column.hh"
-#include "staff-symbol.hh"
 #include "note-column.hh"
 #include "item.hh"
 #include "side-position-interface.hh"
 #include "engraver.hh"
-#include "stem.hh"
-#include "rhythmic-head.hh"
 #include "group-interface.hh"
 #include "directional-element-interface.hh"
-#include "staff-symbol-referencer.hh"
 #include "translator-group.hh"
 #include "axis-group-interface.hh"
 
@@ -40,8 +33,8 @@
 class Dynamic_engraver : public Engraver
 {
   Item * text_p_;
-  Crescendo * finished_cresc_p_;
-  Crescendo * cresc_p_;
+  Spanner * finished_cresc_p_;
+  Spanner * cresc_p_;
 
   Text_script_req* text_req_l_;
   
@@ -214,7 +207,8 @@ Dynamic_engraver::do_process_music ()
       else
        {
          current_cresc_req_ = accepted_spanreqs_drul_[START];
-         cresc_p_  = new Crescendo (get_property ("basicCrescendoProperties"));
+         cresc_p_  = new Spanner (get_property ("basicCrescendoProperties"));
+         Crescendo::set_interface (cresc_p_);
          cresc_p_->set_elt_property
            ("grow-direction",
             gh_int2scm ((accepted_spanreqs_drul_[START]->span_type_str_ == "crescendo")
@@ -262,11 +256,11 @@ Dynamic_engraver::do_process_music ()
          
          if (text_p_)
            {
-             index_set_cell (cresc_p_->get_elt_property ("dynamic-drul"),
-                             LEFT, SCM_BOOL_T);
+             index_set_cell (cresc_p_->get_elt_pointer ("dynamic-drul"),
+                             LEFT, text_p_->self_scm_);
              if (finished_cresc_p_)
-               index_set_cell (finished_cresc_p_->get_elt_property ("dynamic-drul"),
-                               RIGHT, SCM_BOOL_T);
+               index_set_cell (finished_cresc_p_->get_elt_pointer ("dynamic-drul"),
+                               RIGHT, text_p_->self_scm_);
            }
 
          Axis_group_interface (line_spanner_).add_element (cresc_p_);
index 10eca4fe1d181149ce7e4a2bfe090d67811b7e17..1ef2d1ac3c8c2c7a32a69911f0182f7334595d4c 100644 (file)
@@ -9,11 +9,14 @@
 #include "hara-kiri-group-spanner.hh"
 #include "hara-kiri-engraver.hh"
 #include "rhythmic-head.hh"
+#include "spanner.hh"
 
 Spanner*
 Hara_kiri_engraver::get_spanner_p () const
 {
-  return new Hara_kiri_group_spanner (get_property ("basicHaraKiriVerticalGroupspannerProperties"));
+  Spanner * sp = new Spanner (get_property ("basicHaraKiriVerticalGroupspannerProperties"));
+  Hara_kiri_group_spanner::set_interface (sp);
+  return sp;
 }
 
 void
@@ -25,9 +28,7 @@ Hara_kiri_engraver::acknowledge_element (Score_element_info i)
   
   if (Rhythmic_head *h = dynamic_cast<Rhythmic_head *> (i.elem_l_))
     {
-      dynamic_cast<Hara_kiri_group_spanner*> (staffline_p_)
-       ->add_interesting_item (h);
+      Hara_kiri_group_spanner::add_interesting_item (staffline_p_, h);
     }
-  
 }
 ADD_THIS_TRANSLATOR(Hara_kiri_engraver);
index 3161032716697aba99f4b6980d71030a37b47919..125b686f370ab9b6dd5009a38b80c69922c94056 100644 (file)
@@ -8,49 +8,41 @@
 */
 
 #include "axis-group-interface.hh"
+#include "spanner.hh"
 #include "hara-kiri-group-spanner.hh"
 #include "debug.hh"
 #include "item.hh"
 
-/*
- */
-Hara_kiri_group_spanner::Hara_kiri_group_spanner(SCM s)
-  : Spanner (s)
+void
+Hara_kiri_group_spanner::set_interface (Score_element*me)
 {
-  set_elt_pointer ("items-worth-living", SCM_EOL);
+  me->set_elt_pointer ("items-worth-living", SCM_EOL);
 }
 
 void 
-Hara_kiri_group_spanner::add_interesting_item (Item* n)
+Hara_kiri_group_spanner::add_interesting_item (Score_element* me,Item* n)
 {
-  add_dependency (n);
-  Pointer_group_interface (this, "items-worth-living").add_element (n);
+  me->add_dependency (n);
+  Pointer_group_interface (me, "items-worth-living").add_element (n);
 
 }
 
-GLUE_SCORE_ELEMENT(Hara_kiri_group_spanner,after_line_breaking);
-SCM 
-Hara_kiri_group_spanner::member_after_line_breaking ()
+void
+Hara_kiri_group_spanner::consider_suicide(Score_element*me)
 {
-  SCM worth = get_elt_pointer ("items-worth-living");
+  SCM worth = me->get_elt_pointer ("items-worth-living");
   if (gh_pair_p (worth))
-    return SCM_UNDEFINED;
+    return ;
 
-  Link_array<Score_element> childs = Axis_group_interface (this).get_children ();
+  Link_array<Score_element> childs = Axis_group_interface (me).get_children ();
   for (int i = 0; i < childs.size (); i++)
-    {
-      Score_element* s = childs[i];
+    childs[i]->suicide ();
 
-      if ( line_l () != s->line_l ())
-       programming_error ("Killing other children too");
-      s->suicide ();
-    }
 
   /*
     very appropriate name here :-)
    */
-  suicide ();
-  return SCM_UNDEFINED;
+  me->suicide ();
 }
 
 
@@ -60,18 +52,16 @@ Hara_kiri_group_spanner::member_after_line_breaking ()
   group. Use a callback to make sure that hara-kiri has been done
   before asking for offsets.  */
 Real
-Hara_kiri_group_spanner::force_hara_kiri_callback (Score_element const  *elt, Axis a)
+Hara_kiri_group_spanner::force_hara_kiri_callback (Score_element *elt, Axis a)
 {
-  while (elt && !dynamic_cast<Hara_kiri_group_spanner const*> (elt))
+  while (elt
+        && to_boolean (elt->get_elt_property ("hara-kiri-interface")))
     elt = elt->parent_l(a);
 
   if (elt)
     {
-      Hara_kiri_group_spanner const  * seppuku = dynamic_cast<Hara_kiri_group_spanner const*> (elt);
-
-      ((Hara_kiri_group_spanner*)seppuku)->member_after_line_breaking ();
+      Hara_kiri_group_spanner::consider_suicide (elt);
     }
-  
 
   return 0.0;
 }
index 92c03f20d87315213a08479af22c0ae6ddb230d5..1e6bf095f8e6cd9dbcb0f0a439475094fe2352a4 100644 (file)
@@ -11,7 +11,8 @@
 /**
   A vertical bar.
  */
-class Bar:public Item {
+class Bar:public Item
+{
 public:
   VIRTUAL_COPY_CONS(Score_element);
   Bar(SCM);
index e45ef61ffdb6b3914e92339e2c8910aeeef93d71..36639f85869c1a4dd1d712abf2533e12b4185675 100644 (file)
 #ifndef CRESCENDO_HH
 #define CRESCENDO_HH
 
-#include "spanner.hh"
+#include "lily-guile.hh"
 /**
   The hairpin symbol. (cresc)
 
   (normal spanner?)
  */
-class Crescendo : public Spanner {
+struct Crescendo
+{
 public:
-   static SCM brew_molecule (SCM);
-  
-  Crescendo(SCM);
-
-  VIRTUAL_COPY_CONS(Score_element);
-  SCM member_brew_molecule() const;
-    
-private:
-  Molecule get_symbol() const;
+  static SCM brew_molecule (SCM);
+  static void set_interface(Score_element*);
 };
 
 #endif // CRESCENDO_HH
index 476a18a915db3fa0d2a33289eba48b4d68082e11..912a6f4ffcf226956c0c366e8e9f954def389972 100644 (file)
@@ -10,7 +10,8 @@
 #ifndef HARA_KIRI_VERTICAL_GROUP_SPANNER_HH
 #define HARA_KIRI_VERTICAL_GROUP_SPANNER_HH
 
-#include "spanner.hh"
+#include "lily-guile.hh"
+#include "lily-proto.hh"
 
 /** 
   As Vertical_group_spanner, but keep track of interesting items.  If
     clear this line
 
 */
-class Hara_kiri_group_spanner : public Spanner
+class Hara_kiri_group_spanner 
 {
 public:
-  static Real force_hara_kiri_callback (Score_element const* , Axis);
-  Hara_kiri_group_spanner (SCM);
-  SCM member_after_line_breaking ();
-  static SCM after_line_breaking (SCM);
-  
-  void add_interesting_item (Item* n);
-
-  VIRTUAL_COPY_CONS(Score_element);
+  static Real force_hara_kiri_callback (Score_element * , Axis);
+  static void set_interface (Score_element*me);
+  static void consider_suicide (Score_element*me);
+  static void add_interesting_item (Score_element * me , Item* n);
 };
 
 
index 6a9b31be68849afe5153751286d24f122d61d21f..f163bf48166dbb3653300f09acb5babacfa9e37c 100644 (file)
@@ -17,17 +17,11 @@ class Multi_measure_rest : public Spanner
 {
 public:
   Multi_measure_rest (SCM);
- static SCM brew_molecule (SCM);
   
-
-  void add_column (Item*);
-  Molecule compound_rest (int)const;
-
-  SCM member_brew_molecule () const;
+  static void set_interface (Score_element*);
+  static SCM brew_molecule (SCM);
+  static  void add_column (Score_element*,Item*);
   VIRTUAL_COPY_CONS (Score_element);
-
-  SCM member_after_line_breaking ();
-  static SCM after_line_breaking (SCM);
   virtual Array<Rod> get_rods () const;
 };
 
index 5ef166a3bac27d386c7ed6a34e3c1c422c24ae08..fe5dc7c68b5160ab4dcbb6decc76a6ec99cf3fff 100644 (file)
@@ -49,7 +49,7 @@ public:
   void add_rod (Paper_column * to, Real distance);
   void add_spring (Paper_column * to, Real dist, Real strength);
 
-  virtual Paper_column * column_l () const;
+  virtual Paper_column *column_l () const;
   virtual Line_of_score *line_l () const;
 
   /// if lines are broken then this column is in #line#
@@ -58,7 +58,7 @@ public:
   /// which  one (left =0)
   int rank_i() const;
 
-  Paper_column (Moment when);
+  Paper_column (SCM);
   Moment when_mom ()const;
 
   bool musical_b () const;
index 3241e2790858df5840580535db41f4fcc6a9a56e..4ce355dd4c26add27d83492a1bd06d88c5fafad5 100644 (file)
@@ -34,7 +34,7 @@ class Spanner : public  Score_element {
 
 public:
   Link_array<Spanner> broken_into_l_arr_;
-
+  Real get_broken_left_end_align () const;
   // TODO: make virtual and do this for Items as well.
   Interval_t<int> spanned_rank_iv ();
   void set_bound (Direction d, Score_element*);
@@ -54,7 +54,7 @@ public:
 protected:
   void set_my_columns ();
   VIRTUAL_COPY_CONS(Score_element);
-  Real get_broken_left_end_align () const;
+
 
   virtual void do_space_processing ();
   virtual void do_break_processing ();
index 2cd904a6320dfd04866d74ba279c8d6224a8d794..344d1f5568b81cd83b39b7171ea208b617b83213 100644 (file)
 #ifndef ABBREV_HH
 #define ABBREV_HH
 
-#include "item.hh"
+#include "lily-proto.hh"
+#include "lily-guile.hh"
 
-
-class Stem_tremolo : public Item {
+class Stem_tremolo
+{
 public:
-  Stem * stem_l () const;
-  SCM member_brew_molecule () const;
-
+  static void set_interface (Score_element*);
   static Interval dim_callback (Score_element*, Axis);
   static SCM brew_molecule (SCM);
-  Stem_tremolo (SCM);
-  void set_stem (Stem *);
+  static void set_stem (Score_element*me, Score_element *st);
 };
 
 #endif /* ABBREV_HH */
index 659b166514e3723c1fc2c45aaff646e1b32d7c49..b5c500c6f70ef809cea94fdda28cd0e883a4a0e2 100644 (file)
@@ -23,8 +23,8 @@ public:
   
   VIRTUAL_COPY_CONS (Score_element);
 
-  virtual SCM member_after_line_breaking ();
   static SCM after_line_breaking (SCM);
+  static void try_collapse (Score_element*);
   
   Molecule staff_bracket (Real) const;
   Molecule staff_brace (Real) const;
index d4ff9f41e7d41986c7f8dc4a4edefe7011301944..c8a7b8bca3d0a1d544e5b147516a5d70ad8b527e 100644 (file)
 class Tie_column : public Spanner
 {
 public:
-  VIRTUAL_COPY_CONS (Score_element);
-  void add_tie (Tie*);
   Tie_column (SCM s);
+  VIRTUAL_COPY_CONS (Score_element);
+  static void set_interface (Score_element*me);
+  static void add_tie (Score_element*me,Tie*);
 
-  SCM member_after_line_breaking ();
   static SCM after_line_breaking (SCM);
-  void set_directions ();
+  static void set_directions (Score_element*me);
 };
 
 #endif /* TIE_COLUMN_HH */
index 92a2b24719eb6b4efe76ae54b1895aff79150de8..347c0be237a9f484fef722f3fb053eb69ef6c759 100644 (file)
@@ -20,29 +20,24 @@ class Tie : public Spanner
 {
 public:
   Tie (SCM);
-  void set_head (Direction, Item*head_l);
+  static void set_head (Score_element*,Direction, Item*head_l);
+  static void set_interface (Score_element*);
   VIRTUAL_COPY_CONS(Score_element);
-
-  Rhythmic_head* head (Direction) const;
-  Real position_f () const;
+  static Rhythmic_head* head (Score_element*,Direction) ;
+  static Real position_f (Score_element*) ;
   static SCM brew_molecule (SCM);
-  Direction get_default_dir() const;
-  SCM member_brew_molecule () const;
-  Array<Offset> get_encompass_offset_arr () const;
-  Bezier get_curve () const;
+  static Direction get_default_dir(Score_element*) ;
+  static SCM after_line_breaking (SCM);
+
 
   /*
     JUNKME
    */
+  Array<Offset> get_encompass_offset_arr () const;
+  Bezier get_curve () const;
   Drul_array<Real> dy_f_drul_;
   Drul_array<Real> dx_f_drul_;
-
-  virtual void do_add_processing ();
-  SCM member_after_line_breaking ();
-  static SCM after_line_breaking (SCM);
-
   virtual Array<Rod> get_rods () const;
-
   Array<Offset> get_controls () const;
 };
 
index 90496b424e674df3809c895fa417941db9fc32f3..73370baea38b97407835514d8f2124c4228d1a60 100644 (file)
@@ -7,7 +7,7 @@
 #ifndef Tuplet_spanner_HH
 #define Tuplet_spanner_HH
 
-#include "spanner.hh"
+#include "lily-guile.hh"
 
 /** supportable plet: triplets, eentweetjes, ottava, etc.
 
 
   todo: handle breaking elegantly.
 */
-class Tuplet_spanner : public Spanner
+class Tuplet_spanner
 {
 public:
-  Tuplet_spanner (SCM);
   static SCM brew_molecule (SCM);
-  
+  static void set_interface (Score_element*);  
 
-  void add_column (Note_column*);
-  void add_beam (Beam*);
+  static void add_column (Score_element*me,Item*);
+  static void add_beam (Score_element*me,Score_element*);
 
-  void calc_dy (Real *) const;
-  void calc_position_and_height (Real*,Real *dy)const;
+  static void calc_dy (Score_element*,Real *) ;
+  static void calc_position_and_height (Score_element*,Real*,Real *dy);
   
-  SCM member_after_line_breaking ();
   static SCM after_line_breaking (SCM);
-  SCM member_brew_molecule () const;
-  VIRTUAL_COPY_CONS(Score_element);
-
 
-  Direction get_default_dir () const;
+  static Direction get_default_dir (Score_element*);
 };
 
 #endif // Tuplet_spanner_HH
index ba28f37e6a10d54b37989db30dd80bc7755190af..c95961909b95977404063238dc4bf7f93fe44bf0 100644 (file)
 
 /** Volta bracket with number */
 
-class Volta_spanner : public Spanner
+class Volta_spanner
 {
 public:
-  Volta_spanner (SCM);
+  static void set_interface (Score_element*);
   static SCM brew_molecule (SCM);
-  void add_column (Note_column*);
-  void add_bar (Bar*);
-  SCM member_brew_molecule () const;
-  VIRTUAL_COPY_CONS (Score_element);
+  static void add_column (Score_element*, Score_element*col);
+  static void add_bar (Score_element*me, Item*bar);
 
-
-  SCM member_after_line_breaking ();
-  static SCM after_line_breaking (SCM);
 };
 
 #endif // VOLTA_SPANNER_HH
index 9fcde99872787e0bb7492586bd5f083da5222c9e..96e4cec5dff519e75e3faf0860d11b704254b7db 100644 (file)
@@ -65,10 +65,10 @@ Local_key_engraver::do_creation_processing ()
 void
 Local_key_engraver::process_acknowledged ()
 {
-  SCM localsig = get_property ("localKeySignature");
-  
   if (!key_item_p_ && mel_l_arr_.size()) 
     {
+      SCM localsig = get_property ("localKeySignature");
+  
       SCM f = get_property ("forgetAccidentals");
       bool forget = to_boolean (f);
       for (int i=0; i  < mel_l_arr_.size(); i++) 
@@ -100,7 +100,7 @@ Local_key_engraver::process_acknowledged ()
                  key_item_p_ = new Local_key_item (get_property ("basicLocalKeyProperties"));
                  Side_position_interface (key_item_p_).set_axis (X_AXIS);
                  Side_position_interface (key_item_p_).set_direction (LEFT);
-                 Staff_symbol_referencer_interface (key_item_p_).set_interface ();
+                 Staff_symbol_referencer_interface::set_interface (key_item_p_);
                         
                  announce_element (Score_element_info (key_item_p_, 0));
                }
@@ -137,13 +137,13 @@ Local_key_engraver::process_acknowledged ()
 #endif
            }
         }
-    }
+
 
   
   
   daddy_trans_l_->set_property ("localKeySignature",  localsig);
+    }
   /*
-    UGH ! 
    */
   
   if (key_item_p_ && grace_align_l_)
@@ -192,12 +192,12 @@ Local_key_engraver::acknowledge_element (Score_element_info info)
     {
       grace_align_l_ = gai;
     }
-  Note_req * note_l =  dynamic_cast <Note_req *> (info.req_l_);
-  Rhythmic_head * note_head = dynamic_cast<Rhythmic_head *> (info.elem_l_);
-
   if (he_gr != selfgr)
     return;
   
+  Note_req * note_l =  dynamic_cast <Note_req *> (info.req_l_);
+  Rhythmic_head * note_head = dynamic_cast<Rhythmic_head *> (info.elem_l_);
+
   if (note_l && note_head)
     {
       mel_l_arr_.push (note_l);
@@ -205,12 +205,12 @@ Local_key_engraver::acknowledge_element (Score_element_info info)
     }
   else if (Tie * tie_l = dynamic_cast<Tie *> (info.elem_l_))
     {
-      tied_l_arr_.push (tie_l->head (RIGHT));
+      tied_l_arr_.push (Tie::head (tie_l, RIGHT));
     }
 }
 
 /*
-  ugh. deep_copy uses lots of space.
+  ugh. repeated deep_copy generates lots of garbage.
  */
 void
 Local_key_engraver::do_process_music()
@@ -227,6 +227,7 @@ Local_key_engraver::do_process_music()
   else if (last_keysig_ != sig) 
     {
       daddy_trans_l_->set_property ("localKeySignature",  ly_deep_copy (sig));
+      last_keysig_ = sig;
     }
 }
 
index 943092d400093c1152ea9c7661775b07e77d10aa..762deb8825bed43931a00b89639ea57684cfd57f 100644 (file)
@@ -57,9 +57,9 @@ Multi_measure_rest_engraver::acknowledge_element (Score_element_info i)
   if (Bar *c = dynamic_cast<Bar*> (i.elem_l_))
     {
       if (mmrest_p_)
-       mmrest_p_->add_column (c);
+       Multi_measure_rest::add_column (mmrest_p_,c);
       if (lastrest_p_)
-       lastrest_p_->add_column (c);
+       Multi_measure_rest::add_column (mmrest_p_,c);
     }
 }
 
@@ -110,8 +110,8 @@ Multi_measure_rest_engraver::do_process_music ()
   if (busy_span_req_l_ && !mmrest_p_)
     {
       mmrest_p_ = new Multi_measure_rest (get_property ("basicMultiMeasureRestProperties"));
-      Staff_symbol_referencer_interface si (mmrest_p_);
-      si.set_interface ();
+      Multi_measure_rest::set_interface (mmrest_p_);
+      Staff_symbol_referencer_interface::set_interface (mmrest_p_);
 
       announce_element (Score_element_info (mmrest_p_, busy_span_req_l_));
       start_measure_i_
index 97d1401c17ae56e16e61396e7f8f8f4a1dde88a5..72b54689930201938d8d199a4ef3b6c501f86aa7 100644 (file)
 #include "group-interface.hh"
 #include "stem.hh"
 #include "staff-symbol-referencer.hh"
-
-Multi_measure_rest::Multi_measure_rest (SCM s)
-  : Spanner (s)
+void
+Multi_measure_rest::set_interface (Score_element*me)
 {
-  set_elt_pointer ("columns", SCM_EOL);
+  me->set_elt_pointer ("columns", SCM_EOL);
 }
 
+Multi_measure_rest::Multi_measure_rest (SCM s)
+  : Spanner(s)
+{}
 
 /*
    [TODO]                                      17
  * variable-sized multi-measure rest symbol: |====| ??
 */
-
-GLUE_SCORE_ELEMENT(Multi_measure_rest,brew_molecule);
-
+MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Multi_measure_rest,brew_molecule);
 SCM
-Multi_measure_rest::member_brew_molecule () const
+Multi_measure_rest::brew_molecule (SCM smob) 
 {
+  Score_element *me = unsmob_element (smob);
+  Spanner * sp = dynamic_cast<Spanner*> (me);
   Real staff_space
-    = Staff_symbol_referencer_interface (this).staff_space ();
+    = Staff_symbol_referencer_interface (me).staff_space ();
 
   Interval sp_iv;
   Direction d = LEFT;
   do
     {
-      Item * col = get_bound (d)->column_l ();
+      Item * col = sp->get_bound (d)->column_l ();
 
       Interval coldim = col->extent (X_AXIS)
        + col->relative_coordinate (0, X_AXIS);
@@ -55,7 +57,7 @@ Multi_measure_rest::member_brew_molecule () const
   Molecule mol;
   Real x_off = 0.0;
 
-  Real rx  = get_bound (LEFT)->relative_coordinate (0, X_AXIS);
+  Real rx  = sp->get_bound (LEFT)->relative_coordinate (0, X_AXIS);
   /*
     we gotta stay clear of sp_iv, so move a bit to the right if
     needed.
@@ -71,14 +73,14 @@ Multi_measure_rest::member_brew_molecule () const
   Molecule s;
 
   int measures = 1;
-  SCM m (get_elt_property ("measure-count"));
+  SCM m (me->get_elt_property ("measure-count"));
   if (gh_number_p (m))
     {
       measures = gh_scm2int (m);
     }
   
 
-  if (measures <= paper_l() ->get_var ("multi_measure_rest_expand_limit"))
+  if (measures <= me->paper_l() ->get_var ("multi_measure_rest_expand_limit"))
     {
       /*
        Build a rest from smaller parts. Distances inbetween are
@@ -105,9 +107,9 @@ Multi_measure_rest::member_brew_molecule () const
            }
 
          Real pad = s.empty_b ()
-           ? 0.0 : paper_l ()->get_var ("multi_measure_rest_padding");
+           ? 0.0 : me->paper_l ()->get_var ("multi_measure_rest_padding");
       
-         Molecule r (lookup_l ()->afm_find ("rests-" + to_str (k)));
+         Molecule r (me->lookup_l ()->afm_find ("rests-" + to_str (k)));
          if (k == 0)
            r.translate_axis (staff_space, Y_AXIS);
          
@@ -120,14 +122,14 @@ Multi_measure_rest::member_brew_molecule () const
   else 
     {
       String idx =  ("rests-") + to_str (-4);
-      s = lookup_l ()->afm_find (idx);
+      s = me->lookup_l ()->afm_find (idx);
     }
   
   mol.add_molecule (s);
 
   if (measures > 1)
     {
-      Molecule s (lookup_l ()->text ("number", to_str (measures), paper_l ()));
+      Molecule s (me->lookup_l ()->text ("number", to_str (measures), me->paper_l ()));
       s.align_to (X_AXIS, CENTER);
       s.translate_axis (3.0 * staff_space, Y_AXIS);
       mol.add_molecule (s);
@@ -139,19 +141,13 @@ Multi_measure_rest::member_brew_molecule () const
 /*
   UGH. JUNKME elt prop "columns" isn't really needed. 
  */
-
-
-
 void
-Multi_measure_rest::add_column (Item* c)
+Multi_measure_rest::add_column (Score_element*me,Item* c)
 {
-  Pointer_group_interface gi (this, "columns");
+  Pointer_group_interface gi (me, "columns");
   gi.add_element (c);
 
-  add_bound_item (this, c);
-  
-  add_dependency (c);
+  add_bound_item (dynamic_cast<Spanner*> (me),c);
 }
 
 
index 72572c389133c552b97745f263ba1bb717edde79..6ed4bf9bb7d157505c87f57180336efad9b58ec7 100644 (file)
@@ -6,7 +6,8 @@
   (c) 1998--2000 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
-#include "repeat-engraver.hh"
+#include "engraver.hh"
+#include "cons.hh"
 #include "bar.hh"
 #include "bar-engraver.hh"
 #include "musical-request.hh"
 #include "note-column.hh"
 #include "paper-def.hh"
 #include "music-list.hh"
+#include "side-position-interface.hh"
+
+struct Bar_create_event
+{
+  Moment when_;
+  bool bar_b_;
+  bool last_b_;
+  String type_;
+  Bar_create_event();
+  Bar_create_event (Moment w, String s);
+  Bar_create_event (Moment w, int i, int j);
+};
+
+int compare (Bar_create_event const & c1, Bar_create_event const &c2)
+{
+  return (c1.when_ - c2.when_).sign();
+}
+
+/**
+  Generate repeat-bars |: :| for repeated-music
+  */
+class Repeat_engraver : public Engraver 
+{
+public:
+  VIRTUAL_COPY_CONS(Translator);
+  Repeat_engraver ();
+protected:
+  virtual void acknowledge_element (Score_element_info i);
+  virtual void do_removal_processing ();
+  virtual bool do_try_music (Music *req_l);
+  virtual void do_process_music();
+  virtual void do_pre_move_processing();
+  virtual void do_post_move_processing ();
+  void queue_events ();
+
+private:
+  Repeated_music *repeated_music_l_;
+  bool done_this_one_b_;
+
+  /*
+    Royal_brackla_create_queue is only two Whiskies away. :-)
+   */
+  Cons<Bar_create_event> *create_barmoments_queue_;
+
+  Spanner * volta_span_p_;
+  Spanner* end_volta_span_p_;
+};
+
+
+
 
 ADD_THIS_TRANSLATOR (Repeat_engraver);
 
@@ -180,7 +231,8 @@ Repeat_engraver::do_process_music ()
          else
            {
              assert (!volta_span_p_);
-             volta_span_p_ = new Volta_spanner (get_property ("basicVoltaSpannerProperties"));
+             volta_span_p_ = new Spanner (get_property ("basicVoltaSpannerProperties"));
+             Volta_spanner::set_interface (volta_span_p_);
              announce_element (Score_element_info (volta_span_p_,0));
              volta_span_p_->set_elt_property ("text",
                                               ly_str02scm (t.ch_C()));
@@ -212,16 +264,16 @@ Repeat_engraver::acknowledge_element (Score_element_info i)
   if (Note_column *c = dynamic_cast<Note_column *> (i.elem_l_))
     {
       if (volta_span_p_)
-       volta_span_p_->add_column (c);
+       Volta_spanner::add_column (volta_span_p_,c);
       if (end_volta_span_p_)
-       end_volta_span_p_->add_column (c);      
+       Volta_spanner::add_column (end_volta_span_p_,c);      
     }
   if (Bar *c = dynamic_cast<Bar*> (i.elem_l_))
     {
       if (volta_span_p_)
-       volta_span_p_->add_bar (c);
+       Volta_spanner::add_bar (volta_span_p_,c);
       if (end_volta_span_p_)
-       end_volta_span_p_ ->add_bar(c);
+       Volta_spanner::add_bar(end_volta_span_p_ , c);
     }
 }
 
@@ -257,6 +309,8 @@ Repeat_engraver::do_pre_move_processing ()
 {
   if (end_volta_span_p_)
     {
+      Side_position_interface (end_volta_span_p_).add_staff_support ();
+      
       typeset_element (end_volta_span_p_ );
       end_volta_span_p_ =0;
     }
index 0deb53ab44b0b2c8a972a4f9cf499dabe584ca84..08b598f1e2c215753903937d7acac5c76715b88d 100644 (file)
@@ -35,7 +35,7 @@ protected:
 private:
   int default_tremolo_type_i_;
   Stem *stem_p_;
-  Stem_tremolo *tremolo_p_;
+  Score_element *tremolo_p_;
   Rhythmic_req *rhythmic_req_l_;
   Tremolo_req* tremolo_req_l_;
 };
@@ -77,8 +77,8 @@ Stem_engraver::acknowledge_element(Score_element_info i)
       if (!stem_p_) 
        {
          stem_p_ = new Stem (get_property ("basicStemProperties"));
-         Staff_symbol_referencer_interface st(stem_p_);
-         st.set_interface ();
+         Staff_symbol_referencer_interface::set_interface(stem_p_);
+
          
          stem_p_->set_elt_property ("duration-log", gh_int2scm (duration_log));
 
@@ -101,7 +101,9 @@ Stem_engraver::acknowledge_element(Score_element_info i)
 
              if (requested_type)
                {
-                 tremolo_p_ = new Stem_tremolo (get_property ("basicStemTremoloProperties"));
+                 tremolo_p_ = new Item (get_property ("basicStemTremoloProperties"));
+                 Stem_tremolo::set_interface (tremolo_p_);
+
                  announce_element (Score_element_info (tremolo_p_, tremolo_req_l_));
                  /*
                    The number of tremolo flags is the number of flags of
@@ -133,7 +135,7 @@ Stem_engraver::do_pre_move_processing()
 {
   if (tremolo_p_)
     {
-      tremolo_p_->set_stem (stem_p_);
+      Stem_tremolo::set_stem (tremolo_p_, stem_p_);
       typeset_element (tremolo_p_);
       tremolo_p_ = 0;
     }
index 0d26fcd52a52604f4db37607d9e9b9f21a673b9c..a2e174f69b793efb0a2ace8d5a8496de8da34f5f 100644 (file)
     lengthen stem if necessary
  */
 
-Stem_tremolo::Stem_tremolo (SCM s)
-  : Item (s)
+void
+Stem_tremolo::set_interface (Score_element *me)
 {
-  set_elt_pointer ("stem", SCM_EOL);
+me->set_elt_pointer ("stem", SCM_EOL);
 }
 
 
-Stem *
-Stem_tremolo::stem_l ()const
-{
-  SCM s =   get_elt_pointer ("stem");
-
-  return dynamic_cast<Stem*> (  unsmob_element (s));
-}
-
 Interval
 Stem_tremolo::dim_callback (Score_element * se, Axis )
 {
-  Stem_tremolo * s = dynamic_cast<Stem_tremolo*> (se);
-  Real space = Staff_symbol_referencer_interface (s->stem_l ())
-    .staff_space ();
+  Real space = Staff_symbol_referencer_interface (se).staff_space ();
   return Interval (-space, space);
 }
 
 
 
-GLUE_SCORE_ELEMENT(Stem_tremolo,brew_molecule);
+MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Stem_tremolo,brew_molecule);
 SCM
-Stem_tremolo::member_brew_molecule () const
+Stem_tremolo::brew_molecule (SCM smob)
 {
-  Stem * stem = stem_l ();
+  Score_element *me= unsmob_element (smob);
+  Stem * stem = dynamic_cast<Stem*> (unsmob_element (me->get_elt_pointer ("stem")));
   Beam * beam = stem->beam_l ();
   
   Real dydx;
@@ -72,16 +63,16 @@ Stem_tremolo::member_brew_molecule () const
     dydx = 0.25;
 
   Real ss = Staff_symbol_referencer_interface (stem).staff_space ();
-  Real thick = gh_scm2double (get_elt_property ("beam-thickness"));
-  Real width = gh_scm2double (get_elt_property ("beam-width"));
+  Real thick = gh_scm2double (me->get_elt_property ("beam-thickness"));
+  Real width = gh_scm2double (me->get_elt_property ("beam-width"));
   width *= ss;
   thick *= ss;
   
-  Molecule a (lookup_l ()->beam (dydx, width, thick));
+  Molecule a (me->lookup_l ()->beam (dydx, width, thick));
   a.translate (Offset (-width/2, width / 2 * dydx));
   
   int tremolo_flags;
-  SCM s = get_elt_property ("tremolo-flags");
+  SCM s = me->get_elt_property ("tremolo-flags");
   if (gh_number_p (s))
     tremolo_flags = gh_scm2int (s);
   else
@@ -89,7 +80,7 @@ Stem_tremolo::member_brew_molecule () const
     tremolo_flags = 1;
 
   int mult = beam ? beam->get_multiplicity () : 0;
-  Real interbeam_f = paper_l ()->interbeam_f (mult);
+  Real interbeam_f = me->paper_l ()->interbeam_f (mult);
   Molecule mol; 
   for (int i = 0; i < tremolo_flags; i++)
     {
@@ -103,7 +94,7 @@ Stem_tremolo::member_brew_molecule () const
     {
       // ugh, rather calc from Stem_tremolo_req
       int beams_i = stem->beam_count(RIGHT) >? stem->beam_count (LEFT);
-      mol.translate (Offset(stem->relative_coordinate (0, X_AXIS) - relative_coordinate (0, X_AXIS),
+      mol.translate (Offset(stem->relative_coordinate (0, X_AXIS) - me->relative_coordinate (0, X_AXIS),
                            stem->stem_end_position () * ss / 2 - 
                            Directional_element_interface (beam).get () * beams_i * interbeam_f));
     }
@@ -125,7 +116,7 @@ Stem_tremolo::member_brew_molecule () const
       else
        whole_note_correction = 0;
         
-      mol.translate (Offset (stem->relative_coordinate (0, X_AXIS) - relative_coordinate (0, X_AXIS) +
+      mol.translate (Offset (stem->relative_coordinate (0, X_AXIS) - me->relative_coordinate (0, X_AXIS) +
                             whole_note_correction, dy));
     }
   
@@ -134,9 +125,8 @@ Stem_tremolo::member_brew_molecule () const
 
 
 void
-Stem_tremolo::set_stem (Stem *s)
+Stem_tremolo::set_stem (Score_element*me,Score_element *s)
 {
-  set_elt_pointer ("stem", s->self_scm_);
-  add_dependency (s);
+  me->set_elt_pointer ("stem", s->self_scm_);
 }
 
index 5be06b334ee7315995f45859eade2c84ffcaa918..051e0a844b3463c798555d61155c25ee2be2125b 100644 (file)
@@ -55,19 +55,28 @@ System_start_delimiter::simple_bar (Real h) const
   return lookup_l ()->filledbox (Box (Interval(0,w), Interval(-h/2, h/2)));
 }
 
-GLUE_SCORE_ELEMENT(System_start_delimiter,after_line_breaking);
+MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(System_start_delimiter,after_line_breaking);
+
 SCM
-System_start_delimiter::member_after_line_breaking ()
+System_start_delimiter::after_line_breaking (SCM smob)
+{
+  try_collapse (unsmob_element (smob));
+  return SCM_UNDEFINED;
+}
+
+void
+System_start_delimiter::try_collapse (Score_element*me)
 {
-  SCM   gl = get_elt_property ("glyph");
+  SCM   gl = me->get_elt_property ("glyph");
   
-  if (scm_ilength (get_elt_pointer ("elements")) <=  1 && gl == ly_symbol2scm ("bar-line"))
+  if (scm_ilength (me->get_elt_pointer ("elements")) <=  1 && gl == ly_symbol2scm ("bar-line"))
     {
-      suicide ();
+      me->suicide ();
     }
-  return SCM_UNDEFINED;
+  
 }
 
+
 MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(System_start_delimiter,brew_molecule);
 
 SCM
index 63e3d2a465e13460b590976671086c9e7daf7aa7..5fccceba2c704865d2acda84d5a60aae32420146 100644 (file)
 Tie_column::Tie_column (SCM s)
   : Spanner (s)
 {
-  set_elt_pointer ("ties", SCM_EOL);
-  set_extent_callback (0, X_AXIS);
-  set_extent_callback (0, Y_AXIS);  
+
+}
+void
+Tie_column::set_interface (Score_element*me)
+{
+ me-> set_elt_pointer ("ties", SCM_EOL);
+  me->set_extent_callback (0, X_AXIS);
+  me->set_extent_callback (0, Y_AXIS);  
 }
 
 void
-Tie_column::add_tie (Tie *s)
+Tie_column::add_tie (Score_element*me,Tie *s)
 {
-  Pointer_group_interface g (this, "ties");
+  Pointer_group_interface g (me, "ties");
   if (!g.count ())
     {
-      set_bound (LEFT, s->head (LEFT));
-      set_bound (RIGHT, s->head (RIGHT));
+      dynamic_cast<Spanner*> (me)->set_bound (LEFT, Tie::head (s,LEFT));
+      dynamic_cast<Spanner*> (me)->set_bound (RIGHT, Tie::head (s,RIGHT));
     }
   
-  Pointer_group_interface (this, "ties").add_element (s);
-  s->add_dependency (this);
+  Pointer_group_interface (me, "ties").add_element (s);
+  s->add_dependency (me);
 }
 
 
@@ -40,7 +45,7 @@ int
 tie_compare (Tie* const & s1,
             Tie* const & s2)
 {
-  return sign (s1->position_f () - s2->position_f());
+  return sign (Tie::position_f (s1) - Tie::position_f(s2));
 }
 
 /*
@@ -51,15 +56,15 @@ tie_compare (Tie* const & s1,
   direction of the rest is determined by their staff position.
 
   Ross forgets about the tie that is *on* the middle staff line. We
-  assume it goes UP. (TODO: make this settable) */
+  assume it goes UP. (TODO: make me settable) */
 void
-Tie_column::set_directions ()
+Tie_column::set_directions (Score_element*me)
 {
   Link_array<Tie> ties =
-    Pointer_group_interface__extract_elements (this, (Tie*)0, "ties");
+    Pointer_group_interface__extract_elements (me, (Tie*)0, "ties");
 
 
-  Direction d = Directional_element_interface (this).get ();
+  Direction d = Directional_element_interface (me).get ();
 
   if (d)
     {
@@ -74,7 +79,7 @@ Tie_column::set_directions ()
   if (ties.size () == 1)
     {
       Tie * t = ties[0];      
-      Directional_element_interface (t).set (t->get_default_dir ());
+      Directional_element_interface (t).set (Tie::get_default_dir (t));
       return;
     }
   
@@ -89,7 +94,7 @@ Tie_column::set_directions ()
   for (int i=ties.size(); i--; )
     {
       Tie * t = ties[i];
-      Real p = t->position_f ();
+      Real p = Tie::position_f (t);
       Direction d = (Direction) sign (p);
       if (!d)
        d = UP;
@@ -98,10 +103,10 @@ Tie_column::set_directions ()
   
 }
 
-GLUE_SCORE_ELEMENT(Tie_column,after_line_breaking);
+MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Tie_column,after_line_breaking);
 SCM
-Tie_column::member_after_line_breaking ()
+Tie_column::after_line_breaking (SCM smob)
 {
-  set_directions ();
+  set_directions (unsmob_element (smob));
   return SCM_UNDEFINED;
 }
index 020779e4827586206e986ea58c96dcfecd6e7271..59a05f4c507822693eda44699da9a725bbcc2403 100644 (file)
@@ -59,7 +59,7 @@ protected:
   virtual bool do_try_music (Music*);
   virtual void do_process_music ();
   virtual void process_acknowledged ();
-
+  void typeset_tie (Score_element*);
 public:
   VIRTUAL_COPY_CONS(Translator);
   Tie_engraver();
@@ -174,8 +174,8 @@ Tie_engraver::process_acknowledged ()
          SCM pair = gh_list_ref (head_list, gh_int2scm (i/2));
          
          Tie * p = new Tie (basic);
-         p->set_head (LEFT, dynamic_cast<Item*> (unsmob_element (gh_car (pair))));
-         p->set_head (RIGHT, dynamic_cast<Item*> (unsmob_element (gh_cdr (pair))));
+         Tie::set_head (p,LEFT, dynamic_cast<Item*> (unsmob_element (gh_car (pair))));
+         Tie::set_head (p,RIGHT, dynamic_cast<Item*> (unsmob_element (gh_cdr (pair))));
          
          tie_p_arr_.push (p);
          announce_element (Score_element_info (p, req_l_));
@@ -183,8 +183,10 @@ Tie_engraver::process_acknowledged ()
       else for (SCM s = head_list; gh_pair_p (s); s = gh_cdr (s))
        {
          Tie * p = new Tie (basic);
-         p->set_head (LEFT, dynamic_cast<Item*> (unsmob_element (gh_caar (s))));
-         p->set_head (RIGHT, dynamic_cast<Item*> (unsmob_element (gh_cdar (s))));
+         Tie::set_interface (p);
+         
+         Tie::set_head (p, LEFT, dynamic_cast<Item*> (unsmob_element (gh_caar (s))));
+         Tie::set_head (p, RIGHT, dynamic_cast<Item*> (unsmob_element (gh_cdar (s))));
          
          tie_p_arr_.push (p);
          announce_element (Score_element_info (p, req_l_));
@@ -197,8 +199,9 @@ Tie_engraver::process_acknowledged ()
       else if (tie_p_arr_.size () > 1 && !tie_column_p_)
        {
          tie_column_p_ = new Tie_column (get_property ("basicTieColumnProperties"));
+         Tie_column::set_interface (tie_column_p_);
          for (int i = tie_p_arr_.size (); i--; )
-           tie_column_p_->add_tie (tie_p_arr_ [i]);
+           Tie_column::add_tie (tie_column_p_,tie_p_arr_ [i]);
          announce_element (Score_element_info (tie_column_p_, 0));
        }
     }
@@ -216,16 +219,37 @@ Tie_engraver::do_pre_move_processing ()
 
   for (int i=0; i<  tie_p_arr_.size (); i++)
    {
-      typeset_element (tie_p_arr_[i]);
+      typeset_tie (tie_p_arr_[i]);
     }
   tie_p_arr_.clear ();
   if (tie_column_p_)
     {
-      typeset_element (tie_column_p_);
+      typeset_tie (tie_column_p_);
       tie_column_p_ =0;
     }
 }
 
+void
+Tie_engraver::typeset_tie (Score_element *her)
+{
+    if (!(Tie::head (her,LEFT) && Tie::head (her,RIGHT)))
+    warning (_ ("lonely tie"));
+
+  Direction d = LEFT;
+  Drul_array<Item *> new_head_drul;
+  new_head_drul[LEFT] = Tie::head(her,LEFT);
+  new_head_drul[RIGHT] = Tie::head (her,RIGHT);  
+  do {
+    if (!Tie::head (her,d))
+      new_head_drul[d] = Tie::head(her,(Direction)-d);
+  } while (flip(&d) != LEFT);
+
+  index_set_cell (her->get_elt_pointer ("heads"), LEFT, new_head_drul[LEFT]->self_scm_ );
+  index_set_cell (her->get_elt_pointer ("heads"), RIGHT, new_head_drul[RIGHT]->self_scm_ );
+
+  typeset_element (her);
+}
+
 void
 Tie_engraver::do_post_move_processing ()
 {
index e777a74fba696cb586a6b4580f07bba0732ab92c..7a2a81ef87b4b82118515356abf98c2e667d25ca 100644 (file)
 #include "stem.hh"
 
 void
-Tie::set_head (Direction d, Item * head_l)
+Tie::set_head (Score_element*me,Direction d, Item * head_l)
 {
-  assert (!head (d));
-  index_set_cell (get_elt_pointer ("heads"), d, head_l->self_scm_);
+  assert (!head (me,d));
+  index_set_cell (me->get_elt_pointer ("heads"), d, head_l->self_scm_);
   
-  set_bound (d, head_l);
-  add_dependency (head_l);
+  dynamic_cast<Spanner*> (me)->set_bound (d, head_l);
+  me->add_dependency (head_l);
 }
 
 Tie::Tie(SCM s)
   : Spanner (s)
 {
-  set_elt_pointer ("heads", gh_cons (SCM_EOL, SCM_EOL));
   dy_f_drul_[LEFT] = dy_f_drul_[RIGHT] = 0.0;
   dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
-
+}
+void
+Tie::set_interface (Score_element*me)
+{
+  me->set_elt_pointer ("heads", gh_cons (SCM_EOL, SCM_EOL));
 }
 
 Rhythmic_head* 
-Tie::head (Direction d) const
+Tie::head (Score_element*me, Direction d) 
 {
-  SCM c = get_elt_pointer ("heads");
+  SCM c = me->get_elt_pointer ("heads");
   c = index_cell (c, d);
 
   return dynamic_cast<Rhythmic_head*> (unsmob_element (c));  
 }
 
 Real
-Tie::position_f () const
+Tie::position_f (Score_element*me) 
 {
-  return head (LEFT)
-    ? Staff_symbol_referencer_interface (head (LEFT)).position_f ()
-    : Staff_symbol_referencer_interface (head (RIGHT)).position_f () ;  
+  return head (me,LEFT)
+    ? Staff_symbol_referencer_interface (head (me,LEFT)).position_f ()
+    : Staff_symbol_referencer_interface (head (me,RIGHT)).position_f () ;  
 }
 
 
@@ -61,10 +64,10 @@ Tie::position_f () const
   ugh: direction of the Tie is more complicated.  See [Ross] p136 and further
  */
 Direction
-Tie::get_default_dir () const
+Tie::get_default_dir (Score_element*me) 
 {
-  Stem * sl =  head(LEFT) ? head (LEFT)->stem_l () :0;
-  Stem * sr =  head(RIGHT) ? head (RIGHT)->stem_l () :0;  
+  Stem * sl =  head(me,LEFT) ? head (me,LEFT)->stem_l () :0;
+  Stem * sr =  head(me,RIGHT) ? head (me,RIGHT)->stem_l () :0;  
 
   if (sl && Directional_element_interface (sl).get () == UP
       && sr && Directional_element_interface (sr).get () == UP)
@@ -73,47 +76,28 @@ Tie::get_default_dir () const
     return UP;
 }
 
-/*
-  fixme  must  use spanned drul from heads elt property
- */
 
-void
-Tie::do_add_processing()
-{
-  if (!(head (LEFT) && head (RIGHT)))
-    warning (_ ("lonely tie"));
-
-  Direction d = LEFT;
-  Drul_array<Rhythmic_head *> new_head_drul;
-  new_head_drul[LEFT] = head(LEFT);
-  new_head_drul[RIGHT] = head(RIGHT);  
-  do {
-    if (!head (d))
-      new_head_drul[d] = head((Direction)-d);
-  } while (flip(&d) != LEFT);
-
-  index_set_cell (get_elt_pointer ("heads"), LEFT, new_head_drul[LEFT]->self_scm_ );
-  index_set_cell (get_elt_pointer ("heads"), RIGHT, new_head_drul[RIGHT]->self_scm_ );
-}
 
-GLUE_SCORE_ELEMENT(Tie,after_line_breaking);
+MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Tie,after_line_breaking);
 SCM
-Tie::member_after_line_breaking ()
+Tie::after_line_breaking (SCM smob)
 {
-  if (!head (LEFT) && !head (RIGHT))
+  Tie*me = dynamic_cast<Tie*> (unsmob_element (smob));
+  
+  if (!head (me,LEFT) && !head (me,RIGHT))
     {
       programming_error ("Tie without heads.");
-      suicide ();
+      me->suicide ();
       return SCM_UNDEFINED;
     }
 
-  if (!Directional_element_interface (this).get ())
-    Directional_element_interface (this).set (get_default_dir ());
+  if (!Directional_element_interface (me).get ())
+    Directional_element_interface (me).set (Tie::get_default_dir (me));
   
-  Real staff_space = Staff_symbol_referencer_interface (this).staff_space ();
+  Real staff_space = Staff_symbol_referencer_interface (me).staff_space ();
   Real half_space = staff_space / 2;
-  Real x_gap_f = paper_l ()->get_var ("tie_x_gap");
-  Real y_gap_f = paper_l ()->get_var ("tie_y_gap");
+  Real x_gap_f = me->paper_l ()->get_var ("tie_x_gap");
+  Real y_gap_f = me->paper_l ()->get_var ("tie_y_gap");
 
   /* 
    Slur and tie placement [OSU]
@@ -126,18 +110,18 @@ Tie::member_after_line_breaking ()
 
 
   /*
-    OSU: not different for outer notes, so why all this code?
-    ie,  can we drop this, or should it be made switchable.
+    OSU: not different for outer notes, so why all me code?
+    ie,  can we drop me, or should it be made switchable.
    */
-  if (head (LEFT))
-    dx_f_drul_[LEFT] = head (LEFT)->extent (X_AXIS).length ();
+  if (head (me,LEFT))
+    me->dx_f_drul_[LEFT] = Tie::head (me,LEFT)->extent (X_AXIS).length ();
   else
-    dx_f_drul_[LEFT] = get_broken_left_end_align ();
-  dx_f_drul_[LEFT] += x_gap_f;
-  dx_f_drul_[RIGHT] -= x_gap_f;
+    me->dx_f_drul_[LEFT] = dynamic_cast<Spanner*>(me)->get_broken_left_end_align ();
+  me->dx_f_drul_[LEFT] += x_gap_f;
+  me->dx_f_drul_[RIGHT] -= x_gap_f;
 
   /* 
-   Slur and tie placement [OSU]  -- check this
+   Slur and tie placement [OSU]  -- check me
 
    Ties:
 
@@ -152,14 +136,14 @@ Tie::member_after_line_breaking ()
    */
 
 
-  Real ypos = position_f ();
+  Real ypos = Tie::position_f (me);
 
   Real y_f = half_space * ypos; 
   int ypos_i = int (ypos);
  
-  Real dx_f = extent (X_AXIS).length () + dx_f_drul_[RIGHT] - dx_f_drul_[LEFT];
-  Direction dir = Directional_element_interface (this).get();
-  if (dx_f < paper_l ()->get_var ("tie_staffspace_length"))
+  Real dx_f = me->extent (X_AXIS).length () + me->dx_f_drul_[RIGHT] - me->dx_f_drul_[LEFT];
+  Direction dir = Directional_element_interface (me).get();
+  if (dx_f < me->paper_l ()->get_var ("tie_staffspace_length"))
     {
       if (abs (ypos_i) % 2)
        y_f += dir * half_space;
@@ -173,7 +157,7 @@ Tie::member_after_line_breaking ()
       y_f -= dir * y_gap_f;
     }
   
-  dy_f_drul_[LEFT] = dy_f_drul_[RIGHT] = y_f;
+  me->dy_f_drul_[LEFT] = me->dy_f_drul_[RIGHT] = y_f;
 
   return SCM_UNDEFINED;
 }
@@ -194,20 +178,21 @@ Tie::get_rods () const
   return a;
 }
 
-GLUE_SCORE_ELEMENT(Tie,brew_molecule);
+MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Tie,brew_molecule);
 
 SCM
-Tie::member_brew_molecule () const
+Tie::brew_molecule (SCM smob) 
 {
-  Real thick = paper_l ()->get_var ("tie_thickness");
-  Bezier one = get_curve ();
+  Score_element*me = unsmob_element (smob);
+  Real thick = me->paper_l ()->get_var ("tie_thickness");
+  Bezier one = dynamic_cast<Tie*> (me)->get_curve ();
 
   Molecule a;
-  SCM d =  get_elt_property ("dashed");
+  SCM d =  me->get_elt_property ("dashed");
   if (gh_number_p (d))
-    a = lookup_l ()->dashed_slur (one, thick, gh_scm2int (d));
+    a = me->lookup_l ()->dashed_slur (one, thick, gh_scm2int (d));
   else
-    a = lookup_l ()->slur (one, Directional_element_interface (this).get () * thick, thick);
+    a = me->lookup_l ()->slur (one, Directional_element_interface (me).get () * thick, thick);
   
   return a.create_scheme(); 
 }
@@ -217,17 +202,18 @@ Tie::member_brew_molecule () const
 Bezier
 Tie::get_curve () const
 {
-  Direction d (Directional_element_interface (this).get ());
+  Score_element*me = (Score_element*)this;
+  Direction d (Directional_element_interface (me).get ());
   Bezier_bow b (get_encompass_offset_arr (), d);
 
-  Real staff_space = Staff_symbol_referencer_interface (this).staff_space ();
+  Real staff_space = Staff_symbol_referencer_interface (me).staff_space ();
   Real h_inf = paper_l ()->get_var ("tie_height_limit_factor") * staff_space;
   Real r_0 = paper_l ()->get_var ("tie_ratio");
 
   b.set_default_bezier (h_inf, r_0);
   Bezier c = b.get_bezier ();
 
-  /* should do this for slurs as well. */
+  /* should do me for slurs as well. */
   Array<Real> horizontal (c.solve_derivative (Offset (1,0)));
 
   if (horizontal.size ())
index 355cb64c09bfd8810c8238a4a77e8e9ecef325e0..071e55e03bf5e49f5b87f5acf719581eb1cdeac1 100644 (file)
@@ -29,7 +29,7 @@ protected:
   Array<Moment> span_stop_moments_;
   
   /// The spanners. Array order is synced with time_scaled_music_arr_
-  Link_array<Tuplet_spanner> started_span_p_arr_;
+  Link_array<Spanner> started_span_p_arr_;
 
   virtual void do_removal_processing ();
   virtual void acknowledge_element (Score_element_info);
@@ -73,7 +73,8 @@ Tuplet_engraver::do_process_music ()
       if (i < started_span_p_arr_.size () && started_span_p_arr_[i])
        continue;
 
-      Tuplet_spanner* glep = new Tuplet_spanner (get_property ("basicTupletSpannerProperties"));
+      Spanner* glep = new Spanner (get_property ("basicTupletSpannerProperties"));
+      Tuplet_spanner::set_interface (glep);
       if (i >= started_span_p_arr_.size ())
        started_span_p_arr_.push (glep);
       else
@@ -99,13 +100,13 @@ Tuplet_engraver::acknowledge_element (Score_element_info i)
     {
       for (int j =0; j  <started_span_p_arr_.size (); j++)
        if (started_span_p_arr_[j]) 
-         started_span_p_arr_[j]->add_column (nc);
+         Tuplet_spanner::add_column (started_span_p_arr_[j],nc);
     }
   else if (Beam *b = dynamic_cast<Beam *> (i.elem_l_))
     {
       for (int j = 0; j < started_span_p_arr_.size (); j++)
        if (started_span_p_arr_[j]) 
-         started_span_p_arr_[j]->add_beam (b);
+         Tuplet_spanner::add_beam (started_span_p_arr_[j],b);
     }
 }
 
index 3acb6c68f3432e037cbd3e392e453a5265f98595..00760818d7cfdb8da262fd466dc98ed9a8ecbc48 100644 (file)
 #include "directional-element-interface.hh"
 
 
-Tuplet_spanner::Tuplet_spanner (SCM s)
-  : Spanner (s)
-{
-  set_elt_pointer ("beams", SCM_EOL);
-  set_elt_pointer ("columns", SCM_EOL);
 
-  // ugh.
-  set_elt_property ("delta-y", gh_int2scm (0));
+void
+Tuplet_spanner::set_interface (Score_element*me)
+{
+  me-> set_elt_pointer ("beams", SCM_EOL);
+  me->set_elt_pointer ("columns", SCM_EOL);
 }
 
 /*
   TODO. 
  */
 
-GLUE_SCORE_ELEMENT(Tuplet_spanner,brew_molecule);
+MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Tuplet_spanner,brew_molecule);
+
 SCM
-Tuplet_spanner::member_brew_molecule () const
+Tuplet_spanner::brew_molecule (SCM smob) 
 {
+  Score_element *me= unsmob_element (smob);
   Molecule  mol;
 
   // Default behaviour: number always, bracket when no beam!
-  bool par_beam = to_boolean (get_elt_property ("parallel-beam"));
+  bool par_beam = to_boolean (me->get_elt_property ("parallel-beam"));
   bool bracket_visibility = !par_beam;
   bool number_visibility = true;
 
-  SCM bracket = get_elt_property ("tuplet-bracket-visibility");
+  SCM bracket = me->get_elt_property ("tuplet-bracket-visibility");
   if (gh_boolean_p (bracket))
     {
       bracket_visibility = gh_scm2bool (bracket);
@@ -55,7 +55,7 @@ Tuplet_spanner::member_brew_molecule () const
   else if (bracket == ly_symbol2scm ("if-no-beam"))
     bracket_visibility = !par_beam;
 
-  SCM numb = get_elt_property ("tuplet-number-visibility");  
+  SCM numb = me->get_elt_property ("tuplet-number-visibility");  
   if (gh_boolean_p (numb))
     {
       number_visibility = gh_scm2bool (numb);
@@ -63,24 +63,23 @@ Tuplet_spanner::member_brew_molecule () const
   else if (bracket == ly_symbol2scm ("if-no-beam"))
     number_visibility = !par_beam;
   
-  if (gh_pair_p (get_elt_pointer ("columns")))
+  if (gh_pair_p (me->get_elt_pointer ("columns")))
     {
       Link_array<Note_column> column_arr=
-       Pointer_group_interface__extract_elements (this, (Note_column*)0, "columns");
+       Pointer_group_interface__extract_elements (me, (Note_column*)0, "columns");
        
       Real ncw = column_arr.top ()->extent(X_AXIS).length ();
-      Real w = spanner_length () + ncw;
+      Real w = dynamic_cast<Spanner*>(me)->spanner_length () + ncw;
 
-
-      Real staff_space = paper_l ()->get_var ("interline");
-      Direction dir = Directional_element_interface (this).get ();
-      Real dy = gh_scm2double (get_elt_property ("delta-y"));
-      SCM number = get_elt_property ("text");
+      Real staff_space = me->paper_l ()->get_var ("interline");
+      Direction dir = Directional_element_interface (me).get ();
+      Real dy = gh_scm2double (me->get_elt_property ("delta-y"));
+      SCM number = me->get_elt_property ("text");
       if (gh_string_p (number) && number_visibility)
        {
          Molecule
-           num (lookup_l ()->text ("italic",
-                                   ly_scm2string (number), paper_l ()));
+           num (me->lookup_l ()->text ("italic",
+                                   ly_scm2string (number), me->paper_l ()));
          num.align_to (X_AXIS, CENTER);
          num.translate_axis (w/2, X_AXIS);
          num.align_to (Y_AXIS, CENTER);
@@ -93,11 +92,11 @@ Tuplet_spanner::member_brew_molecule () const
       
       if (bracket_visibility)      
        {
-         SCM ss = paper_l ()->get_scmvar ("staffspace");
-         SCM lt =  paper_l ()->get_scmvar ("stafflinethickness");
+         SCM ss = me->paper_l ()->get_scmvar ("staffspace");
+         SCM lt =  me->paper_l ()->get_scmvar ("stafflinethickness");
          
-         SCM thick = get_elt_property ("thick");
-         SCM gap = get_elt_property ("number-gap");
+         SCM thick = me->get_elt_property ("thick");
+         SCM gap = me->get_elt_property ("number-gap");
          
          SCM at =gh_list(ly_symbol2scm ("tuplet"),
                          ss,
@@ -122,15 +121,15 @@ Tuplet_spanner::member_brew_molecule () const
   use first -> last note for slope, and then correct for disturbing
   notes in between.  */
 void
-Tuplet_spanner::calc_position_and_height (Real *offset, Real * dy) const
+Tuplet_spanner::calc_position_and_height (Score_element*me,Real *offset, Real * dy) 
 {
   Link_array<Note_column> column_arr=
-    Pointer_group_interface__extract_elements (this, (Note_column*)0, "columns");
+    Pointer_group_interface__extract_elements (me, (Note_column*)0, "columns");
 
 
-  Score_element * common = common_refpoint (get_elt_pointer ("columns"), Y_AXIS);
+  Score_element * common = me->common_refpoint (me->get_elt_pointer ("columns"), Y_AXIS);
   
-  Direction d = Directional_element_interface (this).get ();
+  Direction d = Directional_element_interface (me).get ();
 
   /*
     Use outer non-rest columns to determine slope
@@ -179,64 +178,67 @@ Tuplet_spanner::calc_position_and_height (Real *offset, Real * dy) const
   use first -> last note for slope,
 */
 void
-Tuplet_spanner::calc_dy (Real * dy) const
+Tuplet_spanner::calc_dy (Score_element*me,Real * dy)
 {
   Link_array<Note_column> column_arr=
-    Pointer_group_interface__extract_elements (this, (Note_column*)0, "columns");
+    Pointer_group_interface__extract_elements (me, (Note_column*)0, "columns");
 
  
-  Direction d = Directional_element_interface (this).get ();
+  Direction d = Directional_element_interface (me).get ();
   *dy = column_arr.top ()->extent (Y_AXIS) [d]
     - column_arr[0]->extent (Y_AXIS) [d];
 }
+MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Tuplet_spanner,after_line_breaking);
 
-GLUE_SCORE_ELEMENT(Tuplet_spanner,after_line_breaking);
 SCM
-Tuplet_spanner::member_after_line_breaking ()
+Tuplet_spanner::after_line_breaking (SCM smob)
 {
+  Score_element * me = unsmob_element (smob);
   Link_array<Note_column> column_arr=
-    Pointer_group_interface__extract_elements (this, (Note_column*)0, "columns");
+    Pointer_group_interface__extract_elements (me, (Note_column*)0, "columns");
+  Spanner *sp = dynamic_cast<Spanner*> (me);
+
 
   if (!column_arr.size ())
     {
-      suicide ();
+      me->suicide ();
       return SCM_UNDEFINED;
     }
 
-  Direction d = Directional_element_interface (this).get ();
+  Direction d = Directional_element_interface (me).get ();
   if (!d)
     {
-      d = get_default_dir ();
-      Directional_element_interface (this).set (d);
+      d = Tuplet_spanner::get_default_dir (me);
+      Directional_element_interface (me).set (d);
 
     }
   Real dy, offset;
 
-  calc_position_and_height  (&offset,&dy);
+  calc_position_and_height (me,&offset,&dy);
   
-  set_elt_property ("delta-y", gh_double2scm (dy));
+  me->set_elt_property ("delta-y", gh_double2scm (dy));
 
-  translate_axis (offset, Y_AXIS);
+  me->translate_axis (offset, Y_AXIS);
   
-  if (scm_ilength (get_elt_pointer ("beams")) == 1)
+  if (scm_ilength (me->get_elt_pointer ("beams")) == 1)
     {
-      SCM bs = get_elt_pointer ("beams");
+      SCM bs = me->get_elt_pointer ("beams");
       Score_element *b = unsmob_element (gh_car (bs));
       Beam * beam_l = dynamic_cast<Beam*> (b);
-      if (!broken_b () 
-         && get_bound (LEFT)->column_l () == beam_l->get_bound (LEFT)->column_l ()
-         && get_bound (RIGHT)->column_l () == beam_l->get_bound (RIGHT)->column_l ())
-       set_elt_property ("parallel-beam", SCM_BOOL_T);
+      if (!sp->broken_b () 
+         && sp->get_bound (LEFT)->column_l () == beam_l->get_bound (LEFT)->column_l ()
+         && sp->get_bound (RIGHT)->column_l () == beam_l->get_bound (RIGHT)->column_l ())
+       me->set_elt_property ("parallel-beam", SCM_BOOL_T);
     }
   return SCM_UNDEFINED;
 }
 
 
 Direction
-Tuplet_spanner::get_default_dir () const
+Tuplet_spanner::get_default_dir (Score_element*me)
 {
   Direction d = UP;
-  SCM dir_sym =get_elt_property ("dir-forced");
+  SCM dir_sym =me->get_elt_property ("dir-forced");
   if (isdir_b (dir_sym))
     {
       d= to_dir (dir_sym);
@@ -245,7 +247,7 @@ Tuplet_spanner::get_default_dir () const
     }
 
   d = UP ;
-  for (SCM s = get_elt_pointer ("columns"); gh_pair_p (s); s = gh_cdr (s))
+  for (SCM s = me->get_elt_pointer ("columns"); gh_pair_p (s); s = gh_cdr (s))
     {
       Score_element * sc = unsmob_element (gh_car (s));
       Note_column * nc = dynamic_cast<Note_column*> (sc);
@@ -260,22 +262,21 @@ Tuplet_spanner::get_default_dir () const
 }
 
 void
-Tuplet_spanner::add_beam (Beam *b)
+Tuplet_spanner::add_beam (Score_element*me, Score_element *b)
 {
-  add_dependency (b);
-  Pointer_group_interface gi (this, "beams");
+me->add_dependency (b);
+  Pointer_group_interface gi (me, "beams");
   gi.add_element (b);
 }
 
 void
-Tuplet_spanner::add_column (Note_column*n)
+Tuplet_spanner::add_column (Score_element*me, Item*n)
 {
-  Pointer_group_interface gi (this, "columns");
+  Pointer_group_interface gi (me, "columns");
   gi.add_element (n);
+  me->add_dependency (n);
 
-  add_dependency (n);
-
-  add_bound_item (this, n);
+  add_bound_item (dynamic_cast<Spanner*> (me), n);
 }
 
 
index 6e99afdb84463b06c135632dd5557904b9110326..fa986542eb9c727925b439151af211440d34e2d3 100644 (file)
 #include "debug.hh"
 #include "lookup.hh"
 #include "molecule.hh"
-#include "note-column.hh"
 #include "paper-column.hh"
 #include "bar.hh"
 #include "paper-def.hh"
 #include "volta-spanner.hh"
-#include "stem.hh"
-#include "dimension-cache.hh"
 #include "group-interface.hh"
 #include "side-position-interface.hh"
 #include "directional-element-interface.hh"
 
-Volta_spanner::Volta_spanner (SCM s)
-  : Spanner (s)
+
+void
+Volta_spanner::set_interface (Score_element*me)
 {
-  set_elt_pointer ("bars", SCM_EOL);
-  Side_position_interface (this).set_axis (Y_AXIS);
-  Directional_element_interface (this).set (UP);
+  me->set_elt_pointer ("bars", SCM_EOL);
+  Side_position_interface (me).set_axis (Y_AXIS);
+  Directional_element_interface (me).set (UP);
 }
 
 
 /*
-  this is too complicated. Yet another version of side-positioning,
+  me is too complicated. Yet another version of side-positioning,
   badly implemented.
 
   --
@@ -42,37 +40,37 @@ Volta_spanner::Volta_spanner (SCM s)
   
 */
 
-GLUE_SCORE_ELEMENT(Volta_spanner,brew_molecule);
+MAKE_SCHEME_SCORE_ELEMENT_CALLBACK(Volta_spanner,brew_molecule);
 SCM
-Volta_spanner::member_brew_molecule () const
+Volta_spanner::brew_molecule (SCM smob) 
 {
-  
+  Score_element *me = unsmob_element (smob);
   Link_array<Bar> bar_arr
-    = Pointer_group_interface__extract_elements (this, (Bar*)0, "bars");
+    = Pointer_group_interface__extract_elements (me, (Bar*)0, "bars");
 
   if (!bar_arr.size ())
     return SCM_EOL;
 
   bool no_vertical_start = false;
-  bool no_vertical_end = to_boolean (get_elt_property ("last-volta"));
-  Spanner *orig_span =  dynamic_cast<Spanner*> (original_l_);
-  if (orig_span && (orig_span->broken_into_l_arr_[0] != (Spanner*)this))
+  bool no_vertical_end = to_boolean (me->get_elt_property ("last-volta"));
+  Spanner *orig_span =  dynamic_cast<Spanner*> (me->original_l_);
+  if (orig_span && (orig_span->broken_into_l_arr_[0] != (Spanner*)me))
     no_vertical_start = true;
-  if (orig_span && (orig_span->broken_into_l_arr_.top () != (Spanner*)this))
+  if (orig_span && (orig_span->broken_into_l_arr_.top () != (Spanner*)me))
     no_vertical_end = true;
 
 #if 0
   // FIXME
-  if (bar_arr.top ()->get_elt_property (type_str_.length_i () > 1)
+  if (bar_arr.top ()->me->get_elt_property (type_str_.length_i () > 1)
     no_vertical_end = false;
 #endif
 
-  Real staff_space = paper_l ()->get_var ("interline");
+  Real staff_space = me->paper_l ()->get_var ("interline");
   Real half_space = staff_space / 2;
-  Real left = get_broken_left_end_align ();
-  Real w = spanner_length () - left - half_space;
-  Real h = paper_l()->get_var ("volta_spanner_height");
-  Real t = paper_l ()->get_var ("volta_thick");
+  Real left = dynamic_cast<Spanner*>(me)->get_broken_left_end_align ();
+  Real w = dynamic_cast<Spanner*>(me)->spanner_length () - left - half_space;
+  Real h = me->paper_l()->get_var ("volta_spanner_height");
+  Real t = me->paper_l ()->get_var ("volta_thick");
 
   SCM at = (gh_list (ly_symbol2scm ("volta"),
                     gh_double2scm (h),
@@ -84,9 +82,9 @@ Volta_spanner::member_brew_molecule () const
 
   Box b (Interval (0, w), Interval (0, h));
   Molecule  mol (b, at);
-  Molecule num (lookup_l ()->text ("volta",
-                                  ly_scm2string (get_elt_property("text")),
-                                  paper_l ()));
+  Molecule num (me->lookup_l ()->text ("volta",
+                                      ly_scm2string (me->get_elt_property("text")),
+                                      me->paper_l ()));
 
   mol.add_at_edge (X_AXIS, LEFT, num, - num.extent (X_AXIS).length ()
                   - staff_space);
@@ -95,29 +93,18 @@ Volta_spanner::member_brew_molecule () const
 }
 
 
-GLUE_SCORE_ELEMENT(Volta_spanner,after_line_breaking);
-SCM
-Volta_spanner::member_after_line_breaking ()
-{
-  Side_position_interface (this).add_staff_support ();
-  return SCM_UNDEFINED;
-}
-  
 void
-Volta_spanner::add_bar  (Bar* b)
+Volta_spanner::add_bar  (Score_element *me, Item* b)
 {
-  Pointer_group_interface gi(this, "bars");
+  Pointer_group_interface gi(me, "bars");
   gi.add_element (b);
 
-  Side_position_interface (this).add_support (b);
-  add_dependency (b);
-
-  add_bound_item (this, b); 
+  Side_position_interface (me).add_support (b);
+  add_bound_item (dynamic_cast<Spanner*>(me), b); 
 }
 
 void
-Volta_spanner::add_column (Note_column* c)
+Volta_spanner::add_column (Score_element*me, Score_element* c)
 {
-  Side_position_interface (this).add_support (c);
-  add_dependency (c);
+  Side_position_interface (me).add_support (c);
 }
index cb548ddceda9acc52fdd25df12dfb01dbfae882f..adac158aac5e9f3b4901c368b5cd40b8f8e4e220 100644 (file)
@@ -414,6 +414,7 @@ ScoreContext = \translator {
                (thin-kern . 3.0)
                (hair-thickness . 1.6)
                (thick-thickness . 6.0)
+               (bar-interface . #t)
        )
 
        basicBarNumberProperties = #`(
@@ -437,11 +438,9 @@ ScoreContext = \translator {
        
        basicBreathingSignProperties = #`(
                (break-align-symbol . Breathing_sign)
-               (after-line-breaking-callback . ,Breathing_sign::after_line_breaking)
                (breakable . #t )
                (molecule-callback . ,Breathing_sign::brew_molecule)
                (visibility-lambda . ,begin-of-line-invisible)
-
        )
         basicClefItemProperties = #`(
           (molecule-callback . ,Score_element::brew_molecule)
@@ -488,7 +487,8 @@ ScoreContext = \translator {
                (before-line-breaking-callback . ,Grace_align_item::before_line_breaking)
        )
        basicHaraKiriVerticalGroupspannerProperties = #`(
-               (after-line-breaking-callback . ,Hara_kiri_group_spanner::after_line_breaking)
+               (hara-kiri-interface . #t)
+               (axes 1)
        )
        basicHyphenSpannerProperties = #`(
                (thickness . 1.0)
@@ -498,6 +498,7 @@ ScoreContext = \translator {
        )
        basicKeyProperties = #`(
          (molecule-callback . ,Key_item::brew_molecule)
+         (key-item-interface . #t)
          (break-align-symbol . Key_item)
          (visibility-lambda . ,begin-of-line-visible)
          (breakable . #t)
@@ -506,6 +507,7 @@ ScoreContext = \translator {
                (molecule-callback . ,Local_key_item::brew_molecule)
                (left-padding . 0.2)
                (right-padding . 0.4)
+               (accidentals-interface . #t)
        )
        basicLyricExtenderProperties = #`(
                (molecule-callback . ,Lyric_extender::brew_molecule)
@@ -519,12 +521,12 @@ ScoreContext = \translator {
        basicMarkProperties = #`(
          (molecule-callback . ,Text_item::brew_molecule)       
          (breakable . #t)
+         (mark-interface . #t)
          (visibility-lambda . ,end-of-line-invisible)
        )
        basicMultiMeasureRestProperties = #`(
                (molecule-callback . ,Multi_measure_rest::brew_molecule)
                (staff-position . 0)
-
        )
        basicNoteColumnProperties = #`(
                (axes 0 1)
@@ -543,6 +545,10 @@ ScoreContext = \translator {
                (molecule-callback . ,Text_item::brew_molecule)
                (style . "italic")
        )
+       basicPaperColumnProperties = #`(
+               (paper-column-interface . #t)
+               (axes 0)
+       )
        basicPedalProperties = #`(
                (molecule-callback . ,Text_item::brew_molecule)
                (style . "italic")
@@ -563,7 +569,9 @@ ScoreContext = \translator {
        basicScriptProperties    = #`(
                (molecule-callback . ,Script::brew_molecule)
        )
-               
+       basicScriptColumnProperties = #`(
+               (before-line-breaking-callback . ,Script_column::before_line_breaking)
+       )
        basicSlurProperties = #`(
                (molecule-callback . ,Slur::brew_molecule)
                (after-line-breaking-callback . ,Slur::after_line_breaking) 
@@ -585,7 +593,7 @@ ScoreContext = \translator {
                (thin-kern . 3.0)
                (hair-thickness . 1.6)
                (thick-thickness . 6.0)
-
+               (bar-interface . #t)
        )
        basicSustainPedalProperties = #`(
                (no-spacing-rods . #t)
@@ -633,6 +641,7 @@ ScoreContext = \translator {
        )
        basicTupletSpannerProperties = #`(
                (number-gap . 2.0)   
+               (delta-y . 0)
                (thick . 1.0)
                (after-line-breaking-callback . ,Tuplet_spanner::after_line_breaking)
                (molecule-callback . ,Tuplet_spanner::brew_molecule)
@@ -657,7 +666,6 @@ ScoreContext = \translator {
        )
        basicVoltaSpannerProperties = #`(
                (molecule-callback . ,Volta_spanner::brew_molecule)
-               (after-line-breaking-callback . ,Volta_spanner::after_line_breaking) 
        )
        
        \accepts "Staff";
index d144bcc4f2753dce251362725b1f631024a4bd0d..5434a4c151e001a78efe5008e68ec67fd44bf4b9 100644 (file)
@@ -480,6 +480,17 @@ if 1:
        conversions.append ((1,3,59), conv,
                            '\key X ; -> \key X major; ') 
 
+if 1:
+       def conv (str):
+#              if re.search ('latexheaders *= *"\\\\input ',str):
+#                      sys.stderr.write ('\nHello???')
+               str = re.sub (r'latexheaders *= *"\\\\input ',
+                             'latexheaders = "',
+                             str)
+               return str
+       conversions.append ((1,3,68), conv, 'latexheaders = "\\input global" -> latexheaders = "global"')
+
+
 ############################
        
 
index e17b41b1f11c35fc5b21d13e39f808d09722b636..34ce7efd3cc032aeeb8afea7ac285c36a36696db 100644 (file)
@@ -264,8 +264,8 @@ class TeXOutput:
 %%\headsep0pt
 %% Maybe this is too drastic, but let us give it a try.
 \geometry{width=%spt, height=%spt,headheight=2mm,headsep=0pt,footskip=2mm} 
-\input lilyponddefs 
-\input titledefs 
+\input{lilyponddefs}
+\input{titledefs}
 %s
 \makeatletter
 \renewcommand{\@oddhead}{\parbox{\textwidth}%%
@@ -817,7 +817,7 @@ class Properties:
     # Set latex header name
     #
     def setHeader(this,head, requester):
-       this.__set('header',head,requester)
+       this.__set('header','\\input{' + head + '}',requester)
 
     #
     # Set or Clear Dependencies flag to generate makefile dependencies