]> git.donarmstrong.com Git - lilypond.git/commitdiff
* scm/define-context-properties.scm
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Thu, 17 Nov 2005 21:12:19 +0000 (21:12 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Thu, 17 Nov 2005 21:12:19 +0000 (21:12 +0000)
(all-user-translation-properties): rename figuredBassFormatter
from newFiguredBassFormatter.

* scm/define-grobs.scm (all-grob-descriptions): move from NewBassFigure

* lily/figured-bass-engraver.cc: move from new-figured-bass-engraver.cc

* lily/beam.cc (calc_beaming): new function.
(calc_shorten): new function.

* THANKS: add Edward Neeman.

* scm/define-grobs.scm (all-grob-descriptions): add Y-offset property.

ChangeLog
THANKS
lily/beam.cc
lily/figured-bass-engraver.cc
lily/new-figured-bass-engraver.cc [deleted file]
ly/engraver-init.ly
scm/define-context-properties.scm
scm/define-grobs.scm
scm/translation-functions.scm

index dee05a0421bbd87953176bbe09103c34bffca015..91749521d787d223e83ae57b3660f620043f5365 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2005-11-17  Han-Wen Nienhuys  <hanwen@xs4all.nl>
 
+       * scm/define-context-properties.scm
+       (all-user-translation-properties): rename figuredBassFormatter
+       from newFiguredBassFormatter.
+
+       * scm/define-grobs.scm (all-grob-descriptions): move from NewBassFigure
+
+       * lily/figured-bass-engraver.cc: move from new-figured-bass-engraver.cc
+
        * lily/stem.cc (calc_stem_info): trigger beaming calculation.
 
        * lily/beam.cc (calc_beaming): new function.
diff --git a/THANKS b/THANKS
index 7483c5586f4ba3503ff275c0b0f8745e07078dd3..9d76cdc643e1c1f98a8f31f6157dcc47f5581ea2 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -55,6 +55,7 @@ Michael Welsh Duggan
 Milan Zamazal
 Ralph Little
 Scott Russell
+Sven Axelsson
 Thomas Bushnell BSG
 Trevor Bača
 Vicente Solsona Dellá
index 4b6bfa3024f6e0f4b60dfca63d1124022ebfe878..806130862c0f411f3ff39044046cdf04ed44beb9 100644 (file)
@@ -273,7 +273,7 @@ Beam::calc_beaming (SCM smob)
        }
     }
 
-  return SCM_BOOL_T;
+  return SCM_EOL;
 }
 
 /*
@@ -1388,7 +1388,8 @@ ADD_INTERFACE (Beam,
 
               "A beam. \n\n"
               "The @code{thickness} property is the weight of beams, "
-              "measured in staffspace.  The @code{direction} property is not user-serviceable. Use "
+              "measured in staffspace.  The @code{direction} "
+              "property is not user-serviceable. Use "
               "the @code{direction} property of @code{Stem} instead. "
 
               ,
@@ -1396,6 +1397,7 @@ ADD_INTERFACE (Beam,
               /* properties */
               "auto-knee-gap "
               "beamed-stem-shorten "
+              "beaming "
               "break-overshoot "
               "chord-tremolo "
               "concaveness "
index b72b0b91e45f83da4a1a5d0a995ac59bbdb8009d..16132f778ab0a6d7ee5fcc2ad6313d6042d60667 100644 (file)
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
 */
 
 #include "engraver.hh"
-#include "text-interface.hh"
-#include "item.hh"
+
 #include "context.hh"
+#include "music.hh"
+#include "item.hh"
+#include "spanner.hh"
+#include "axis-group-interface.hh"
+#include "align-interface.hh"
+#include "pointer-group-interface.hh"
+#include "text-interface.hh"
+#include "grob-array.hh"
+
 
 #include "translator.icc"
 
-class Figured_bass_engraver : public Engraver
+struct Figure_group
 {
-  TRANSLATOR_DECLARATIONS (Figured_bass_engraver);
-protected:
-  Link_array<Music> figures_;
-  Music *rest_event_;
+  Spanner *group_;
+  Spanner *continuation_line_;
+  
+  SCM number_;
+  SCM alteration_;
+  
+  Item *figure_item_; 
+  Music *current_music_;
+  bool force_no_continuation_;
+  
+  Figure_group ()
+  {
+    figure_item_ = 0;
+    force_no_continuation_ = false;
+    continuation_line_ = 0;
+    number_ = SCM_EOL;
+    alteration_ = SCM_EOL;
+    group_ = 0;
+    current_music_ = 0;
+  }
+  bool is_continuation () const
+  {
+    return
+      current_music_
+      && !force_no_continuation_
+      && ly_is_equal (number_,
+                     current_music_->get_property ("figure"))
+      && ly_is_equal (alteration_,
+                     current_music_->get_property ("alteration"));
+  }
+};
 
