]> git.donarmstrong.com Git - lilypond.git/commitdiff
patch::: 1.3.11.hwn1
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Wed, 15 Dec 1999 20:35:17 +0000 (21:35 +0100)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Wed, 15 Dec 1999 20:35:17 +0000 (21:35 +0100)
pl 11.hwn1
- bf: dots
- revise stem, notehead, rest

20 files changed:
CHANGES
VERSION
lily/beam.cc
lily/beaming-info.cc [new file with mode: 0644]
lily/chord-tremolo-engraver.cc
lily/include/beam.hh
lily/include/lily-guile.hh
lily/include/note-head.hh
lily/include/staff-symbol-referencer.hh
lily/include/stem.hh
lily/lily-guile.cc
lily/misc.cc
lily/new-beaming.cc
lily/note-head.cc
lily/slur.cc
lily/staff-symbol-referencer.cc
lily/stem-engraver.cc
lily/stem-tremolo.cc
lily/stem.cc
lily/tie.cc

diff --git a/CHANGES b/CHANGES
index db957bac39577d598fcd0ca7d25688b6e5a4b5cf..c997cae9da449ade511ef002be922693efac7da0 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,8 @@
+pl 11.hwn1
+       - bf: dots
+       - revise stem, notehead, rest
 
+************
 pl 10.uu1
        - various small bfs
        - bf: alignment reversed
diff --git a/VERSION b/VERSION
index b5129961d59c0410a698c86251b13da5140b41ac..a68f071212ca468a649636f6887a9d28e9607c67 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -2,7 +2,7 @@ PACKAGE_NAME=LilyPond
 MAJOR_VERSION=1
 MINOR_VERSION=3
 PATCH_LEVEL=11
-MY_PATCH_LEVEL=
+MY_PATCH_LEVEL=hwn1
 
 # use the above to send patches: MY_PATCH_LEVEL is always empty for a
 # released version.
index 8b25aeb5d5550e8883e8ca12947be5534acc3ec6..0c622458928a3a6a489a09e7119148bc7a25b7de 100644 (file)
@@ -40,7 +40,6 @@ Beam::Beam ()
   
   slope_f_ = 0;
   left_y_ = 0;
