]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-1.0.1
authorfred <fred>
Fri, 24 Jul 1998 12:20:53 +0000 (12:20 +0000)
committerfred <fred>
Fri, 24 Jul 1998 12:20:53 +0000 (12:20 +0000)
lily/slur-engraver.cc [new file with mode: 0644]
lily/tie-engraver.cc [new file with mode: 0644]

diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc
new file mode 100644 (file)
index 0000000..5ccf038
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+  slur-grav.cc -- implement Slur_engraver
+
+  (c)  1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+*/
+
+#include "proto.hh"
+#include "plist.hh"
+#include "musical-request.hh"
+#include "slur-engraver.hh"
+#include "slur.hh"
+#include "debug.hh"
+#include "note-column.hh"
+
+bool
+Slur_engraver::do_try_request (Request *req_l)
+{
+  Musical_req *mus_l = req_l->access_Musical_req ();
+  if (!mus_l || !mus_l->access_Slur_req ())
+    return false;
+
+  new_slur_req_l_arr_.push (mus_l->access_Slur_req ());
+  return true;
+}
+
+void
+Slur_engraver::acknowledge_element (Score_element_info info)
+{
+  if (info.elem_l_->is_type_b (Note_column::static_name ()))
+    {
+      Note_column *col_l =(Note_column*) info.elem_l_->access_Item() ;// ugh
+      for (int i = 0; i < slur_l_stack_.size(); i++)
+       slur_l_stack_[i]->add_column (col_l);
+      for (int i = 0; i < end_slur_l_arr_.size(); i++)
+       end_slur_l_arr_[i]->add_column (col_l);
+    }
+}
+
+void
+Slur_engraver::do_removal_processing ()
+{
+  for (int i = 0; i < slur_l_stack_.size(); i++)
+    {
+      typeset_element (slur_l_stack_[i]);
+    }
+  slur_l_stack_.clear ();
+  for (int i=0; i < requests_arr_.size(); i++)
+    {
+      requests_arr_[i]->warning (_ ("unterminated slur"));
+    }
+}
+
+/*
+  abracadabra
+  */
+Slur_engraver::Slur_engraver()
+{
+  dir_ =CENTER;
+}
+void
+Slur_engraver::do_process_requests()
+{
+  Array<Slur*> start_slur_l_arr_;
+  for (int i=0; i< new_slur_req_l_arr_.size(); i++)
+    {
+      Slur_req* slur_req_l = new_slur_req_l_arr_[i];
+      // end slur: move the slur to other array
+      if (slur_req_l->spantype == Span_req::STOP)
+       {
+         if (slur_l_stack_.empty())
+
+           slur_req_l->warning (_f ("can't find both ends of %s", _("slur")));
+         else
+           {
+             end_slur_l_arr_.push (slur_l_stack_.pop());
+             requests_arr_.pop();
+           }
+       }
+      else  if (slur_req_l->spantype == Span_req::START)
+       {
+         // push a new slur onto stack.
+         //(use temp. array to wait for all slur STOPs)
+         Slur * s_p =new Slur;
+         Scalar prop = get_property ("slurdash");
+         if (prop.isnum_b ()) 
+           s_p->dash_i_ = prop;
+         requests_arr_.push (slur_req_l);
+         start_slur_l_arr_.push (s_p);
+         announce_element (Score_element_info (s_p, slur_req_l));
+       }
+    }
+  for (int i=0; i < start_slur_l_arr_.size(); i++)
+    slur_l_stack_.push (start_slur_l_arr_[i]);
+}
+
+void
+Slur_engraver::do_pre_move_processing()
+{
+  Scalar dir (get_property ("slurydirection"));
+  Scalar dir2 (get_property ("ydirection"));
+  if (!dir.length_i () && dir2.length_i ())
+    {
+        dir_ = (Direction) int(dir2);
+    }
+  else if (dir.length_i ())
+    dir_ = (Direction) int (dir);
+  
+  for (int i = 0; i < end_slur_l_arr_.size(); i++)
+    {
+      if (dir_)
+       end_slur_l_arr_[i]->dir_ = dir_;
+      typeset_element (end_slur_l_arr_[i]);
+    }
+  end_slur_l_arr_.clear();
+}
+
+void
+Slur_engraver::do_post_move_processing()
+{
+  new_slur_req_l_arr_.clear();
+}
+
+IMPLEMENT_IS_TYPE_B1(Slur_engraver,Engraver);
+ADD_THIS_TRANSLATOR(Slur_engraver);
diff --git a/lily/tie-engraver.cc b/lily/tie-engraver.cc
new file mode 100644 (file)
index 0000000..d6313a2
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+  tie-reg.cc -- implement Tie_engraver
+
+  source file of the GNU LilyPond music typesetter
+
+  (c)  1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+  
+  essentially obsolete.
+*/
+
+#include "tie-engraver.hh"
+#include "tie.hh"
+#include "note-head.hh"
+#include "musical-request.hh"
+#include "music-list.hh"
+
+Tie_engraver::Tie_engraver()
+{
+  end_tie_p_ = 0;
+  tie_p_ = 0;
+  req_l_ =0;
+  end_req_l_ =0;
+  end_mom_ = -1;
+  melodic_req_l_ = 0;
+  end_melodic_req_l_ =0;
+  dir_ = CENTER;
+}
+
+void
+Tie_engraver::do_post_move_processing()
+{
+  if (tie_p_ && now_moment () == end_mom_)
+    {
+      end_tie_p_ = tie_p_;
+      end_req_l_ = req_l_;
+      end_melodic_req_l_ = melodic_req_l_;
+      tie_p_ =0;
+      req_l_ =0;
+      end_mom_ = -1;
+    }
+}
+
+bool
+Tie_engraver::do_try_request (Request*r)
+{
+  if (! (r->access_Musical_req () && r->access_Musical_req ()->access_Tie_req ()))
+    return false;
+  
+  if (req_l_)
+    {
+      return false;
+    }
+  req_l_ = r->access_Musical_req ()->access_Tie_req ();
+  end_mom_ = r->parent_music_l_->time_int().length ()
+    + now_moment ();
+  return true;
+}
+
+void
+Tie_engraver::do_process_requests()
+{
+  Scalar dir (get_property ("tieydirection"));
+  Scalar dir2 (get_property ("ydirection"));
+  if (!dir.length_i () && dir2.length_i ())
+    {
+        dir_ = (Direction) int(dir2);
+    }
+  else if (dir.length_i ())
+    dir_ = (Direction) int (dir);
+  
+  if (req_l_ && ! tie_p_)
+    {
+      tie_p_ = new Tie;
+      Scalar prop = get_property ("tiedash");
+      if (prop.isnum_b ()) 
+       tie_p_->dash_i_ = prop;
+    }
+}
+
+void
+Tie_engraver::acknowledge_element (Score_element_info i)
+{
+  if (i.elem_l_->is_type_b (Note_head::static_name ()))
+    {
+      if (tie_p_)
+       {
+         tie_p_->set_head (LEFT, (Note_head*)i.elem_l_->access_Item ());
+         melodic_req_l_ = i.req_l_->access_Musical_req ()->access_Melodic_req ();
+       }
+
+      if (end_tie_p_)
+       {
+         end_tie_p_->set_head (RIGHT, (Note_head*)i.elem_l_->access_Item ());
+         if (!Melodic_req::compare (*end_melodic_req_l_, *melodic_req_l_))
+           end_tie_p_->same_pitch_b_ = true;
+         announce_element (Score_element_info (end_tie_p_,end_req_l_));
+       }
+    }
+}
+
+void
+Tie_engraver::do_pre_move_processing()
+{
+  if (end_tie_p_)
+    {
+      if (dir_)
+       end_tie_p_->dir_ =  dir_;
+
+      typeset_element (end_tie_p_);
+      end_tie_p_ =0;
+      end_req_l_ =0;
+    }
+}
+
+void
+Tie_engraver::do_removal_processing ()
+{
+  do_pre_move_processing ();
+  if (tie_p_)
+    {
+      req_l_->warning (_ ("lonely tie"));
+      tie_p_->unlink ();
+      delete tie_p_;
+      tie_p_ =0;
+    }
+}
+
+
+
+IMPLEMENT_IS_TYPE_B1(Tie_engraver,Engraver);
+ADD_THIS_TRANSLATOR(Tie_engraver);