]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/accidental-engraver.cc
* Another grand 2003 update.
[lilypond.git] / lily / accidental-engraver.cc
index 0c00497d0918ac726b7b753b373d3ca3b489d2e0..4e94fc2d9955385d4eed156b0d9689e56e684ea4 100644 (file)
@@ -1,12 +1,12 @@
 /*
   accidental-engraver.cc -- implement accidental_engraver
 
-  (c)  1997--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-  Modified 2001-2002 by Rune Zedeler <rz@daimi.au.dk>
+  (c)  1997--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  Modified 2001--2002 by Rune Zedeler <rz@daimi.au.dk>
 */
 
-#include "musical-request.hh"
-#include "command-request.hh"
+#include "event.hh"
+
 #include "item.hh"
 #include "tie.hh"
 #include "rhythmic-head.hh"
@@ -16,7 +16,6 @@
 #include "engraver.hh"
 #include "arpeggio.hh"
 #include "warn.hh"
-
 #include "translator-group.hh"
 
 /**
@@ -32,7 +31,7 @@ tweakable.
 
 struct Accidental_entry {
   bool done_;
-  Note_req * melodic_;
+  Music * melodic_;
   Grob * accidental_;
   Translator_group *origin_;
   Grob*  head_;
@@ -71,19 +70,16 @@ public:
     Urgh. Since the accidentals depend on lots of variables, we have to
     store all information before we can really create the accidentals.
   */
-  Link_array<Grob> arpeggios_;
+  Link_array<Grob> left_objects_;
+  Link_array<Grob> right_objects_;
 
   Grob * accidental_placement_;
-  
 
   /*
     The next 
    */
   Array<Accidental_entry> accidentals_;
-  
   Link_array<Grob> ties_;
-
-
 };
 
 
@@ -125,12 +121,12 @@ calculates the number of accidentals on basis of the current local key sig
 
 */
 static int