-  multiplicity_i_ = 0;
 }
 
 /*
@@ -377,7 +376,9 @@ Beam::solve_slope ()
 Real
 Beam::check_stemlengths_f (bool set_b)
 {
-  Real interbeam_f = paper_l ()->interbeam_f (multiplicity_i_);
+  int multiplicity = multiplicity_i ();
+
+  Real interbeam_f = paper_l ()->interbeam_f (multiplicity);
 
   Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));
   Real staffline_f = paper_l ()-> get_var ("stafflinethickness");
@@ -397,7 +398,7 @@ Beam::check_stemlengths_f (bool set_b)
       if (get_direction () != s->get_direction ())
        {
          y -= get_direction () * (beam_f / 2
-           + (multiplicity_i_ - 1) * interbeam_f);
+           + (multiplicity - 1) * interbeam_f);
 
 
          Staff_symbol_referencer_interface s1 (s);
@@ -405,7 +406,7 @@ Beam::check_stemlengths_f (bool set_b)
          
          if (!i
            && s1.staff_symbol_l () != s2.staff_symbol_l ())
-           y += get_direction () * (multiplicity_i_ - (s->flag_i () - 2) >? 0)
+           y += get_direction () * (multiplicity - (s->flag_i () - 2) >? 0)
              * interbeam_f;
        }
 
@@ -433,9 +434,15 @@ Beam::set_stem_shorten ()
 {
   if(!stem_count ())
     return;
-  
-  assert (multiplicity_i_);
 
+  int multiplicity = multiplicity_i();
+
+  if  (multiplicity <= 0)
+    {
+      programming_error ("Singular beam");
+      return;
+    }
+  
   int total_count_i = 0;
   int forced_count_i = 0;
   for (int i=0; i < stem_count (); i++)
@@ -455,7 +462,7 @@ Beam::set_stem_shorten ()
   String type_str = grace_b ? "grace_" : "";
   int stem_max = (int)rint(paper_l ()->get_var ("stem_max"));
   Real shorten_f = paper_l ()->get_var (type_str + "forced_stem_shorten"
-    + to_str (multiplicity_i_ <? stem_max)) * internote_f;
+    + to_str (multiplicity <? stem_max)) * internote_f;
     
   for (int i=0; i < stem_count (); i++)
     {
@@ -632,21 +639,23 @@ Beam::quantise_left_y (bool extend_b)
   Real beamdx_f = stem (stem_count () -1)->hpos_f () - first_visible_stem ()->hpos_f ();
   Real beamdy_f = beamdx_f * slope_f_;
 
+  int multiplicity = multiplicity_i ();
+
   Array<Real> allowed_position;
   if (q == ly_symbol2scm ("normal"))
     {
-      if ((multiplicity_i_ <= 2) || (abs (beamdy_f) >= staffline_f / 2))
+      if ((multiplicity <= 2) || (abs (beamdy_f) >= staffline_f / 2))
        allowed_position.push (straddle);
-      if ((multiplicity_i_ <= 1) || (abs (beamdy_f) >= staffline_f / 2))
+      if ((multiplicity <= 1) || (abs (beamdy_f) >= staffline_f / 2))
        allowed_position.push (sit);
       allowed_position.push (hang);
     }
   else if (q == ly_symbol2scm ("traditional"))
     {
       // TODO: check and fix TRADITIONAL
-      if ((multiplicity_i_ <= 2) || (abs (beamdy_f) >= staffline_f / 2))
+      if ((multiplicity <= 2) || (abs (beamdy_f) >= staffline_f / 2))
        allowed_position.push (straddle);
-      if ((multiplicity_i_ <= 1) && (beamdy_f <= staffline_f / 2))
+      if ((multiplicity <= 1) && (beamdy_f <= staffline_f / 2))
        allowed_position.push (sit);
       if (beamdy_f >= -staffline_f / 2)
        allowed_position.push (hang);
@@ -692,29 +701,29 @@ Beam::set_beaming (Beaming_info_list *beaming)
     {
       do
        {
-         if (stem (i)->beams_i_drul_[d] < 0)
-           stem (i)->beams_i_drul_[d] = beaming->infos_.elem (i).beams_i_drul_[d];
+         if (stem (i)->beam_count (d) < 0)
+           stem (i)->set_beaming (beaming->infos_.elem (i).beams_i_drul_[d], d);
        }
       while (flip (&d) != LEFT);
     }
 }
 
 
-void
-Beam::do_add_processing ()
+
+int
+Beam::multiplicity_i () const 
 {
-  for (int i=0; i < stem_count () ; i++) 
+  int m = 0;
+  for (SCM s = get_elt_property ("stems"); gh_pair_p (s); s = gh_cdr (s))
     {
-      Direction d = LEFT;
-      do {
-       multiplicity_i_ = multiplicity_i_ >? stem (i)->beams_i_drul_[d];
-      } while ((flip (&d)) != LEFT);
-    }
+      Score_element * sc = unsmob_element (gh_car (s));
 
+      if (Stem * st = dynamic_cast<Stem*> (sc))
+       m = m >? st->beam_count (LEFT) >? st->beam_count (RIGHT);
+    }
+  return m;
 }
 
-
-
 /*
   beams to go with one stem.
 
@@ -727,8 +736,12 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const
       (prev && !(prev->hpos_f () < here->hpos_f ())))
       programming_error ("Beams are not left-to-right");
 
+
+  int multiplicity = multiplicity_i();
+
   Real staffline_f = paper_l ()->get_var ("stafflinethickness");
-  Real interbeam_f = paper_l ()->interbeam_f (multiplicity_i_);
+  Real interbeam_f = paper_l ()->interbeam_f (multiplicity);
+  
   Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));;
 
   Real dy = interbeam_f;
@@ -752,8 +765,9 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const
   /* half beams extending to the left. */
   if (prev)
     {
-      int lhalfs= lhalfs = here->beams_i_drul_[LEFT] - prev->beams_i_drul_[RIGHT] ;
-      int lwholebeams= here->beams_i_drul_[LEFT] <? prev->beams_i_drul_[RIGHT] ;
+      int lhalfs= lhalfs = here->beam_count (LEFT)
+       - prev->beam_count (RIGHT);
+      int lwholebeams= here->beam_count (LEFT) <? prev->beam_count (RIGHT);
       /*
        Half beam should be one note-width, 
        but let's make sure two half-beams never touch
@@ -774,8 +788,8 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const
 
   if (next)
     {
-      int rhalfs = here->beams_i_drul_[RIGHT] - next->beams_i_drul_[LEFT];
-      int rwholebeams = here->beams_i_drul_[RIGHT] <? next->beams_i_drul_[LEFT];
+      int rhalfs = here->beam_count (RIGHT) - next->beam_count (LEFT);
+      int rwholebeams = here->beam_count(RIGHT) <? next->beam_count (LEFT);
 
       Real w = next->hpos_f () - here->hpos_f ();
       Molecule a = lookup_l ()->beam (sl, w + stemdx, beam_f);
diff --git a/lily/beaming-info.cc b/lily/beaming-info.cc
new file mode 100644 (file)
index 0000000..ef0bb29
--- /dev/null
@@ -0,0 +1,97 @@
+/*   
+     beaming-info.cc --  implement Beaming_info, Beaming_info_list
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#include "beaming.hh"
+
+Beaming_info::Beaming_info( )
+{
+  start_mom_ = 0;
+  beams_i_drul_[LEFT] = 0;
+  beams_i_drul_[RIGHT] = 0;  
+}
+
+Beaming_info::Beaming_info(Moment m, int i)
+{
+  start_mom_ = m;
+  beams_i_drul_[LEFT] = i;
+  beams_i_drul_[RIGHT] = i;  
+}
+
+const int infinity_i = 1000;   // guh.
+
+int
+Beaming_info_list::min_denominator_index () const
+{
+  int minden = infinity_i;
+  int minidx = -1;
+
+  for (int i=1; i < infos_.size ( ); i++)
+    {
+      if (infos_[i].start_mom_.den_i () < minden)
+       {
+         minidx = i;
+         minden = infos_[i].start_mom_.den_i  ();
+       }
+    }
+
+  return minidx;
+}
+
+int
+Beaming_info_list::beam_extend_count (Direction d) const
+{
+  if (infos_.size () == 1)
+    return infos_[0].beams_i_drul_[d];
+
+  Beaming_info thisbeam  = infos_.boundary (d, 0);
+  Beaming_info next  = infos_.boundary (d, 1);
+  
+  return thisbeam.beams_i_drul_[-d] <? next.beams_i_drul_[d];
+}
+
+void
+Beaming_info_list::beamify ()
+{
+  if (infos_.size () <= 1)
+    return;
+      
+  Drul_array<Beaming_info_list> splits;
+  int m = min_denominator_index ();
+  splits[LEFT].infos_ = infos_.slice (0,m);
+  splits[RIGHT].infos_ = infos_.slice (m, infos_.size ());
+
+  Direction d = LEFT;
+  do
+    {
+      splits[d].beamify ();
+    }
+  while (flip (&d) != LEFT);
+
+  int middle_beams = splits[RIGHT].beam_extend_count (LEFT) <?
+    splits[LEFT].beam_extend_count (RIGHT);
+
+  do
+    {
+      if (splits[d].infos_.size () != 1)
+       {
+         splits[d].infos_.boundary (-d, 0).beams_i_drul_[-d] = middle_beams;
+       }
+    }
+  while (flip (&d) != LEFT);
+
+  infos_ = splits[LEFT].infos_;
+  infos_.concat (splits[RIGHT].infos_);
+}
+
+void
+Beaming_info_list::add_stem (Moment m, int b)
+{
+  infos_.push  (Beaming_info (m, b));
+}
index c705ea05a36805686634b97ab671b03e0d04d2a7..6c9f9e2bc890c88a137c26d72b1a3ead8be4f69e 100644 (file)
@@ -139,13 +139,10 @@ Chord_tremolo_engraver::acknowledge_element (Score_element_info i)
          int type_i = prev_start_req_->type_i_;
          s->set_elt_property ("duration-log",  gh_int2scm (intlog2 (type_i) - 2));
 
-         s->beams_i_drul_[LEFT] = s->flag_i ();
-         s->beams_i_drul_[RIGHT] = s->flag_i ();
+         s->set_beaming (s->flag_i (), LEFT);
+         s->set_beaming ( s->flag_i (), RIGHT);
          
-         abeam_p_->multiplicity_i_ = s->flag_i ();
-         /*
-           abbrev gaps on all but half note
-         */
+
 #if 0
          if (s->type_i () != 1)
            {
index d3d3c71afd089c50f6567e5a5270393a4226f70c..258c538d9db3a93f56fd4ab905d4f68b0ee9e9c0 100644 (file)
@@ -45,10 +45,7 @@ public:
   Real left_y_;
 
   /** 
-    highest number of beams present, for opening-up of beam-spacing
-    and calculation of stem lengths
    */
-  int multiplicity_i_;
 
   Beam ();
   void add_stem (Stem*);
@@ -57,6 +54,7 @@ public:
   void set_beaming (Beaming_info_list *);
   void set_stemlens ();
   VIRTUAL_COPY_CONS(Score_element);
+  int multiplicity_i () const;
 
 protected:
   Offset center () const;
@@ -68,7 +66,6 @@ protected:
   
   virtual void do_pre_processing ();
   virtual void do_post_processing ();
-  virtual void do_add_processing ();
   virtual void do_print() const;
   virtual Molecule*do_brew_molecule_p () const;
 
index ddb21f4c5ce844e71256f37dea57f1f2710879d6..84af73262bfa92093c2ac9477b85ba08cd353dcc 100644 (file)
@@ -44,7 +44,7 @@ void init_ly_protection ();
 unsigned int ly_scm_hash (SCM s);
 
 SCM index_cell (SCM cellp, Direction d);
-
+SCM index_set_cell (SCM cellp, Direction d, SCM val);
 
 /*
   snarfing.
index bbc051d2396ac6f1096a0540f55338e5d3da5fba..d08b85143dd6ce05b7c72af0fc4c8536a184359c 100644 (file)
 class Note_head : public Rhythmic_head
 {
 public:
-  Note_head ();
-  void flip_around_stem (Direction);
   static int compare (Note_head * const &a, Note_head *const &b) ;
 protected:
-  Molecule make_molecule () const;
   
-  static  Interval dim_callback (Dimension_cache const*);
   virtual void do_pre_processing();
   virtual Molecule* do_brew_molecule_p() const;
 };
index 60e9ac27870c78a2a4d71bacf40d27b04c8911b7..a9cb5056cd2a45f53dbd7e917984db1d747460e7 100644 (file)
@@ -12,6 +12,7 @@
 
 #include "score-element.hh"
 
+
 /**
    A notation object that needs access to variables of the staff (no
    lines, leading).
@@ -38,6 +39,8 @@ public:
   Real position_f () const;
 };
 
+int compare_position (Score_element *const&,Score_element *const&); 
+
 
 Staff_symbol_referencer_interface staff_symbol_referencer_interface  (Score_element const*);
 
index a40484123c159980c75c226d50c0862bbe5e9814..6ca04e807977e62e81086a3d951c7980ecc99d0f 100644 (file)
@@ -54,16 +54,14 @@ public:
   /// log of the duration. Eg. 4 -> 16th note -> 2 flags
   int flag_i () const;
 
-  Drul_array<int> beams_i_drul_;
-
-
+  int beam_count (Direction) const;
+  void set_beaming (int,  Direction d);
   /** 
     don't print flag when in beam.
     our beam, for aligning abbrev flags
    */
   Beam* beam_l () const;
   Note_head * first_head () const;
-  Stem ();
     
   /// ensure that this Stem also encompasses the Notehead #n#
   void add_head (Rhythmic_head*n);
@@ -83,7 +81,6 @@ public:
   void set_default_extents();
   void set_noteheads();
 
-  Real stem_length_f() const;
   Real stem_end_f() const;
   Real stem_begin_f() const;
   Real note_delta_f () const;
index 20abc957b45668b481d6817892cb44547dfcfc74..93e1651cc0a4ad55cdc736d51e27902377aab84c 100644 (file)
@@ -187,6 +187,15 @@ index_cell (SCM s, Direction d)
   return (d == LEFT) ? SCM_CAR (s) : SCM_CDR (s);
 }
 
+SCM
+index_set_cell (SCM s, Direction d, SCM v)
+{
+  if (d == LEFT)
+    gh_set_car_x (s, v);
+  else if (d == RIGHT)
+    gh_set_cdr_x (s, v);
+  return s;
+}
   
 SCM
 array_to_list (SCM *a , int l)
index 3f1f2ad949fb052023c6a682e44e1a3cc4bf1d3a..ab6cceb5f55310b13d0ed221ec6e3d3c3b60cbef 100644 (file)
@@ -32,23 +32,6 @@ log_2(double x) {
   return log (x)  /log (2.0);
 }
 
-#ifndef STANDALONE
-Interval
-itemlist_width (const Array<Item*> &its)
-{
-  Interval iv ;
-  iv.set_empty();
-   
-  for (int j =0; j < its.size(); j++)
-    {
-       iv.unite (its[j]->extent (X_AXIS));
-
-    }
-  return iv;
-}
-
-#endif
-
 
 /*
   TODO
index 6406d2a61e317ce3f39177e1ff0a5bcf3610f41f..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,97 +0,0 @@
-/*   
-  beaming.cc --  implement Beaming_info, Beaming_info_list
-  
-  source file of the GNU LilyPond music typesetter
-  
-  (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-  
- */
-
-#include "beaming.hh"
-
-Beaming_info::Beaming_info( )
-{
-  start_mom_ = 0;
-  beams_i_drul_[LEFT] = 0;
-  beams_i_drul_[RIGHT] = 0;  
-}
-
-Beaming_info::Beaming_info(Moment m, int i)
-{
-  start_mom_ = m;
-  beams_i_drul_[LEFT] = i;
-  beams_i_drul_[RIGHT] = i;  
-}
-
-const int infinity_i = 1000;   // guh.
-
-int
-Beaming_info_list::min_denominator_index () const
-{
-  int minden = infinity_i;
-  int minidx = -1;
-
-  for (int i=1; i < infos_.size ( ); i++)
-    {
-      if (infos_[i].start_mom_.den_i () < minden)
-       {
-         minidx = i;
-         minden = infos_[i].start_mom_.den_i  ();
-       }
-    }
-
-  return minidx;
-}
-
-int
-Beaming_info_list::beam_extend_count (Direction d) const
-{
-  if (infos_.size () == 1)
-    return infos_[0].beams_i_drul_[d];
-
-  Beaming_info thisbeam  = infos_.boundary (d, 0);
-  Beaming_info next  = infos_.boundary (d, 1);
-  
-  return thisbeam.beams_i_drul_[-d] <? next.beams_i_drul_[d];
-}
-
-void
-Beaming_info_list::beamify ()
-{
-  if (infos_.size () <= 1)
-    return;
-      
-  Drul_array<Beaming_info_list> splits;
-  int m = min_denominator_index ();
-  splits[LEFT].infos_ = infos_.slice (0,m);
-  splits[RIGHT].infos_ = infos_.slice (m, infos_.size ());
-
-  Direction d = LEFT;
-  do
-    {
-      splits[d].beamify ();
-    }
-  while (flip (&d) != LEFT);
-
-  int middle_beams = splits[RIGHT].beam_extend_count (LEFT) <?
-    splits[LEFT].beam_extend_count (RIGHT);
-
-  do
-    {
-      if (splits[d].infos_.size () != 1)
-       {
-         splits[d].infos_.boundary (-d, 0).beams_i_drul_[-d] = middle_beams;
-       }
-    }
-  while (flip (&d) != LEFT);
-
-  infos_ = splits[LEFT].infos_;
-  infos_.concat (splits[RIGHT].infos_);
-}
-
-void
-Beaming_info_list::add_stem (Moment m, int b)
-{
-  infos_.push  (Beaming_info (m, b));
-}
index 4ddaac08487a9e3cb95d3b741c2bf651c2a1f342..ae8ec870454d32cb9434228b5685ae7e825474c2 100644 (file)
 #include "dimension-cache.hh"
 #include "staff-symbol-referencer.hh"
 
-void
-Note_head::flip_around_stem (Direction d)
-{
-  Real l= make_molecule ().dim_[X_AXIS].length ();
-  translate_axis (l * d, X_AXIS);
-}
 
-Interval
-Note_head::dim_callback (Dimension_cache const * c)
-{
-  Note_head* n = dynamic_cast<Note_head*> (c->element_l ());
-  return n->make_molecule ().dim_[X_AXIS];
-}
 
-Note_head::Note_head ()
-{
-  dim_cache_[X_AXIS]->callback_l_ = dim_callback;
-}
 
 void
 Note_head::do_pre_processing ()
@@ -41,7 +25,7 @@ Note_head::do_pre_processing ()
   // 8 ball looks the same as 4 ball:
   String type; 
   SCM style  = get_elt_property ("style");
-  if (style != SCM_UNDEFINED)
+  if (gh_string_p (style))
     {
       type = ly_scm2string (style);
     }
@@ -60,28 +44,8 @@ Note_head::do_pre_processing ()
     }
 }
 
