]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/beam-engraver.cc
patch::: 1.3.121.jcn2
[lilypond.git] / lily / beam-engraver.cc
index 25ab6a735eeaf90fc259bf688f5ea9e48393bb00..fdb459ccb20de154cdec683c8a7bc6d0c2188a5b 100644 (file)
@@ -23,6 +23,9 @@ class Beam_engraver : public Engraver
 {
   Drul_array<Span_req*> reqs_drul_;
 
+  Link_array<Stem> stems_;
+  
+  
   Spanner *finished_beam_p_;
   Spanner *beam_p_;
   Span_req * prev_start_req_;
@@ -39,12 +42,14 @@ class Beam_engraver : public Engraver
   void typeset_beam ();
   void set_melisma (bool);
 protected:
-  virtual void do_pre_move_processing ();
-  virtual void do_post_move_processing ();
-  virtual void do_removal_processing ();
-  virtual void acknowledge_element (Score_element_info);
-  virtual bool do_try_music (Music*);
-  virtual void do_process_music ();
+  virtual void stop_translation_timestep ();
+  virtual void start_translation_timestep ();
+  virtual void finalize ();
+  virtual void create_grobs ();
+  virtual void acknowledge_grob (Grob_info);
+  virtual bool try_music (Music*);
+  virtual void process_music ();
+
 public:
   Beam_engraver ();
   VIRTUAL_COPY_CONS (Translator);
@@ -62,11 +67,12 @@ Beam_engraver::Beam_engraver ()
 }
 
 bool
-Beam_engraver::do_try_music (Music *m)
+Beam_engraver::try_music (Music *m)
 {
   if (Span_req * c = dynamic_cast<Span_req*>(m))
     {
-      if (c->span_type_str_ == "abort")
+      if (scm_equal_p (c->get_mus_property ("span-type"),
+                      ly_str02scm ("abort")) == SCM_BOOL_T)
        {
          reqs_drul_[START] = 0;
          reqs_drul_[STOP] = 0;
@@ -74,10 +80,11 @@ Beam_engraver::do_try_music (Music *m)
            beam_p_->suicide ();
          beam_p_ = 0;
        }
-      else if (c->span_type_str_ == "beam")
+      else if (scm_equal_p (c->get_mus_property ("span-type"),
+                      ly_str02scm ("beam")) == SCM_BOOL_T)
        {
       
-         Direction d =c->span_dir_;
+         Direction d =c->get_span_dir ();
 
          if (d == STOP && !beam_p_)
            {
@@ -108,9 +115,8 @@ Beam_engraver::set_melisma (bool m)
   daddy_trans_l_->set_property ("beamMelismaBusy", m ? SCM_BOOL_T :SCM_BOOL_F);
 }
 
-
 void
-Beam_engraver::do_process_music ()
+Beam_engraver::process_music ()
 {
   if (reqs_drul_[STOP])
     {
@@ -125,7 +131,7 @@ Beam_engraver::do_process_music ()
     }
 
 
-  if (beam_p_  &&  !to_boolean (get_property ("weAreGraceContext")))
+  if (beam_p_ && !to_boolean (get_property ("weAreGraceContext")))
     {
       Score_engraver * e = 0;
       Translator * t  =  daddy_grav_l ();
@@ -139,7 +145,12 @@ Beam_engraver::do_process_music ()
       else
        e->forbid_breaks ();
     }
-  
+}
+
+
+void
+Beam_engraver::create_grobs ()
+{
   if (reqs_drul_[START])
     {
       if (beam_p_)
@@ -149,7 +160,7 @@ Beam_engraver::do_process_music ()
        }
 
       prev_start_req_ = reqs_drul_[START];
-      beam_p_ = new Spanner (get_property ("basicBeamProperties"));
+      beam_p_ = new Spanner (get_property ("Beam"));
       Beam::set_interface (beam_p_);
       
       SCM smp = get_property ("measurePosition");
@@ -162,8 +173,10 @@ Beam_engraver::do_process_music ()
       
       /* urg, must copy to Auto_beam_engraver too */
  
-      announce_element (beam_p_, reqs_drul_[START]);
+      announce_grob (beam_p_, reqs_drul_[START]);
     }
+  reqs_drul_[STOP] = 0;
+  reqs_drul_[START] = 0;
 }
 
 void
@@ -174,7 +187,7 @@ Beam_engraver::typeset_beam ()
       finished_beam_info_p_->beamify ();
       
       Beam::set_beaming (finished_beam_p_, finished_beam_info_p_);
-      typeset_element (finished_beam_p_);
+      typeset_grob (finished_beam_p_);
       delete finished_beam_info_p_;
       finished_beam_info_p_ =0;
       finished_beam_p_ = 0;
@@ -184,7 +197,7 @@ Beam_engraver::typeset_beam ()
 }
 
 void
-Beam_engraver::do_post_move_processing ()
+Beam_engraver::start_translation_timestep ()
 {
   reqs_drul_ [START] =0;
   if(beam_p_) {
@@ -197,13 +210,13 @@ Beam_engraver::do_post_move_processing ()
 }
 
 void
-Beam_engraver::do_pre_move_processing ()
+Beam_engraver::stop_translation_timestep ()
 {
   typeset_beam ();
 }
 
 void
-Beam_engraver::do_removal_processing ()
+Beam_engraver::finalize ()
 {
   typeset_beam ();
   if (beam_p_)
@@ -221,13 +234,13 @@ Beam_engraver::do_removal_processing ()
 }
 
 void
-Beam_engraver::acknowledge_element (Score_element_info info)
+Beam_engraver::acknowledge_grob (Grob_info info)
 {
   if (beam_p_)
     {
       if (Rest::has_interface (info.elem_l_))
        {
-         info.elem_l_->add_offset_callback (Beam::rest_collision_callback, Y_AXIS);
+         info.elem_l_->add_offset_callback (Beam::rest_collision_callback_proc, Y_AXIS);
        }
       else if (Stem::has_interface (info.elem_l_))
        {
@@ -235,7 +248,7 @@ Beam_engraver::acknowledge_element (Score_element_info info)
          if (Stem::beam_l (stem_l))
            return;
 
-         bool stem_grace = stem_l->get_elt_property ("grace") == SCM_BOOL_T;
+         bool stem_grace = stem_l->get_grob_property ("grace") == SCM_BOOL_T;
 
          SCM wg =get_property ("weAreGraceContext");
          bool wgb= to_boolean (wg);
@@ -255,7 +268,8 @@ Beam_engraver::acknowledge_element (Score_element_info info)
              return;
            }
 
-         if (rhythmic_req->duration_.durlog_i_<= 2)
+      int durlog  = unsmob_duration (rhythmic_req->get_mus_property ("duration"))-> duration_log ();
+         if (durlog <= 2)
            {
              rhythmic_req->origin ()->warning (_ ("stem doesn't fit in beam"));
              prev_start_req_->origin ()->warning (_ ("beam was started here"));
@@ -266,11 +280,11 @@ Beam_engraver::acknowledge_element (Score_element_info info)
              */
            }
 
-         stem_l->set_elt_property ("duration-log",
-                                   gh_int2scm (rhythmic_req->duration_.durlog_i_));
+         stem_l->set_grob_property ("duration-log",
+                                   gh_int2scm (durlog));
          Moment stem_location = now_mom () - beam_start_mom_ + beam_start_location_;
          beam_info_p_->add_stem (stem_location,
-                                 (rhythmic_req->duration_.durlog_i_ - 2) >? 1);
+                                 (durlog- 2) >? 1);
          Beam::add_stem (beam_p_, stem_l);
        }
     }