]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/figured-bass-engraver.cc
Merge branch 'master' of git://git.sv.gnu.org/lilypond
[lilypond.git] / lily / figured-bass-engraver.cc
index a300df86d496d3ef10cf6889226370303ab2ad05..a73cdf6bd8b845eacf044368c1c9e7f175a08252 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--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 */
 
@@ -57,8 +57,8 @@ struct Figure_group
 
 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 ();
 
@@ -129,15 +129,26 @@ Figured_bass_engraver::start_translation_timestep ()
   new_events_.clear ();
   for (vsize i = 0; i < groups_.size (); i++)
     groups_[i].current_event_ = 0;
+
   continuation_ = false;
+
+  
 }
 
 IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, rest);
 void
 Figured_bass_engraver::listen_rest (Stream_event *ev)
 {
-  new_event_found_ = true;
-  ASSIGN_EVENT_ONCE (rest_event_, ev);
+  if (to_boolean (get_property ("ignoreFiguredBassRest")))
+    {
+      new_event_found_ = true;
+
+      /*
+       No ASSIGN_EVENT_ONCE () ; otherwise we get warnings about
+       polyphonic rests.
+       */
+      rest_event_ = ev;
+    }
 }
 
 IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, bass_figure);
@@ -145,23 +156,25 @@ 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);
 
-  SCM fig = ev->get_property ("figure");
-  for (vsize i = 0; i < groups_.size (); i++)
+  if (to_boolean (get_property ("useBassFigureExtenders")))
     {
-      if (!groups_[i].current_event_
-         && ly_is_equal (groups_[i].number_, fig))
+      SCM fig = ev->get_property ("figure");
+      for (vsize i = 0; i < groups_.size (); i++)
        {
-         groups_[i].current_event_ = ev;
-         groups_[i].force_no_continuation_
-           = to_boolean (ev->get_property ("no-continuation"));
-         continuation_ = true;
-         return; 
+         if (!groups_[i].current_event_
+             && ly_is_equal (groups_[i].number_, fig))
+           {
+             groups_[i].current_event_ = ev;
+             groups_[i].force_no_continuation_
+               = to_boolean (ev->get_property ("no-continuation"));
+             continuation_ = true;
+             return; 
+           }
        }
-    }
-  
+    }  
   new_events_.push_back (ev);
 }
 
@@ -171,13 +184,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 ());
     }
@@ -187,14 +200,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 
@@ -218,7 +231,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++)
     {
@@ -273,6 +286,9 @@ Figured_bass_engraver::add_brackets ()
 void
 Figured_bass_engraver::process_music ()
 {
+  if (alignment_ && !to_boolean (get_property ("useBassFigureExtenders")))
+    clear_spanners ();
+        
   if (rest_event_)
     {
       clear_spanners ();
@@ -338,9 +354,9 @@ Figured_bass_engraver::process_music ()
   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];
+         Figure_group &group = groups_[i];
 
          if (group.is_continuation ())
            {
@@ -373,7 +389,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 
@@ -405,7 +421,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];
       
@@ -475,8 +491,6 @@ ADD_TRANSLATOR (Figured_bass_engraver,
                "BassFigureContinuation "
                "BassFigureLine "
                ,
-               /* accept */
-               "bass-figure-event rest-event",
 
                /* read */
                "figuredBassAlterationDirection "
@@ -484,6 +498,7 @@ ADD_TRANSLATOR (Figured_bass_engraver,
                "figuredBassFormatter "
                "implicitBassFigures "
                "useBassFigureExtenders "
+               "ignoreFiguredBassRest "
                ,
 
                /* write */