-int
-Note_head::compare (Note_head *const  &a, Note_head * const &b)
-{
-  Staff_symbol_referencer_interface s1(a);
-  Staff_symbol_referencer_interface s2(b);      
 
-  return sign(s1.position_f () - s2.position_f ());
-}
 
-Molecule
-Note_head::make_molecule () const
-{
-  String type; 
-  SCM style  = get_elt_property ("style");
-  if (style != SCM_UNDEFINED)
-    {
-      type = ly_scm2string (style);
-    }
-  
-  return lookup_l()->afm_find (String ("noteheads-")
-                              + to_str (balltype_i ()) + type);
-}
 
 Molecule*
 Note_head::do_brew_molecule_p() const 
@@ -95,9 +59,17 @@ Note_head::do_brew_molecule_p() const
     ? 0
     : (abs((int)p) - sz) /2;
 
-  Molecule*  out =  new Molecule (make_molecule ());
+ String type; 
+  SCM style  = get_elt_property ("style");
+  if (style != SCM_UNDEFINED)
+    {
+      type = ly_scm2string (style);
+    }
+  
+  Molecule*  out =
+    new Molecule (lookup_l()->afm_find (String ("noteheads-") + to_str (balltype_i ()) + type));
 
-  Box b = out->dim_;
+  Box ledgerless = out->dim_;
 
   if (streepjes_i) 
     {
@@ -120,7 +92,7 @@ Note_head::do_brew_molecule_p() const
        }
     }
 
