]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/figured-bass-engraver.cc
Run `make grand-replace'.
[lilypond.git] / lily / figured-bass-engraver.cc
index 2c3ad0e9e13f7e32aff384466e6f29734a95bfb5..8a06ea3a1b8471ef5fcfee3ab3229d25e1f3c3ee 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
@@ -28,6 +28,9 @@ struct Figure_group
   
   SCM number_;
   SCM alteration_;
+  SCM augmented_;
+  SCM diminished_;
+  SCM augmented_slash_;
   
   Item *figure_item_; 
   Stream_event *current_event_;
@@ -40,6 +43,9 @@ struct Figure_group
     continuation_line_ = 0;
     number_ = SCM_EOL;
     alteration_ = SCM_EOL;
+    augmented_ = SCM_EOL;
+    diminished_ = SCM_EOL;
+    augmented_slash_ = SCM_EOL;
     group_ = 0;
     current_event_ = 0;
   }
@@ -51,14 +57,20 @@ struct Figure_group
       && ly_is_equal (number_,
                      current_event_->get_property ("figure"))
       && ly_is_equal (alteration_,
-                     current_event_->get_property ("alteration"));
+                     current_event_->get_property ("alteration"))
+      && ly_is_equal (augmented_,
+                     current_event_->get_property ("augmented"))
+      && ly_is_equal (diminished_,
+                     current_event_->get_property ("diminished"))
+      && ly_is_equal (augmented_slash_,
+                     current_event_->get_property ("augmented-slash"));
   }
 };
 
 struct Figured_bass_engraver : public Engraver
 {
-  TRANSLATOR_DECLARATIONS(Figured_bass_engraver);
-  void clear_spanners();
+  TRANSLATOR_DECLARATIONS (Figured_bass_engraver);
+  void clear_spanners ();
   void add_brackets ();
   void create_grobs ();
 
@@ -91,6 +103,9 @@ Figured_bass_engraver::derived_mark () const
     {
       scm_gc_mark (groups_[i].number_);
       scm_gc_mark (groups_[i].alteration_);
+      scm_gc_mark (groups_[i].augmented_);
+      scm_gc_mark (groups_[i].diminished_);
+      scm_gc_mark (groups_[i].augmented_slash_);
     }
 }
 
@@ -142,7 +157,12 @@ Figured_bass_engraver::listen_rest (Stream_event *ev)
   if (to_boolean (get_property ("ignoreFiguredBassRest")))
     {
       new_event_found_ = true;
-      ASSIGN_EVENT_ONCE (rest_event_, ev);
+
+      /*
+       No ASSIGN_EVENT_ONCE () ; otherwise we get warnings about
+       polyphonic rests.
+       */
+      rest_event_ = ev;
     }
 }
 
@@ -151,7 +171,7 @@ void
 Figured_bass_engraver::listen_bass_figure (Stream_event *ev)
 {
   new_event_found_ = true;
-  Moment stop  = now_mom () + get_event_length (ev);
+  Moment stop  = now_mom () + get_event_length (ev, now_mom ());
   stop_moment_ = max (stop_moment_, stop);
 
   if (to_boolean (get_property ("useBassFigureExtenders")))
@@ -179,13 +199,13 @@ Figured_bass_engraver::center_continuations (vector<Spanner*> const &consecutive
   if (consecutive_lines.size () == 2)
     {
       vector<Grob*> left_figs;
-      for (vsize j = consecutive_lines.size(); j--;)
+      for (vsize j = consecutive_lines.size (); j--;)
        left_figs.push_back (consecutive_lines[j]->get_bound (LEFT));
 
       SCM  ga = Grob_array::make_array ();
       unsmob_grob_array (ga)->set_array (left_figs);
 
-      for (vsize j = consecutive_lines.size(); j--;)
+      for (vsize j = consecutive_lines.size (); j--;)
        consecutive_lines[j]->set_object ("figures",
                                          unsmob_grob_array (ga)->smobbed_copy ());
     }
@@ -195,14 +215,14 @@ void
 Figured_bass_engraver::center_repeated_continuations ()
 {  
   vector<Spanner*> consecutive_lines;
-  for (vsize i = 0; i <= groups_.size(); i++)
+  for (vsize i = 0; i <= groups_.size (); i++)
     {
       if (i < groups_.size ()
          && groups_[i].continuation_line_
          && (consecutive_lines.empty ()
-             || (consecutive_lines[0]->get_bound(LEFT)->get_column ()
+             || (consecutive_lines[0]->get_bound (LEFT)->get_column ()
                  == groups_[i].continuation_line_->get_bound (LEFT)->get_column ()
-                 && consecutive_lines[0]->get_bound(RIGHT)->get_column ()
+                 && consecutive_lines[0]->get_bound (RIGHT)->get_column ()
                  == groups_[i].continuation_line_->get_bound (RIGHT)->get_column ())))
        consecutive_lines.push_back (groups_[i].continuation_line_);      
       else 
@@ -226,7 +246,7 @@ Figured_bass_engraver::clear_spanners ()
     }
 
   if (to_boolean (get_property ("figuredBassCenterContinuations")))
-    center_repeated_continuations();
+    center_repeated_continuations ();
   
   for (vsize i = 0; i < groups_.size (); i++)
     {
@@ -281,7 +301,7 @@ Figured_bass_engraver::add_brackets ()
 void
 Figured_bass_engraver::process_music ()
 {
-  if (!to_boolean (get_property ("useBassFigureExtenders")))
+  if (alignment_ && !to_boolean (get_property ("useBassFigureExtenders")))
     clear_spanners ();
         
   if (rest_event_)
@@ -343,13 +363,16 @@ Figured_bass_engraver::process_music ()
        {
          groups_[i].number_ = SCM_BOOL_F;
          groups_[i].alteration_ = SCM_BOOL_F;
+         groups_[i].augmented_ = SCM_BOOL_F;
+         groups_[i].diminished_ = SCM_BOOL_F;
+         groups_[i].augmented_slash_ = SCM_BOOL_F;
        }
     }
 
   if (use_extenders)
     {
       vector<int> junk_continuations;
-      for (vsize i = 0; i < groups_.size(); i++)
+      for (vsize i = 0; i < groups_.size (); i++)
        {
          Figure_group &group = groups_[i];
 
@@ -357,7 +380,8 @@ Figured_bass_engraver::process_music ()
            {
              if (!group.continuation_line_)
                {
-                 Spanner * line = make_spanner ("BassFigureContinuation", SCM_EOL);
+                 Spanner * line
+                   = make_spanner ("BassFigureContinuation", SCM_EOL);
                  Item * item = group.figure_item_;
                  group.continuation_line_ = line;
                  line->set_bound (LEFT, item);
@@ -384,7 +408,7 @@ Figured_bass_engraver::process_music ()
        {
          for (vsize i = 0; i <= junk_continuations.size (); i++)
            {
-             if (i < junk_continuations.size()
+             if (i < junk_continuations.size ()
                  && (i == 0 || junk_continuations[i-1] == junk_continuations[i] - 1))
                consecutive.push_back (groups_[junk_continuations[i]].continuation_line_);
              else 
@@ -407,7 +431,8 @@ Figured_bass_engraver::process_music ()
 void
 Figured_bass_engraver::create_grobs () 
 {
-  Grob *muscol = dynamic_cast<Item*> (unsmob_grob (get_property ("currentMusicalColumn")));
+  Grob *muscol
+    = dynamic_cast<Item*> (unsmob_grob (get_property ("currentMusicalColumn")));
   if (!alignment_)
     {
       alignment_ = make_spanner ("BassFigureAlignment", SCM_EOL);
@@ -416,7 +441,7 @@ Figured_bass_engraver::create_grobs ()
   alignment_->set_bound (RIGHT, muscol);
 
   SCM proc = get_property ("figuredBassFormatter");
-  for (vsize i = 0; i < groups_.size(); i++)
+  for (vsize i = 0; i < groups_.size (); i++)
     {
       Figure_group &group = groups_[i];
       
@@ -444,6 +469,9 @@ Figured_bass_engraver::create_grobs ()
          
          group.number_ = fig;
          group.alteration_ = group.current_event_->get_property ("alteration");
+         group.augmented_ = group.current_event_->get_property ("augmented");
+         group.diminished_ = group.current_event_->get_property ("diminished");
+         group.augmented_slash_ = group.current_event_->get_property ("augmented-slash");
 
          SCM text = group.current_event_->get_property ("text");
          if (!Text_interface::is_markup (text)
@@ -477,15 +505,14 @@ Figured_bass_engraver::create_grobs ()
 
 ADD_TRANSLATOR (Figured_bass_engraver,
                /* doc */
-
                "Make figured bass numbers.",
+
                /* create */
                "BassFigure "
                "BassFigureAlignment "
                "BassFigureBracket "
                "BassFigureContinuation "
-               "BassFigureLine "
-               ,
+               "BassFigureLine ",
 
                /* read */
                "figuredBassAlterationDirection "
@@ -493,8 +520,8 @@ ADD_TRANSLATOR (Figured_bass_engraver,
                "figuredBassFormatter "
                "implicitBassFigures "
                "useBassFigureExtenders "
-               "ignoreFiguredBassRest "
-               ,
+               "ignoreFiguredBassRest ",
 
                /* write */
-               "");
+               ""
+               );