]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/staff-switching-translator.cc
release: 1.2.15
[lilypond.git] / lily / staff-switching-translator.cc
index ffeda7fc2646157195ad4e34e45fb5109f0c357b..1d1809ed84e83754811f394631a5ec89f703dad4 100644 (file)
@@ -9,16 +9,20 @@
 #include "engraver.hh"
 #include "interpretation-context-handle.hh"
 #include "drul-array.hh"
-#include "engraver-group.hh"
+#include "engraver-group-engraver.hh"
 #include "musical-request.hh"
 
 class Staff_switching_translator : public Engraver
 {
   Interpretation_context_handle my_voice_;
   Drul_array<Interpretation_context_handle> staff_handle_drul_;
+
+  int switch_pitch_i_ ;
 protected:
   virtual bool do_try_music (Music* m);
   virtual void do_creation_processing ();
+
+  void default_voice (Direction);
 public:
   Staff_switching_translator ();
   VIRTUAL_COPY_CONS(Translator);
@@ -26,6 +30,7 @@ public:
 
 Staff_switching_translator::Staff_switching_translator ()
 {
+  switch_pitch_i_ =0;
 }
 
 void
@@ -33,13 +38,31 @@ Staff_switching_translator::do_creation_processing ()
 {
   Translator_group * daddy =daddy_grav_l (); // staff switching context
 
-  staff_handle_drul_[UP].set_translator (daddy->daddy_trans_l_ -> find_create_translator_l ("Staff", "upper"));
-  staff_handle_drul_[DOWN].set_translator (daddy->daddy_trans_l_-> find_create_translator_l ("Staff", "lower"));  
+
+  Scalar pit = get_property ("switchPitch", 0);
+  if (pit.isnum_b ())
+    switch_pitch_i_ = int (pit);
+  Scalar s = get_property("staffContextName", 0);
+  Scalar up = get_property ("upStaffName",0);
+  Scalar down = get_property ("downStaffName",0);
+  if (!up.length_i()) up = "upper";
+  if (!down.length_i()) up = "lower";  
+  
+  staff_handle_drul_[UP].set_translator (daddy->daddy_trans_l_ -> find_create_translator_l (s, up));
+  staff_handle_drul_[DOWN].set_translator (daddy->daddy_trans_l_-> find_create_translator_l (s, down));  
 
 
   staff_handle_drul_[DOWN].report_to_l ()->set_property ("defaultClef", "bass");
+
+  default_voice (UP);
+}
   
-  my_voice_.set_translator (staff_handle_drul_[UP].report_to_l ()->find_create_translator_l ("Voice", daddy->id_str_));
+
+void
+Staff_switching_translator::default_voice (Direction d)
+{
+  Scalar s = get_property ("acceptorName",0);
+  my_voice_.set_translator (staff_handle_drul_[d].report_to_l ()->find_create_translator_l ("Thread", daddy_trans_l_->id_str_));
 }
 
 bool
@@ -47,13 +70,23 @@ Staff_switching_translator::do_try_music (Music*m)
 {
   if (Note_req*nr = dynamic_cast<Note_req*> (m))
     {
-      Direction staff =  (nr->pitch_.semitone_pitch () >= 0)
+      Direction staff =  (nr->pitch_.semitone_pitch () >= switch_pitch_i_)
        ? UP
        : DOWN;
 
 
       Translator_group * mv = my_voice_.report_to_l ();
       Translator_group *dest_staff =staff_handle_drul_[staff].report_to_l ();
+      Scalar s = get_property ("switcherName", 0);
+      
+      while (mv && mv->type_str_ != s)
+       {
+         mv = mv -> daddy_trans_l_;
+       }
+
+      if (!mv)
+       default_voice (staff);
+
       if (mv->daddy_trans_l_  != dest_staff)
        {
          mv->daddy_trans_l_->remove_translator_p (mv);