-  out->dim_ = b;
+  out->dim_ = ledgerless;
   return out;
 }
 
index aff1365a279f495c4f5382ee346035b3d1f0734a..0a351dc2c23f23a3de36e59ffe12ca2d798a2fcd 100644 (file)
@@ -180,7 +180,7 @@ Slur::do_post_processing ()
          if ((stem_l->extent (Y_AXIS).empty_b ()
               || !((stem_l->get_direction () == get_direction ()) && (get_direction () != d)))
              && !((get_direction () == stem_l->get_direction ())
-                  && stem_l->beam_l () && (stem_l->beams_i_drul_[-d] >= 1)))
+                  && stem_l->beam_l () && (stem_l->beam_count (-d) >= 1)))
            {
              dx_f_drul_[d] = spanned_drul_[d]->extent (X_AXIS).length () / 2;
              dx_f_drul_[d] -= d * x_gap_f;
@@ -206,7 +206,7 @@ Slur::do_post_processing ()
              /*
                side attached to beamed stem
               */
-             if (stem_l->beam_l () && (stem_l->beams_i_drul_[-d] >= 1))
+             if (stem_l->beam_l () && (stem_l->beam_count (-d) >= 1))
                {
                  dy_f_drul_[d] = stem_l->extent (Y_AXIS)[get_direction ()];
                  dy_f_drul_[d] += get_direction () * 2 * y_gap_f;
index 8bd451109a9f864ffd326ccebe1311899f6ce7fa..64a46b81170a231df59025f876e80ec34235f27d 100644 (file)
@@ -65,19 +65,22 @@ Real
 Staff_symbol_referencer_interface::position_f () const
 {
   Real p =0.0;
-  SCM pos = elt_l_->get_elt_property ("staff-position");
-  if (gh_number_p (pos))
-    p = gh_scm2double (pos);
-
   Staff_symbol * st = staff_symbol_l ();
-  if (st)
+  Score_element * c = st ? elt_l_->common_refpoint (st, Y_AXIS) : 0;
+  if (st && c)
     {
-      Score_element * c = elt_l_->common_refpoint (st, Y_AXIS);
       Real y = elt_l_->relative_coordinate (c, Y_AXIS)
        - st->relative_coordinate (c, Y_AXIS);
 
       p += 2.0 * y / st->staff_line_leading_f ();
     }
+  else
+    {
+      SCM pos = elt_l_->get_elt_property ("staff-position");
+      if (gh_number_p (pos))
+       return gh_scm2double (pos);
+    }
+  
   return  p;
 }
 
@@ -134,3 +137,12 @@ staff_symbol_referencer_interface (Score_element const*e)
 {
   return e;                    // gee, I'm so smart!
 }
+
+int
+compare_position (Score_element *const  &a, Score_element * const &b)
+{
+  Staff_symbol_referencer_interface s1(a);
+  Staff_symbol_referencer_interface s2(b);      
+
+  return sign(s1.position_f () - s2.position_f ());
+}
index e6bd43c2bdd8d121ed3f18296e4fd76eeb6335dc..09e490bdff28f2bbd24217a5f3026d6300a94d78 100644 (file)
@@ -104,13 +104,13 @@ Stem_engraver::do_pre_move_processing()
       SCM prop = get_property ("stemLeftBeamCount", &which);
       if (gh_number_p(prop))
        {
-         stem_p_->beams_i_drul_[LEFT] = gh_scm2int (prop);
+         stem_p_->set_beaming (gh_scm2int (prop),LEFT);
          ((Translator_group*)which)->set_property ("stemLeftBeamCount", SCM_UNDEFINED);
        }
       prop = get_property ("stemRightBeamCount", &which);
       if (gh_number_p(prop))
        {
-         stem_p_->beams_i_drul_[RIGHT] = gh_scm2int (prop);
+         stem_p_->set_beaming (gh_scm2int (prop), RIGHT);
          ((Translator_group*)which)->set_property ("stemRightBeamCount", SCM_UNDEFINED);
        }
 
index 069ef6259cf2d6251b527eddfc545cab309cd94a..0a984d5d685be64f61a32312fba5235c30a39c91 100644 (file)
@@ -55,7 +55,7 @@ Stem_tremolo::do_brew_molecule_p () const
   int mult =0;
   if (Beam * b = st->beam_l ())
     {
-      mult = b->multiplicity_i_;
+      mult = b->multiplicity_i ();
     }
   
   Real interbeam_f = paper_l ()->interbeam_f (mult);
@@ -70,7 +70,7 @@ Stem_tremolo::do_brew_molecule_p () const
   if (st && st->beam_l ()) {
     slope_f = st->beam_l ()->slope_f_;
     // ugh, rather calc from Stem_tremolo_req
-    beams_i = st->beams_i_drul_[RIGHT] >? st->beams_i_drul_[LEFT];
+    beams_i = st->beam_count (RIGHT) >? st->beam_count (LEFT);
   } 
 
   Molecule a (lookup_l ()->beam (slope_f, w, beam_f));
index a6ca3d3df5d3d08c4bbd769b604f666faedb3a72..507772b54e6c52ae277a38a8f5f3502a88576fbc 100644 (file)
@@ -8,6 +8,7 @@
 
   TODO: This is way too hairy
 */
+
 #include "dimension-cache.hh"
 #include "stem.hh"
 #include "debug.hh"
 #include "cross-staff.hh"
 #include "staff-symbol-referencer.hh"
 
-Stem::Stem ()
+
+void
+Stem::set_beaming (int i,  Direction d )
+{
+  SCM pair = get_elt_property ("beaming");
+  
+  if (!gh_pair_p (pair))
+    pair = gh_cons (gh_int2scm (0),gh_int2scm (0));
+
+  index_set_cell (pair, d, gh_int2scm (i));
+}
+
+int
+Stem::beam_count (Direction d) const
 {
-  beams_i_drul_[LEFT] = beams_i_drul_[RIGHT] = -1;
+  SCM p=get_elt_property ("beaming");
+  if (gh_pair_p (p))
+    return gh_scm2int (index_cell (p,d));
+  else
+    return 0;
 }
 
 Interval_t<int>
@@ -55,13 +73,6 @@ Stem::head_positions () const
   return r;
 }
 
-
-Real
-Stem::stem_length_f () const
-{
-  return yextent_.length();
-}
-
 Real
 Stem::stem_begin_f () const
 {
@@ -96,7 +107,7 @@ Stem::set_stemend (Real se)
 int
 Stem::type_i () const
 {
-  return first_head ()->balltype_i ();
+  return first_head () ?  first_head ()->balltype_i () : 2;
 }
 
 Note_head*
@@ -205,9 +216,8 @@ Stem::flag_i () const
 void
 Stem::set_default_extents ()
 {
-  if (!stem_length_f ())
+  if (yextent_.empty_b ())
     set_default_stemlen ();
-
 }
 
 void
@@ -215,21 +225,20 @@ Stem::set_noteheads ()
 {
   if (!first_head ())
     return;
-
   
-  Link_array<Note_head> head_l_arr =
-    Group_interface__extract_elements (this, (Note_head*)0, "heads");
+  Link_array<Score_element> head_l_arr =
+    Group_interface__extract_elements (this, (Score_element*)0, "heads");
 
-  head_l_arr.sort (Note_head::compare);
+  head_l_arr.sort (compare_position);
   if (get_direction () < 0)
     head_l_arr.reverse ();
 
-  Note_head * beginhead =   first_head ();
+  Score_element * beginhead =   head_l_arr[0];
   beginhead->set_elt_property ("extremal", SCM_BOOL_T);
   if  (beginhead !=   head_l_arr.top ())
     head_l_arr.top ()->set_elt_property ("extremal", SCM_BOOL_T);
   
-  int parity=1;
+  bool parity= true;
   int lastpos = int (Staff_symbol_referencer_interface (beginhead).position_f ());
   for (int i=1; i < head_l_arr.size (); i ++)
     {
@@ -239,11 +248,15 @@ Stem::set_noteheads ()
       if (dy <= 1)
        {
          if (parity)
-           head_l_arr[i]->flip_around_stem (get_direction ());
+           {
+             Real l  = head_l_arr[i]->extent (X_AXIS).length ();
+             head_l_arr[i]->translate_axis (l * get_direction (), X_AXIS);
+           }
          parity = !parity;
        }
       else
-       parity = 1;
+       parity = true;
+      
       lastpos = int (p);
     }
 }
@@ -262,7 +275,6 @@ Stem::do_pre_processing ()
       set_empty (X_AXIS);      
     }
 
-
   set_spacing_hints ();
 }
 