-  Grob *figure_;
+struct Figured_bass_engraver : public Engraver
+{
+  TRANSLATOR_DECLARATIONS(Figured_bass_engraver);
+  void clear_spanners();
+  void add_brackets ();
+  void create_grobs ();
 
+  void center_continuations (Link_array<Spanner> const &consecutive_lines);
+  void center_repeated_continuations ();
+protected:
+  Array<Figure_group> groups_;
+  Spanner *alignment_;
+  Link_array<Music> new_musics_;
+  bool continuation_;
+  bool new_music_found_;
+  
+  Moment stop_moment_;
+  Music *rest_event_; 
+  
   virtual bool try_music (Music *);
+  virtual void derived_mark () const; 
+
+  void start_translation_timestep ();
   void stop_translation_timestep ();
   void process_music ();
 };
 
-Figured_bass_engraver::Figured_bass_engraver ()
+void
+Figured_bass_engraver::derived_mark () const
 {
-  figure_ = 0;
-  rest_event_ = 0;
+  for (int i = 0; i < groups_.size (); i++)
+    {
+      scm_gc_mark (groups_[i].number_);
+      scm_gc_mark (groups_[i].alteration_);
+    }
 }
 
 void
 Figured_bass_engraver::stop_translation_timestep ()
 {
-  figure_ = 0;
+  if (groups_.is_empty ()
+      || now_mom ().main_part_ < stop_moment_.main_part_)
+    return ;
+  
+  bool found = false;
+  for (int i = 0; !found && i < groups_.size (); i++)
+    found  = found  || groups_[i].current_music_;
 
-  figures_.clear ();
+  if (!found)
+    clear_spanners ();
+}
+
+Figured_bass_engraver::Figured_bass_engraver ()
+{
+  alignment_ = 0;
+  continuation_ = false;
+  rest_event_ = 0;
+  new_music_found_ = false;
+}
+
+void
+Figured_bass_engraver::start_translation_timestep ()
+{
+  if (now_mom ().main_part_ < stop_moment_.main_part_)
+    return ;
+  
   rest_event_ = 0;
+  new_musics_.clear ();
+  for (int i = 0; i < groups_.size (); i++)
+    {
+      groups_[i].current_music_ = 0;
+    }
+  continuation_ = false;
 }
 
 bool
 Figured_bass_engraver::try_music (Music *m)
 {
-  if (m->is_mus_type ("bass-figure-event"))
+  new_music_found_ = true;
+  if (m->is_mus_type ("rest-event"))
     {
-      figures_.push (m);
+      rest_event_ = m;
       return true;
     }
-  else if (m->is_mus_type ("rest-event"))
+  else
     {
-      rest_event_ = m;
+      stop_moment_ = now_mom () + m->get_length ();
+     
+      SCM fig = m->get_property ("figure");
+      for (int i = 0; i < groups_.size (); i++)
+       {
+         if (!groups_[i].current_music_
+             && ly_is_equal (groups_[i].number_, fig))
+           {
+             groups_[i].current_music_ = m;
+             groups_[i].force_no_continuation_
+               = to_boolean (m->get_property ("no-continuation"));
+             continuation_ = true;
+             return true; 
+           }
+       }
+
+      new_musics_.push (m);
+
       return true;
     }
-  return false;
+}
+
+void
+Figured_bass_engraver::center_continuations (Link_array<Spanner> const &consecutive_lines)
+{
+  if (consecutive_lines.size () == 2)
+    {
+      Link_array<Grob> left_figs;
+      for (int j = consecutive_lines.size(); j--;)
+       left_figs.push (consecutive_lines[j]->get_bound (LEFT));
+
+      SCM  ga = Grob_array::make_array ();
+      unsmob_grob_array (ga)->set_array (left_figs);
+
+      for (int j = consecutive_lines.size(); j--;)
+       consecutive_lines[j]->set_object ("figures",
+                                         unsmob_grob_array (ga)->smobbed_copy ());
+    }
+}
+
+void
+Figured_bass_engraver::center_repeated_continuations ()
+{  
+  Link_array<Spanner> consecutive_lines;
+  for (int i = 0; i <= groups_.size(); i++)
+    {
+      if (i < groups_.size ()
+         && groups_[i].continuation_line_
+         && (consecutive_lines.is_empty ()
+             || (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 ()
+                 == groups_[i].continuation_line_->get_bound (RIGHT)->get_column ())))
+       {
+         consecutive_lines.push (groups_[i].continuation_line_);         
+       }
+      else 
+       {
+         center_continuations (consecutive_lines);
+         consecutive_lines.clear ();
+       }
+    }
+}
+
+void
+Figured_bass_engraver::clear_spanners ()
+{
+  if (!alignment_)
+    return;
+  
+  alignment_ = 0;
+  if (to_boolean (get_property ("figuredBassCenterContinuations")))
+    center_repeated_continuations();
+  
+  groups_.clear ();
+}
+
+void
+Figured_bass_engraver::add_brackets ()
+{
+  Link_array<Grob> encompass;
+  bool inside = false;
+  for (int i = 0; i < groups_.size (); i ++)
+    {
+      if (!groups_[i].current_music_)
+       continue;
+      
+      if (to_boolean (groups_[i].current_music_->get_property ("bracket-start")))      
+       {
+         inside = true;
+       }
+
+      if (inside && groups_[i].figure_item_)
+       encompass.push (groups_[i].figure_item_);
+
+       if (to_boolean (groups_[i].current_music_->get_property ("bracket-stop")))
+       {
+         inside = false;
+
+         Item * brack = make_item ("BassFigureBracket", groups_[i].current_music_->self_scm ());
+         for (int j = 0; j < encompass.size (); j++)
+           {
+             Pointer_group_interface::add_grob (brack,
+                                                ly_symbol2scm ("elements"),
+                                                encompass[j]);
+           }
+         encompass.clear ();
+       }
+    }
 }
 
 void
