]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/stem-engraver.cc
*** empty log message ***
[lilypond.git] / lily / stem-engraver.cc
index eb2bf92e110b117d1f24af216fad492ba2fefb0c..7535d3916286b5d5ac4c32f49b90655d61e9866d 100644 (file)
@@ -3,13 +3,13 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c)  1997--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c)  1997--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
 
 #include "staff-symbol-referencer.hh"
 #include "rhythmic-head.hh"
 #include "stem.hh"
-#include "musical-request.hh"
+#include "event.hh"
 #include "misc.hh"
 #include "stem-tremolo.hh"
 #include "item.hh"
@@ -32,8 +32,8 @@ protected:
 private:
   Grob  *stem_;
   Grob *tremolo_;
-  Rhythmic_req *rhythmic_req_;
-  Tremolo_req* tremolo_req_;
+  Music *rhythmic_req_;
+  Music* tremolo_req_;
 };
 
 Stem_engraver::Stem_engraver ()
@@ -57,9 +57,10 @@ Stem_engraver::acknowledge_grob (Grob_info i)
       /* Reverted to the old method so chord tremolos work again. /MB 
       */
       int duration_log = 0;
-      Rhythmic_req *rhythmic_req = dynamic_cast <Rhythmic_req *> (i.music_cause ()); 
-      if (rhythmic_req)
-       duration_log = unsmob_duration (rhythmic_req->get_mus_property ("duration"))-> duration_log (); 
+
+      Music * m = i.music_cause ();
+      if (m->is_mus_type ("rhythmic-event"))
+       duration_log = unsmob_duration (m->get_mus_property ("duration"))-> duration_log (); 
       
       if (!stem_) 
        {
@@ -79,14 +80,24 @@ Stem_engraver::acknowledge_grob (Grob_info i)
                the first and last (quarter) note bothe get one tremolo flag.
               */
              int requested_type = gh_scm2int (tremolo_req_->get_mus_property ("tremolo-type"));
-             
              SCM f = get_property ("tremoloFlags");
-             if (!requested_type && gh_number_p (f))
-               requested_type = gh_scm2int (f);
+             if (!requested_type)
+               if (gh_number_p (f))
+                 requested_type = gh_scm2int (f);
+               else
+                 requested_type = 8; 
              else
                daddy_trans_->set_property ("tremoloFlags", gh_int2scm (requested_type));
 
-             if (requested_type)
+             int tremolo_flags = intlog2 (requested_type) - 2
+               - (duration_log > 2 ? duration_log - 2 : 0);
+             if (tremolo_flags <= 0)
+               {
+                 tremolo_req_->origin()->warning (_("tremolo duration is too long"));
+                 tremolo_flags = 0;
+               }
+
+             if (tremolo_flags)
                {
                  tremolo_ = new Item (get_property ("StemTremolo"));
                  announce_grob(tremolo_, tremolo_req_->self_scm());
@@ -96,11 +107,7 @@ Stem_engraver::acknowledge_grob (Grob_info i)
                    the tremolo-type minus the number of flags of the note
                    itself.
                   */
-                 int tremolo_flags = intlog2 (requested_type) - 2
-                   - (duration_log > 2 ? duration_log - 2 : 0);
-                 if (tremolo_flags < 0)
-                   tremolo_flags = 0;
-                 tremolo_->set_grob_property ("flag-count",
+                         tremolo_->set_grob_property ("flag-count",
                                                gh_int2scm (tremolo_flags));
                  tremolo_->set_parent (stem_, X_AXIS);
                }
@@ -114,7 +121,9 @@ Stem_engraver::acknowledge_grob (Grob_info i)
 
       if (Stem::duration_log (stem_) != duration_log)
        {
-         i.music_cause ()->origin ()->warning (_f ("Adding note head to incompatible stem (type = %d)", 1 <<  Stem::duration_log (stem_)));
+         i.music_cause ()->origin ()->warning (_f ("Adding note head to incompatible stem (type = %d)", 1 <<  Stem::duration_log (stem_))
+                                               + _f ("Don't you want polyphonic voices instead?")
+                                               );
        }
 
       Stem::add_head (stem_,h);
@@ -146,24 +155,6 @@ Stem_engraver::stop_translation_timestep ()
          daddy_trans_->unset_property (ly_symbol2scm ("stemRightBeamCount"));
        }
 
-      
-      // UGH. Should mark non-forced instead.
-      /*
-        aargh: I don't get it.  direction is being set (and then set
-        to forced), if we have a Chord_tremolo.
-       */
-
-      /*
-       Why the separate check for forced directions? --hwn.
-
-       (docme)
-       */
-      SCM dir = stem_->get_grob_property ("direction");
-      if (gh_number_p (dir) && to_dir (dir))
-       {
-         stem_->set_grob_property ("dir-forced", SCM_BOOL_T);    
-       }
-
       typeset_grob (stem_);
       stem_ = 0;
     }
@@ -175,18 +166,19 @@ Stem_engraver::stop_translation_timestep ()
 bool
 Stem_engraver::try_music (Music* r)
 {
-  if (Tremolo_req* a = dynamic_cast <Tremolo_req *> (r))
+  if (r->is_mus_type ("tremolo-event"))
     {
-      tremolo_req_ = a;
+      tremolo_req_ = r;
       return true;
     }
   return false;
 }
 
 ENTER_DESCRIPTION(Stem_engraver,
-/* descr */       "Create stems and single-stem tremolos.  It also works together with
-the beam engraver for overriding beaming.",
+/* descr */       "Create stems and single-stem tremolos.  It also works together with "
+"the beam engraver for overriding beaming.",
 /* creats*/       "Stem StemTremolo",
-/* acks  */       "rhythmic-head-interface",
+/* accepts */     "tremolo-event",
+/* acks  */      "rhythmic-head-interface",
 /* reads */       "tremoloFlags stemLeftBeamCount stemRightBeamCount",
 /* write */       "");