@@ -329,8 +341,6 @@ Stem::dim_callback (Dimension_cache const* c)
 }
 
 
-
-
 const Real ANGLE = 20* (2.0*M_PI/360.0); // ugh!
 
 Molecule*
@@ -354,8 +364,7 @@ Stem::do_brew_molecule_p () const
       mol_p->add_molecule (ss);
     }
 
-  if (get_elt_property ("beam") == SCM_UNDEFINED
-      && abs (flag_i ()) > 2)
+  if (!beam_l () && abs (flag_i ()) > 2)
     {
       Molecule fl = flag ();
       fl.translate_axis(stem_y[get_direction ()]*dy, Y_AXIS);
@@ -402,6 +411,7 @@ Stem::beam_l ()const
 }
 
 
+// ugh still very long.
 Stem_info
 Stem::calc_stem_info () const
 {
@@ -424,7 +434,7 @@ Stem::calc_stem_info () const
       beam_dir = UP;           //  GURAUGRNAGURAGU! urg !
     }
   
-  Real interbeam_f = paper_l ()->interbeam_f (beam_l ()->multiplicity_i_);
+  Real interbeam_f = paper_l ()->interbeam_f (beam_l ()->multiplicity_i ());
   Real beam_f = gh_scm2double (beam_l ()->get_elt_property ("beam-thickness"));
          
   info.idealy_f_ = chord_start_f ();