@@ -63,31 +258,216 @@ Figured_bass_engraver::process_music ()
 {
   if (rest_event_)
     {
-      figure_ = make_item ("BassFigure", rest_event_->self_scm ());
-      figure_->set_property ("text", scm_makfrom0str ("-"));
+      clear_spanners ();
+      return;
+    }
+  
+  if (!continuation_
+      && new_musics_.is_empty ())
+    {
+      clear_spanners ();
+      return;
+    }
+
+  if (!new_music_found_)
+    return ;
+  
+  new_music_found_ = false;
+
+  /*
+    Don't need to sync alignments, if we're not using extenders. 
+   */
+  bool use_extenders = to_boolean (get_property ("useBassFigureExtenders"));
+  if (!use_extenders)
+    {
+      if (to_boolean (get_property ("figuredBassCenterContinuations")))
+       center_repeated_continuations ();
+      alignment_ = 0;
+      for (int i = 0; i < groups_.size (); i++)
+       {
+         groups_[i].group_ = 0;
+         groups_[i].continuation_line_ = 0;
+       }
+    }
+  
+  if (!continuation_)
+    {
+      clear_spanners ();
     }
-  else if (figures_.size ())
+  
+  int k = 0;
+  for (int i = 0; i < new_musics_.size (); i++)
     {
-      SCM proc = get_property ("bassFigureFormatFunction");
-      if (ly_is_procedure (proc))
+      while (k < groups_.size() &&
+            groups_[k].current_music_)
+       k++;
+      
+      if (k >= groups_.size ())
        {
-         SCM l = SCM_EOL;
-         SCM *t = &l;
-         for (int i = 0; i < figures_.size (); i++)
+         Figure_group group;
+         groups_.push (group);
+       }
+      
+      groups_[k].current_music_ = new_musics_[i];
+      groups_[k].figure_item_ = 0;
+      k++;
+    }
+
+  for (int i = 0; i < groups_.size (); i++)
+    {
+      if (!groups_[i].is_continuation ())
+       {
+         groups_[i].number_ = SCM_BOOL_F;
+         groups_[i].alteration_ = SCM_BOOL_F;
+       }
+    }
+
+  if (use_extenders)
+    {
+      Array<int> junk_continuations;
+      for (int i = 0; i < groups_.size(); i++)
+       {
+               Figure_group &group = groups_[i];
+
+         if (group.is_continuation ())
            {
-             *t = scm_cons (figures_[i]->self_scm (), SCM_EOL);
-             t = SCM_CDRLOC (*t);
+             if (!group.continuation_line_)
+               {
+                 Spanner * line = make_spanner ("BassFigureContinuation", SCM_EOL);
+                 Item * item = group.figure_item_;
+                 group.continuation_line_ = line;
+                 line->set_bound (LEFT, item);
+
+                 /*
+                   Don't add as child. This will cache the wrong
+                   (pre-break) stencil when callbacks are triggered.
+                 */
+                 line->set_parent (group.group_, Y_AXIS);
+                 Pointer_group_interface::add_grob (line, ly_symbol2scm ("figures"), item);
+
+                 group.figure_item_ = 0;
+               }
            }
-         figure_ = make_item ("BassFigure", figures_[0]->self_scm ());
-         scm_call_3 (proc, l, context ()->self_scm (),
-                     figure_->self_scm ());
+         else if (group.continuation_line_) 
+           junk_continuations.push (i); 
        }
+
+      /*
+       Ugh, repeated code.
+       */
+      Link_array<Spanner> consecutive;
+      for (int i = 0; i <= junk_continuations.size (); i++)
+       {
+         if (i < junk_continuations.size()
+             && (i == 0 || junk_continuations[i-1] == junk_continuations[i] - 1))
+           consecutive.push (groups_[junk_continuations[i]].continuation_line_);
+         else 
+           {
+             center_continuations (consecutive);
+             consecutive.clear ();
+             if (i < junk_continuations.size ())
+               consecutive.push (groups_[junk_continuations[i]].continuation_line_);
+           }
+       }
+      for (int i = 0; i < junk_continuations.size (); i++)
+       groups_[junk_continuations[i]].continuation_line_ = 0;
+    }
+  
+  create_grobs ();
+  add_brackets ();
+}
+
+void
+Figured_bass_engraver::create_grobs () 
+{
+  Grob *muscol = dynamic_cast<Item*> (unsmob_grob (get_property ("currentMusicalColumn")));
+  if (!alignment_)
+    {
+      alignment_ = make_spanner ("BassFigureAlignment", SCM_EOL);
+      alignment_->set_bound (LEFT, muscol);
+    }
+  alignment_->set_bound (RIGHT, muscol);
+
+  SCM proc = get_property ("figuredBassFormatter");
+  for (int i = 0; i < groups_.size(); i++)
+    {
+      Figure_group &group = groups_[i];
+      
+      if (group.current_music_)
+       {
+         Item *item
+           = make_item ("BassFigure",
+                        group.current_music_->self_scm ());
+
+         
+         SCM fig = group.current_music_->get_property ("figure");
+         if (!group.group_)
+           {
+             group.group_ = make_spanner ("BassFigureLine", SCM_EOL);
+             group.group_->set_bound (LEFT, muscol);
+             Align_interface::add_element (alignment_,
+                                           group.group_);
+           }
+
+         if (scm_memq (fig, get_property ("implicitBassFigures")) != SCM_BOOL_F)
+           {
+             item->set_property ("transparent", SCM_BOOL_T); 
+             item->set_property ("implicit", SCM_BOOL_T);
+           }
+         
+         group.number_ = fig;
+         group.alteration_ = group.current_music_->get_property ("alteration");
+
+         SCM text = group.current_music_->get_property ("text");
+         if (!Text_interface::is_markup (text)
+             && ly_is_procedure (proc))
+           {
+             text = scm_call_3 (proc, fig, group.current_music_->self_scm (),
+                                context ()->self_scm ());
+           }
+
+         item->set_property ("text", text);
+         
+         Axis_group_interface::add_element (group.group_, item);
+         group.figure_item_ = item;
+       }
+
+      if (group.continuation_line_)
+       {
+         /*
+           UGH should connect to the bass staff, and get the note heads. 
+         */
+         group.figure_item_->set_property ("transparent", SCM_BOOL_T);
+         group.continuation_line_->set_bound (RIGHT, group.figure_item_);
+       }
+
+      
+      if (groups_[i].group_)
+       groups_[i].group_->set_bound (RIGHT, muscol);
     }
+
 }
 
 ADD_TRANSLATOR (Figured_bass_engraver,
-               /* doc */ "Make figured bass numbers.",
-               /* create */ "BassFigure",
-               /* accept */ "rest-event bass-figure-event",
-               /* read */ "bassFigureFormatFunction",
-               /* write */ "");
+               /* doc */
+
+               "Make figured bass numbers.",
+               /* create */
+               "BassFigure "
+               "BassFigureAlignment "
+               "BassFigureBracket",
+               "BassFigureContinuation "
+               "BassFigureLine "
+
+               /* accept */
+               "bass-figure-event rest-event",
+
+               /* read */
+               "figuredBassCenterContinuations "
+               "implicitBassFigures "
+               "figuredBassFormatter "
+               "figuredBassAlterationDirection "
+               "useBassFigureExtenders",
+
+               /* write */
+               "");
diff --git a/lily/new-figured-bass-engraver.cc b/lily/new-figured-bass-engraver.cc
deleted file mode 100644 (file)
index f4beb0a..0000000
+++ /dev/null
@@ -1,473 +0,0 @@
-/*
-  new-figured-bass-engraver.cc -- implement New_figured_bass_engraver
-
-  source file of the GNU LilyPond music typesetter
-
-  (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
-
-*/
-
-#include "engraver.hh"
-
-#include "context.hh"
-#include "music.hh"
-#include "item.hh"
-#include "spanner.hh"
-#include "axis-group-interface.hh"
-#include "align-interface.hh"
-#include "pointer-group-interface.hh"
-#include "text-interface.hh"
-#include "grob-array.hh"
-
-
-#include "translator.icc"
-
-struct Figure_group
-{
-  Spanner *group_;
-  Spanner *continuation_line_;
-  
-  SCM number_;
-  SCM alteration_;
-  
-  Item *figure_item_; 
-  Music *current_music_;
-  bool force_no_continuation_;
-  
-  Figure_group ()
-  {
-    figure_item_ = 0;
-    force_no_continuation_ = false;
-    continuation_line_ = 0;
-    number_ = SCM_EOL;
-    alteration_ = SCM_EOL;
-    group_ = 0;
-    current_music_ = 0;
-  }
-  bool is_continuation () const
-  {
-    return
-      current_music_
-      && !force_no_continuation_
-      && ly_is_equal (number_,
-                     current_music_->get_property ("figure"))
-      && ly_is_equal (alteration_,
-                     current_music_->get_property ("alteration"));
-  }
-};
-
-struct New_figured_bass_engraver : public Engraver
-{
-  TRANSLATOR_DECLARATIONS(New_figured_bass_engraver);
-  void clear_spanners();
-  void add_brackets ();
-  void create_grobs ();
-
-  void center_continuations (Link_array<Spanner> const &consecutive_lines);
-  void center_repeated_continuations ();
-protected:
-  Array<Figure_group> groups_;
-  Spanner *alignment_;
-  Link_array<Music> new_musics_;
-  bool continuation_;
-  bool new_music_found_;
-  
-  Moment stop_moment_;
-  Music *rest_event_; 
-  
-  virtual bool try_music (Music *);
-  virtual void derived_mark () const; 
-
-  void start_translation_timestep ();
-  void stop_translation_timestep ();
-  void process_music ();
-};
-
-void
-New_figured_bass_engraver::derived_mark () const
-{
-  for (int i = 0; i < groups_.size (); i++)
-    {
-      scm_gc_mark (groups_[i].number_);
-      scm_gc_mark (groups_[i].alteration_);
-    }
-}
-
-void
-New_figured_bass_engraver::stop_translation_timestep ()
-{
-  if (groups_.is_empty ()
-      || now_mom ().main_part_ < stop_moment_.main_part_)
-    return ;
-  
-  bool found = false;
-  for (int i = 0; !found && i < groups_.size (); i++)
-    found  = found  || groups_[i].current_music_;
-
-  if (!found)
-    clear_spanners ();
-}
-
-New_figured_bass_engraver::New_figured_bass_engraver ()
-{
-  alignment_ = 0;
-  continuation_ = false;
-  rest_event_ = 0;
-  new_music_found_ = false;
-}
-
-void
-New_figured_bass_engraver::start_translation_timestep ()
-{
-  if (now_mom ().main_part_ < stop_moment_.main_part_)
-    return ;
-  
-  rest_event_ = 0;
-  new_musics_.clear ();
-  for (int i = 0; i < groups_.size (); i++)
-    {
-      groups_[i].current_music_ = 0;
-    }
-  continuation_ = false;
-}
-
-bool
-New_figured_bass_engraver::try_music (Music *m)
-{
-  new_music_found_ = true;
-  if (m->is_mus_type ("rest-event"))
-    {
-      rest_event_ = m;
-      return true;
-    }
-  else
-    {
-      stop_moment_ = now_mom () + m->get_length ();
-     
-      SCM fig = m->get_property ("figure");
-      for (int i = 0; i < groups_.size (); i++)
-       {
-         if (!groups_[i].current_music_
-             && ly_is_equal (groups_[i].number_, fig))
-           {
-             groups_[i].current_music_ = m;
-             groups_[i].force_no_continuation_
-               = to_boolean (m->get_property ("no-continuation"));
-             continuation_ = true;
-             return true; 
-           }
-       }
-
-      new_musics_.push (m);
-
-      return true;
-    }
-}
-
-void
-New_figured_bass_engraver::center_continuations (Link_array<Spanner> const &consecutive_lines)
-{
-  if (consecutive_lines.size () == 2)
-    {
-      Link_array<Grob> left_figs;
-      for (int j = consecutive_lines.size(); j--;)
-       left_figs.push (consecutive_lines[j]->get_bound (LEFT));
-
-      SCM  ga = Grob_array::make_array ();
-      unsmob_grob_array (ga)->set_array (left_figs);
-
-      for (int j = consecutive_lines.size(); j--;)
-       consecutive_lines[j]->set_object ("figures",
-                                         unsmob_grob_array (ga)->smobbed_copy ());
-    }
-}
-
-void
-New_figured_bass_engraver::center_repeated_continuations ()
-{  
-  Link_array<Spanner> consecutive_lines;
-  for (int i = 0; i <= groups_.size(); i++)
-    {
-      if (i < groups_.size ()
-         && groups_[i].continuation_line_
-         && (consecutive_lines.is_empty ()
-             || (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 ()
-                 == groups_[i].continuation_line_->get_bound (RIGHT)->get_column ())))
-       {
-         consecutive_lines.push (groups_[i].continuation_line_);         
-       }
-      else 
-       {
-         center_continuations (consecutive_lines);
-         consecutive_lines.clear ();
-       }
-    }
-}
-
-void
-New_figured_bass_engraver::clear_spanners ()
-{
-  if (!alignment_)
-    return;
-  
-  alignment_ = 0;
-  if (to_boolean (get_property ("figuredBassCenterContinuations")))
-    center_repeated_continuations();
-  
-  groups_.clear ();
-}
-
-void
-New_figured_bass_engraver::add_brackets ()
-{
-  Link_array<Grob> encompass;
-  bool inside = false;
-  for (int i = 0; i < groups_.size (); i ++)
-    {
-      if (!groups_[i].current_music_)
-       continue;
-      
-      if (to_boolean (groups_[i].current_music_->get_property ("bracket-start")))      
-       {
-         inside = true;
-       }
-
-      if (inside && groups_[i].figure_item_)
-       encompass.push (groups_[i].figure_item_);
-
-       if (to_boolean (groups_[i].current_music_->get_property ("bracket-stop")))
-       {
-         inside = false;
-
-         Item * brack = make_item ("BassFigureBracket", groups_[i].current_music_->self_scm ());
-         for (int j = 0; j < encompass.size (); j++)
-           {
-             Pointer_group_interface::add_grob (brack,
-                                                ly_symbol2scm ("elements"),
-                                                encompass[j]);
-           }
-         encompass.clear ();
-       }
-    }
-}
-
-void
-New_figured_bass_engraver::process_music ()
-{
-  if (rest_event_)
-    {
-      clear_spanners ();
-      return;
-    }
-  
-  if (!continuation_
-      && new_musics_.is_empty ())
-    {
-      clear_spanners ();
-      return;
-    }
-
-  if (!new_music_found_)
-    return ;
-  
-  new_music_found_ = false;
-
-  /*
-    Don't need to sync alignments, if we're not using extenders. 
-   */
-  bool use_extenders = to_boolean (get_property ("useBassFigureExtenders"));
-  if (!use_extenders)
-    {
-      if (to_boolean (get_property ("figuredBassCenterContinuations")))
-       center_repeated_continuations ();
-      alignment_ = 0;
-      for (int i = 0; i < groups_.size (); i++)
-       {
-         groups_[i].group_ = 0;
-         groups_[i].continuation_line_ = 0;
-       }
-    }
-  
-  if (!continuation_)
-    {
-      clear_spanners ();
-    }
-  
-  int k = 0;
-  for (int i = 0; i < new_musics_.size (); i++)
-    {
-      while (k < groups_.size() &&
-            groups_[k].current_music_)
-       k++;
-      
-      if (k >= groups_.size ())
-       {
-         Figure_group group;
-         groups_.push (group);
-       }
-      
-      groups_[k].current_music_ = new_musics_[i];
-      groups_[k].figure_item_ = 0;
-      k++;
-    }
-
-  for (int i = 0; i < groups_.size (); i++)
-    {
-      if (!groups_[i].is_continuation ())
-       {
-         groups_[i].number_ = SCM_BOOL_F;
-         groups_[i].alteration_ = SCM_BOOL_F;
-       }
-    }
-
-  if (use_extenders)
-    {
-      Array<int> junk_continuations;
-      for (int i = 0; i < groups_.size(); i++)
-       {
-               Figure_group &group = groups_[i];
-
-         if (group.is_continuation ())
-           {
-             if (!group.continuation_line_)
-               {
-                 Spanner * line = make_spanner ("BassFigureContinuation", SCM_EOL);
-                 Item * item = group.figure_item_;
-                 group.continuation_line_ = line;
-                 line->set_bound (LEFT, item);
-
-                 /*
-                   Don't add as child. This will cache the wrong
-                   (pre-break) stencil when callbacks are triggered.
-                 */
-                 line->set_parent (group.group_, Y_AXIS);
-                 Pointer_group_interface::add_grob (line, ly_symbol2scm ("figures"), item);
-
-                 group.figure_item_ = 0;
-               }
-           }
-         else if (group.continuation_line_) 
-           junk_continuations.push (i); 
-       }
-
-      /*
-       Ugh, repeated code.
-       */
-      Link_array<Spanner> consecutive;
-      for (int i = 0; i <= junk_continuations.size (); i++)
-       {
-         if (i < junk_continuations.size()
-             && (i == 0 || junk_continuations[i-1] == junk_continuations[i] - 1))
-           consecutive.push (groups_[junk_continuations[i]].continuation_line_);
-         else 
-           {
-             center_continuations (consecutive);
-             consecutive.clear ();
-             if (i < junk_continuations.size ())
-               consecutive.push (groups_[junk_continuations[i]].continuation_line_);
-           }
-       }
-      for (int i = 0; i < junk_continuations.size (); i++)
-       groups_[junk_continuations[i]].continuation_line_ = 0;
-    }
-  
-  create_grobs ();
-  add_brackets ();
-}
-
-void
-New_figured_bass_engraver::create_grobs () 
-{
-  Grob *muscol = dynamic_cast<Item*> (unsmob_grob (get_property ("currentMusicalColumn")));
-  if (!alignment_)
-    {
-      alignment_ = make_spanner ("BassFigureAlignment", SCM_EOL);
-      alignment_->set_bound (LEFT, muscol);
-    }
-  alignment_->set_bound (RIGHT, muscol);
-
-  SCM proc = get_property ("newFiguredBassFormatter");
-  for (int i = 0; i < groups_.size(); i++)
-    {
-      Figure_group &group = groups_[i];
-      
-      if (group.current_music_)
-       {
-         Item *item
-           = make_item ("NewBassFigure",
-                        group.current_music_->self_scm ());
-
-         
-         SCM fig = group.current_music_->get_property ("figure");
-         if (!group.group_)
-           {
-             group.group_ = make_spanner ("BassFigureLine", SCM_EOL);
-             group.group_->set_bound (LEFT, muscol);
-             Align_interface::add_element (alignment_,
-                                           group.group_);
-           }
-
-         if (scm_memq (fig, get_property ("implicitBassFigures")) != SCM_BOOL_F)
-           {
-             item->set_property ("transparent", SCM_BOOL_T); 
-             item->set_property ("implicit", SCM_BOOL_T);
-           }
-         
-         group.number_ = fig;
-         group.alteration_ = group.current_music_->get_property ("alteration");
-
-         SCM text = group.current_music_->get_property ("text");
-         if (!Text_interface::is_markup (text)
-             && ly_is_procedure (proc))
-           {
-             text = scm_call_3 (proc, fig, group.current_music_->self_scm (),
-                                context ()->self_scm ());
-           }
-
-         item->set_property ("text", text);
-         
-         Axis_group_interface::add_element (group.group_, item);
-         group.figure_item_ = item;
-       }
-
-      if (group.continuation_line_)
-       {
-         /*
-           UGH should connect to the bass staff, and get the note heads. 
-         */
-         group.figure_item_->set_property ("transparent", SCM_BOOL_T);
-         group.continuation_line_->set_bound (RIGHT, group.figure_item_);
-       }
-
-      
-      if (groups_[i].group_)
-       groups_[i].group_->set_bound (RIGHT, muscol);
-    }
-
-}
-
-ADD_TRANSLATOR (New_figured_bass_engraver,
-               /* doc */
-
-               "Make figured bass numbers.",
-               /* create */
-               "NewBassFigure "
-               "BassFigureAlignment "
-               "BassFigureBracket",
-               "BassFigureContinuation "
-               "BassFigureLine "
-
-               /* accept */
-               "bass-figure-event rest-event",
-
-               /* read */
-               "figuredBassCenterContinuations "
-               "implicitBassFigures "
-               "newFiguredBassFormatter "
-               "figuredBassAlterationDirection "
-               "useBassFigureExtenders",
-
-               /* write */
-               "");
index 60689ae5f5c72fc9fb0760252b217df9a026f68a..9ac8cfad6ddae5b887e53114057b8dc6fc245078 100644 (file)
@@ -550,7 +550,7 @@ AncientRemoveEmptyStaffContext = \context {
   tablatureFormat = #fret-number-tablature-format
 
 %%
-  newFiguredBassFormatter = #format-new-bass-figure
+  figuredBassFormatter = #format-bass-figure
   metronomeMarkFormatter = #format-metronome-markup
   graceSettings = #`(
     (Voice Stem direction 1)
@@ -581,8 +581,7 @@ AncientRemoveEmptyStaffContext = \context {
   \type "Engraver_group"
   \name "FiguredBass"
 
-%%  \consists "Figured_bass_engraver"
-  \consists "New_figured_bass_engraver"
+  \consists "Figured_bass_engraver"
   \consists "Note_swallow_translator"
   \consists "Skip_event_swallow_translator"
   \consists "Separating_line_group_engraver"
index deecf7ba7b4f5c50638cd134745aaa32e3b4174a..051d1d28dcaf541c1d7f210894ce07ebb9fa30ec 100644 (file)
@@ -108,7 +108,7 @@ for the down staff of PianoStaff. Used by @code{\\autochange}")
      (trebleStaffProperties ,list? "Alist of property settings to apply
 for the up staff of PianoStaff. Used by @code{\\autochange}")
 
-     (newFiguredBassFormatter ,procedure? "Routine generating a markup
+     (figuredBassFormatter ,procedure? "Routine generating a markup
 for a bass figure.")
      (bassFigureFormatFunction ,procedure? "Procedure that is called
 to produce the formatting for a @code{BassFigure} grob. It takes a
index 91883374401c73e7b0409941d534a520fa770059..1b5dbf31d96612b645f3d81afc291bb7f57aa55f 100644 (file)
        ))
 
     (BassFigure
-     . (
-
-       (stencil . ,Text_interface::print)
-
-       (Y-offset . ,Self_alignment_interface::y_aligned_on_self)
-       (direction . 1)
-       (font-family . number)
-
-       ;; We must do this, other BFs in
-       ;; layout16 become too small.
-       (font-size . -4)
-       (kern . 0.2)
-       (meta . ((class . Item)
-                (interfaces . (text-interface
-                               rhythmic-grob-interface
-                               bass-figure-interface
-                               self-alignment-interface
-                               font-interface))))))
-
-    (NewBassFigure
      . (
        ;
        (stencil . ,Text_interface::print)
index ad79b7bc2da42a2982a03ab392dbb7a1309f92c3..312acb5949eb7daf409e6110bf5d3f3dc8e9efcb 100644 (file)
@@ -58,7 +58,7 @@
 ;; Bass figures.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(define-public (format-new-bass-figure figure event context)
+(define-public (format-bass-figure figure event context)
   (let* ((fig (ly:music-property event 'figure))
         (fig-markup (if (number? figure)
                         (if (eq? #t (ly:music-property event 'diminished))