-number_accidentals (SCM sig, Note_req * note, Pitch *pitch, SCM curbarnum, SCM lazyness, 
+number_accidentals (SCM sig, Music * note, Pitch *pitch, SCM curbarnum, SCM lazyness, 
                    bool ignore_octave_b)
 {
-  int n = pitch->notename_;
-  int o = pitch->octave_;
-  int a = pitch->alteration_;
+  int n = pitch->get_notename ();
+  int o = pitch->get_octave();
+  int a = pitch->get_alteration ();
   int curbarnum_i = gh_scm2int (curbarnum);
   int accbarnum_i = 0;
 
@@ -158,9 +154,7 @@ number_accidentals (SCM sig, Note_req * note, Pitch *pitch, SCM curbarnum, SCM l
   int p = gh_number_p (prev_acc) ? gh_scm2int (prev_acc) : 0;
 
   int num;
-  if (a == p
-      && !to_boolean (note->get_mus_property ("force-accidental"))
-      && gh_number_p (prev_acc))
+  if (a == p && gh_number_p (prev_acc))
     num = 0;
   else if ( (abs (a)<abs (p) || p*a<0) && a != 0 )
     num = 2;
@@ -171,7 +165,7 @@ number_accidentals (SCM sig, Note_req * note, Pitch *pitch, SCM curbarnum, SCM l
 }
 
 static int
-number_accidentals (Note_req * note, Pitch *pitch, Translator_group * origin, 
+number_accidentals (Music * note, Pitch *pitch, Translator_group * origin, 
                    SCM accidentals, SCM curbarnum)
 {
   int number = 0;
@@ -239,7 +233,9 @@ Accidental_engraver::process_acknowledged_grobs ()
       SCM accidentals =  get_property ("autoAccidentals");
       SCM cautionaries =  get_property ("autoCautionaries");
       SCM barnum = get_property ("currentBarNumber");
-
+      SCM smp = get_property("measurePosition");
+      Moment mp = (unsmob_moment (smp)) ? *unsmob_moment (smp) : Moment (0);
+      if(mp.main_part_<Rational(0) && gh_number_p(barnum)) barnum = scm_int2num(gh_scm2int(barnum)-1);
       bool extra_natural_b = get_property ("extraNatural") == SCM_BOOL_T;
       for (int i = 0; i  < accidentals_.size (); i++) 
        {
@@ -247,7 +243,7 @@ Accidental_engraver::process_acknowledged_grobs ()
            continue;
          accidentals_[i].done_  = true;
          Grob * support = accidentals_[i].head_;
-         Note_req * note = accidentals_[i].melodic_;
+         Music * note = accidentals_[i].melodic_;
          Translator_group * origin = accidentals_[i].origin_;
 
          Pitch * pitch = unsmob_pitch (note->get_mus_property ("pitch"));
@@ -260,6 +256,9 @@ Accidental_engraver::process_acknowledged_grobs ()
              num = num_caut;
              cautionary = true;
            }
+
+         if(num==0 && to_boolean (note->get_mus_property ("force-accidental")))
+            num=1;
          
          bool different = num < 0;
          num = abs (num);
@@ -301,7 +300,7 @@ Accidental_engraver::process_acknowledged_grobs ()
              announce_grob (a, SCM_EOL);
 
              
-             SCM accs = gh_cons (scm_int2num (pitch->alteration_), SCM_EOL);
+             SCM accs = gh_cons (scm_int2num (pitch->get_alteration ()), SCM_EOL);
              if (num == 2 && extra_natural_b)
                accs = gh_cons (scm_int2num (0), accs);
 
@@ -331,8 +330,10 @@ Accidental_engraver::process_acknowledged_grobs ()
        accidentals. 
        
       */
-             for (int i = 0;  i < arpeggios_.size ();  i++)
-               Side_position_interface::add_support (arpeggios_[i], a);
+             for (int i = 0;  i < left_objects_.size ();  i++)
+               Side_position_interface::add_support (left_objects_[i], a);
+             for (int i = 0;  i < right_objects_.size ();  i++)
+               Side_position_interface::add_support (a, right_objects_[i]);
            }
          
 
@@ -345,9 +346,9 @@ Accidental_engraver::process_acknowledged_grobs ()
          */
          
 
-         int n = pitch->notename_;
-         int o = pitch->octave_;
-         int a = pitch->alteration_;
+         int n = pitch->get_notename ();
+         int o = pitch->get_octave ();
+         int a = pitch->get_alteration ();
          SCM on_s = gh_cons (scm_int2num (o), scm_int2num (n));
 
          /*
@@ -419,16 +420,19 @@ Accidental_engraver::stop_translation_timestep ()
   accidental_placement_ = 00;
   
   accidentals_.clear();
-  arpeggios_.clear ();
+  left_objects_.clear ();
+  right_objects_.clear ();
   ties_.clear ();
 }
 
 void
 Accidental_engraver::acknowledge_grob (Grob_info info)
 {
-  Note_req * note =  dynamic_cast <Note_req *> (info.music_cause ());
+  Music * note =  info.music_cause ();
 
-  if (note && Rhythmic_head::has_interface (info.grob_))
+  if (note
+      && note->is_mus_type("note-event")
+      && Rhythmic_head::has_interface (info.grob_))
     {
       Accidental_entry entry ;
       entry.head_ = info.grob_;
@@ -443,9 +447,12 @@ Accidental_engraver::acknowledge_grob (Grob_info info)
     }
   else if (Arpeggio::has_interface (info.grob_))
     {
-      arpeggios_.push (info.grob_); 
+      left_objects_.push (info.grob_); 
+    }
+  else if (info.grob_->internal_has_interface (ly_symbol2scm("finger-interface")))
+    {
+      left_objects_.push (info.grob_); 
     }
-  
 }
 
 void
@@ -475,11 +482,11 @@ Accidental_engraver::process_music ()
 
 
 ENTER_DESCRIPTION (Accidental_engraver,
-"Make accidentals.  Catches note heads, ties and notices key-change
-events.  Due to interaction with ties (which don't come together
-with note heads), this needs to be in a context higher than Tie_engraver.",
-                  
+"Make accidentals.  Catches note heads, ties and notices key-change "
+" events.  Due to interaction with ties (which don't come together "
+" with note heads), this needs to be in a context higher than Tie_engraver.",
               "Accidental",
-              "rhythmic-head-interface tie-interface arpeggio-interface",
+/* accepts */     "",
+              "finger-interface rhythmic-head-interface tie-interface arpeggio-interface",
               "localKeySignature extraNatural autoAccidentals autoCautionaries",
                   "localKeySignature");