@@ -438,17 +448,17 @@ Stem::calc_stem_info () const
   int stem_max = (int)rint(paper_l ()->get_var ("stem_max"));
   String type_str = grace_b ? "grace_" : "";
   Real min_stem_f = paper_l ()->get_var (type_str + "minimum_stem_length"
-    + to_str (beam_l ()->multiplicity_i_ <? stem_max)) * internote_f;
+    + to_str (beam_l ()->multiplicity_i () <? stem_max)) * internote_f;
   Real stem_f = paper_l ()->get_var (type_str + "stem_length"
-    + to_str (beam_l ()->multiplicity_i_ <? stem_max)) * internote_f;
+    + to_str (beam_l ()->multiplicity_i () <? stem_max)) * internote_f;
 
   if (!beam_dir || (beam_dir == get_direction ()))
     /* normal beamed stem */
     {
-      if (beam_l ()->multiplicity_i_)
+      if (beam_l ()->multiplicity_i ())
        {
          info.idealy_f_ += beam_f;
-         info.idealy_f_ += (beam_l ()->multiplicity_i_ - 1) * interbeam_f;
+         info.idealy_f_ += (beam_l ()->multiplicity_i () - 1) * interbeam_f;
        }
       info.miny_f_ = info.idealy_f_;
       info.maxy_f_ = INT_MAX;
@@ -472,7 +482,7 @@ Stem::calc_stem_info () const
          info.miny_f_ = info.miny_f_ >? 0;
          //lowest beam of (UP) beam must never be lower than second staffline
          info.miny_f_ = info.miny_f_ >? (- 2 * internote_f - beam_f
-                               + (beam_l ()->multiplicity_i_ > 0) * beam_f + interbeam_f * (beam_l ()->multiplicity_i_ - 1));
+                               + (beam_l ()->multiplicity_i () > 0) * beam_f + interbeam_f * (beam_l ()->multiplicity_i () - 1));
        }
     }
   else
index f7ea46e8015040c79617a4f319e6e990ddad5082..c891d0bb685a14cfede797791b592203173c6ddc 100644 (file)
@@ -17,13 +17,9 @@ void
 Tie::set_head (Direction d, Note_head * head_l)
 {
   assert (!head (d));
-  if (d == LEFT)
-    gh_set_car_x (get_elt_property ("heads"), head_l->self_scm_ );
-  else if (d == RIGHT)
-    gh_set_cdr_x (get_elt_property ("heads"), head_l->self_scm_ );
+  index_set_cell (get_elt_property ("heads"), d, head_l->self_scm_);
   
   set_bounds (d, head_l);
-
   add_dependency (head_l);
 }
 
@@ -76,8 +72,9 @@ Tie::do_add_processing()
       new_head_drul[d] = head((Direction)-d);
   } while (flip(&d) != LEFT);
 
-  gh_set_car_x (get_elt_property ("heads"), new_head_drul[LEFT]->self_scm_ );
-  gh_set_cdr_x (get_elt_property ("heads"), new_head_drul[RIGHT]->self_scm_ );
+  index_set_cell (get_elt_property ("heads"), LEFT, new_head_drul[LEFT]->self_scm_ );
+  index_set_cell (get_elt_property ("heads"), RIGHT, new_head_drul[LEFT]->self_scm_ );
+
 }
 
 void