]> git.donarmstrong.com Git - lilypond.git/commitdiff
Merge branch 'master' of git+ssh://jneem@git.sv.gnu.org/srv/git/lilypond
authorJoe Neeman <joeneeman@gmail.com>
Wed, 20 Dec 2006 07:11:54 +0000 (09:11 +0200)
committerJoe Neeman <joeneeman@gmail.com>
Wed, 20 Dec 2006 07:11:54 +0000 (09:11 +0200)
23 files changed:
Documentation/user/lilypond.tely
VERSION
buildscripts/output-distance.py
flower/rational.cc
input/regression/beam-beamlet-grace.ly [new file with mode: 0644]
input/regression/grace-partial.ly [new file with mode: 0644]
lily/beam.cc
lily/include/beam.hh
lily/music-wrapper-iterator.cc
lily/music-wrapper.cc
lily/note-spacing-engraver.cc [new file with mode: 0644]
lily/rhythmic-column-engraver.cc
lily/spacing-basic.cc
lily/spacing-engraver.cc
lily/spacing-spanner.cc
lily/system.cc
lily/timing-translator.cc
ly/engraver-init.ly
scm/define-event-classes.scm
scm/define-grob-interfaces.scm
scm/define-grobs.scm
scm/define-music-types.scm
scripts/convert-ly.py

index ce5b8b4f1096d886611866f52d669f54acb8f3d6..2b0b3091e44e9ce1446fee381fbbe9dca2123871 100644 (file)
@@ -133,7 +133,7 @@ Free Documentation License''.
 @top GNU LilyPond --- The music typesetter
 @c HJJ: Info needs `@top', which is a synonym for `@unnumbered' in TeX.
 
-This is the user manual for GNU LilyPond 2.10.x series.
+This is the user manual for GNU LilyPond 2.11.x series.
 @ifhtml
 (See the bottom of this page for the exact version number).
 @end ifhtml
diff --git a/VERSION b/VERSION
index e65077869d7326a719adfcc087e53bf668652761..5d51c9da27b98d502c53ac25382074d42a587d38 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1,6 +1,6 @@
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=2
 MINOR_VERSION=11
-PATCH_LEVEL=3
+PATCH_LEVEL=4
 MY_PATCH_LEVEL=
 
index fd09f02a5a1f69e1ff7924d523dda1bd5f287ac6..a04df6b54021a7785b88ab9a0b87420bcecdc19f 100644 (file)
@@ -19,6 +19,12 @@ OUTPUT_EXPRESSION_PENALTY = 1
 ORPHAN_GROB_PENALTY = 1
 inspect_max_count = 0
 
+def shorten_string (s):
+    threshold = 15 
+    if len (s) > 2*threshold:
+        s = s[:threshold] + '..' + s[-threshold:]
+    return s
+
 def max_distance (x1, x2):
     dist = 0.0
 
@@ -285,12 +291,13 @@ def compare_png_images (old, new, dir):
         
         return tuple (map (int, m.groups ()))
 
-    dest = os.path.join (dir, new.replace ('.png', '.compare.png'))
+    dest = os.path.join (dir, new.replace ('.png', '.compare.jpeg'))
     try:
         dims1 = png_dims (old)
         dims2 = png_dims (new)
     except AttributeError:
-        os.link (new, dest)
+        ## hmmm. what to do?
+        system ('touch %(dest)s' % locals ())
         return
     
     dims = (min (dims1[0], dims2[0]),
@@ -303,7 +310,7 @@ def compare_png_images (old, new, dir):
 
     system ("convert  -depth 8 diff.png -blur 0x3 -negate -channel alpha,blue -type TrueColorMatte -fx 'intensity'    matte.png")
 
-    system ("composite -depth 8 -type Palette matte.png %(new)s %(dest)s" % locals ())
+    system ("composite -quality 65 matte.png %(new)s %(dest)s" % locals ())
 
 class FileLink:
     def __init__ (self):
@@ -455,7 +462,7 @@ class FileLink:
 </tr>
 ''' % (self.distance (), html_2,
        cell (self.base_names[0], name),
-       cell (self.base_names[1], name).replace ('.png', '.compare.png'))
+       cell (self.base_names[1], name).replace ('.png', '.compare.jpeg'))
 
         return html_entry
 
@@ -600,11 +607,11 @@ class ComparisonData:
         file_link.add_file_compare (f1,f2)
 
     def write_text_result_page (self, filename, threshold):
-        print 'writing "%s"' % filename
         out = None
         if filename == '':
             out = sys.stdout
         else:
+            print 'writing "%s"' % filename
             out = open_write_file (filename)
 
         ## todo: support more scores.
@@ -647,12 +654,14 @@ class ComparisonData:
             html += link.html_record_string (dir1, dir2)
 
 
+        short_dir1 = shorten_string (dir1)
+        short_dir2 = shorten_string (dir2)
         html = '''<html>
 <table rules="rows" border bordercolor="blue">
 <tr>
 <th>distance</th>
-<th>%(dir1)s</th>
-<th>%(dir2)s</th>
+<th>%(short_dir1)s</th>
+<th>%(short_dir2)s</th>
 </tr>
 %(html)s
 </table>
@@ -915,7 +924,10 @@ def main ():
     global inspect_max_count
     inspect_max_count = o.max_count
 
-    compare_trees (a[0], a[1], os.path.join (a[1],  'compare-' +  a[0]),
+    name = a[0].replace ('/', '')
+    name = shorten_string (name)
+    
+    compare_trees (a[0], a[1], os.path.join (a[1],  'compare-' +  name),
                    o.threshold)
 
 if __name__ == '__main__':
index a0c0d22410e235726eeee037b760fee1f7dcaef9..b82a35e6677246d68cc6806dca4ea14d4280f945 100644 (file)
@@ -9,6 +9,7 @@
 #include "rational.hh"
 
 #include <cmath>
+#include <cassert>
 #include <cstdlib>
 using namespace std;
 
@@ -17,7 +18,16 @@ using namespace std;
 
 Rational::operator double () const
 {
-  return ((double)sign_) * num_ / den_;
+  if (sign_ == -1 || sign_ == 1 || sign_ == 0)
+    return ((double)sign_) * num_ / den_;
+  if (sign_ == -2)
+    return -HUGE_VAL;
+  else if (sign_ == 2)
+    return HUGE_VAL;
+  else
+    assert (false);
+
+  return 0.0;
 }
 
 Rational::operator bool () const
diff --git a/input/regression/beam-beamlet-grace.ly b/input/regression/beam-beamlet-grace.ly
new file mode 100644 (file)
index 0000000..5c57a1e
--- /dev/null
@@ -0,0 +1,14 @@
+\header
+{
+  texidoc = "Beamlets in grace notes remain readable."
+}
+
+\version "2.10.2"
+\layout {
+  ragged-right = ##t
+}
+
+\relative c'
+\context Staff {
+  f1 \grace { a'8[ f16] } g1
+}
diff --git a/input/regression/grace-partial.ly b/input/regression/grace-partial.ly
new file mode 100644 (file)
index 0000000..56ed37e
--- /dev/null
@@ -0,0 +1,13 @@
+
+\version "2.10.4"
+
+\header {
+
+  texidoc = "A @code{\\partial} may be combined with a
+  @code{\\grace}."
+
+}
+
+\score {
+  { \partial 4 \grace b8 b4 b1 }
+}
index d0204833527507b2e40b0e0f0a2bf4e558b8c9ad..77953070c91192eb47af325d7ad013c44530c4c1 100644 (file)
@@ -385,10 +385,14 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common)
          Direction event_dir = LEFT;
          do
            {
-             Drul_array<bool> on_bound (j == 0 && event_dir==LEFT,
-                                        j == segs.size() - 1 && event_dir==RIGHT);
-             Drul_array<bool> inside (j > 0, j < segs.size()-1);
-             bool event = on_bound[event_dir]
+             bool on_bound = (event_dir == LEFT) ? j == 0 :
+               j == segs.size() - 1;
+
+             bool inside_stem = (event_dir == LEFT)
+                       ? segs[j].stem_index_ > 0
+                       : segs[j].stem_index_ < stems.size () - 1;
+                     
+             bool event = on_bound
                || abs (segs[j].rank_ - segs[j+event_dir].rank_) > 1
                || (abs (vertical_count) >= segs[j].max_connect_
                    || abs (vertical_count) >= segs[j + event_dir].max_connect_);
@@ -400,7 +404,7 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common)
              current.horizontal_[event_dir] = segs[j].stem_x_;
              if (segs[j].dir_ == event_dir)
                {
-                 if (on_bound[event_dir]
+                 if (on_bound
                      && me->get_bound (event_dir)->break_status_dir ())
                    {
                      current.horizontal_[event_dir]
@@ -413,12 +417,16 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common)
                        Stem::duration_log (segs[j].stem_) == 1
                        ? 1.98
                        : 1.32; // URG.
-                     
-                     if (inside[event_dir])
-                       notehead_width = min (notehead_width,
-                                             fabs (segs[j+ event_dir].stem_x_
-                                                   - segs[j].stem_x_)/2);
-                     
+
+
+                     if (inside_stem)
+                       {
+                         Grob *neighbor_stem = stems[segs[j].stem_index_ + event_dir];
+                         Real neighbor_stem_x = neighbor_stem->relative_coordinate (commonx, X_AXIS);
+
+                         notehead_width = min (notehead_width,
+                                               fabs (neighbor_stem_x - segs[j].stem_x_)/2);
+                       }
                      current.horizontal_[event_dir] += event_dir * notehead_width;
                    }
                }
index 9126bfbfec8e8051772978a29fe9d0a77255db6b..67daab8de8d26ea905b48eae3945b9a017797233 100644 (file)
@@ -55,7 +55,7 @@ struct Beam_stem_segment
   Real width_;
   Real stem_x_;
   int rank_;
-  int stem_index_;
+  vsize stem_index_;
   bool gapped_;
   Direction dir_;
   int max_connect_;
index e89896ce663652bca52800985e9ecdf487eeedc4..bc59a303a6621057264265fc32d6841f9be1a909 100644 (file)
@@ -18,7 +18,8 @@ Music_wrapper_iterator::Music_wrapper_iterator ()
 void
 Music_wrapper_iterator::do_quit ()
 {
-  child_iter_->quit ();
+  if (child_iter_)
+    child_iter_->quit ();
 }
 
 void
@@ -40,7 +41,9 @@ Music_wrapper_iterator::construct_children ()
 {
   Music *my_music = get_music ();
   Music *child = unsmob_music (my_music->get_property ("element"));
-  child_iter_ = unsmob_iterator (get_iterator (child));
+  child_iter_ = (child)
+    ? unsmob_iterator (get_iterator (child))
+    : 0;
 }
 
 bool
@@ -52,13 +55,17 @@ Music_wrapper_iterator::ok () const
 void
 Music_wrapper_iterator::process (Moment m)
 {
-  child_iter_->process (m);
+  if (child_iter_)
+    child_iter_->process (m);
 }
 
 Moment
 Music_wrapper_iterator::pending_moment () const
 {
-  return child_iter_->pending_moment ();
+  if (child_iter_)
+    return child_iter_->pending_moment ();
+  else
+    return Music_iterator::pending_moment ();
 }
 
 IMPLEMENT_CTOR_CALLBACK (Music_wrapper_iterator);
@@ -66,5 +73,5 @@ IMPLEMENT_CTOR_CALLBACK (Music_wrapper_iterator);
 bool
 Music_wrapper_iterator::run_always () const
 {
-  return child_iter_->run_always ();
+  return (child_iter_ &&  child_iter_->run_always ());
 }
index 051187a8a4215f6d3feb6e6e8cd2283526448d70..5f141c0c910478a4dbf4e8a8485971224fe55e94 100644 (file)
@@ -16,7 +16,10 @@ Music_wrapper::start_callback (SCM m)
 {
   Music *me = unsmob_music (m);
   Music *elt = unsmob_music (me->get_property ("element"));
-  return elt->start_mom ().smobbed_copy ();
+  if (elt)
+    return elt->start_mom ().smobbed_copy ();
+  else
+    return Moment ().smobbed_copy ();
 }
 
 MAKE_SCHEME_CALLBACK (Music_wrapper, length_callback, 1);
diff --git a/lily/note-spacing-engraver.cc b/lily/note-spacing-engraver.cc
new file mode 100644 (file)
index 0000000..33c459c
--- /dev/null
@@ -0,0 +1,92 @@
+/* 
+  note-spacing-engraver.cc -- implement Note_spacing_engraver
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 2006 Han-Wen Nienhuys <hanwen@lilypond.org>
+  
+*/
+
+#include "engraver.hh"
+
+#include "item.hh"
+#include "pointer-group-interface.hh"
+
+#include "translator.icc"
+
+class Note_spacing_engraver : public Engraver
+{
+  Grob *last_spacing_;
+  Grob *spacing_;
+
+  void add_spacing_item (Grob *);
+
+  TRANSLATOR_DECLARATIONS (Note_spacing_engraver);
+protected:
+
+  DECLARE_ACKNOWLEDGER (rhythmic_grob);
+  DECLARE_ACKNOWLEDGER (note_column);
+  void stop_translation_timestep ();
+};
+
+Note_spacing_engraver::Note_spacing_engraver ()
+{
+  last_spacing_ = 0;
+  spacing_ = 0;
+}
+
+void
+Note_spacing_engraver::add_spacing_item (Grob *g)
+{
+  if (!spacing_)
+    {
+      spacing_ = make_item ("NoteSpacing", g->self_scm ());
+    }
+  
+  
+  if (spacing_)
+    {
+      Pointer_group_interface::add_grob (spacing_,
+                                        ly_symbol2scm ("left-items"),
+                                        g);
+
+      if (last_spacing_)
+       {
+         Pointer_group_interface::add_grob (last_spacing_,
+                                            ly_symbol2scm ("right-items"),
+                                            g);
+       }
+    }
+}
+
+
+void
+Note_spacing_engraver::acknowledge_note_column (Grob_info gi)
+{
+  add_spacing_item (gi.grob ());
+}
+
+void
+Note_spacing_engraver::acknowledge_rhythmic_grob (Grob_info gi)
+{
+  add_spacing_item (gi.grob ());
+}
+
+void
+Note_spacing_engraver::stop_translation_timestep ()
+{
+  if (spacing_)
+    {
+      last_spacing_ = spacing_;
+      spacing_ = 0;
+    }
+}
+
+ADD_ACKNOWLEDGER (Note_spacing_engraver, note_column);
+ADD_ACKNOWLEDGER (Note_spacing_engraver, rhythmic_grob);
+
+ADD_TRANSLATOR (Note_spacing_engraver,
+               /* doc */ "Generates NoteSpacing, an object linking horizontal lines for use in spacing.",
+               /* create */ "NoteSpacing",
+               /* read */ "",
+               /* write */ "");
index ec8b754873ce9af8bb0550ff07adb90eee5472cb..4d77927127a95ab5a59961f925b4c4036ea6cb46 100644 (file)
@@ -47,11 +47,6 @@ class Rhythmic_column_engraver : public Engraver
   Grob *note_column_;
   Grob *dotcol_;
 
-  Grob *last_spacing_;
-  Grob *spacing_;
-
-  void add_spacing_item (Grob *);
-
   TRANSLATOR_DECLARATIONS (Rhythmic_column_engraver);
 protected:
 
@@ -64,31 +59,13 @@ protected:
 
 Rhythmic_column_engraver::Rhythmic_column_engraver ()
 {
-  spacing_ = 0;
-  last_spacing_ = 0;
 
   stem_ = 0;
   note_column_ = 0;
   dotcol_ = 0;
 }
 
-void
-Rhythmic_column_engraver::add_spacing_item (Grob *g)
-{
-  if (spacing_)
-    {
-      Pointer_group_interface::add_grob (spacing_,
-                                        ly_symbol2scm ("left-items"),
-                                        g);
 
-      if (last_spacing_)
-       {
-         Pointer_group_interface::add_grob (last_spacing_,
-                                            ly_symbol2scm ("right-items"),
-                                            g);
-       }
-    }
-}
 void
 Rhythmic_column_engraver::process_acknowledged ()
 {
@@ -97,9 +74,6 @@ Rhythmic_column_engraver::process_acknowledged ()
       if (!note_column_)
        {
          note_column_ = make_item ("NoteColumn", rheads_[0]->self_scm ());
-
-         spacing_ = make_item ("NoteSpacing", SCM_EOL);
-         add_spacing_item (note_column_);
        }
 
       for (vsize i = 0; i < rheads_.size (); i++)
@@ -147,13 +121,6 @@ void
 Rhythmic_column_engraver::stop_translation_timestep ()
 {
   note_column_ = 0;
-
-  if (spacing_)
-    {
-      last_spacing_ = spacing_;
-      spacing_ = 0;
-    }
-
   dotcol_ = 0;
   stem_ = 0;
 }
@@ -164,6 +131,6 @@ ADD_ACKNOWLEDGER (Rhythmic_column_engraver, rhythmic_head);
 
 ADD_TRANSLATOR (Rhythmic_column_engraver,
                /* doc */ "Generates NoteColumn, an objects that groups stems, noteheads and rests.",
-               /* create */ "NoteColumn NoteSpacing",
+               /* create */ "NoteColumn",
                /* read */ "",
                /* write */ "");
index 2e81fdf416237d2569dcedd1f94960cb91e02bba..2cd69fa4ffc4efc9ee5e4abd652133594bcfd6e8 100644 (file)
@@ -86,14 +86,7 @@ get_measure_length (Grob *column)
 
   extract_grob_set (sys, "columns", cols);
 
-  vsize col_idx = binary_search (cols, column,
-                                Paper_column::less_than);
-
-  if (col_idx == VPOS)
-    {
-      programming_error ( __FUNCTION__ + string (": Unknown column"));
-      return 0;
-    }
+  vsize col_idx = Paper_column::get_rank (column);
   
   do
     {
@@ -130,25 +123,25 @@ Spacing_spanner::note_spacing (Grob *me, Grob *lc, Grob *rc,
   Moment rwhen = Paper_column::when_mom (rc);
 
   Moment delta_t = rwhen - lwhen;
-  if (!Paper_column::is_musical (rc))
+
+  /*
+    when toying with mmrests, it is possible to have musical
+    column on the left and non-musical on the right, spanning
+    several measures.
+
+    TODO: efficiency: measure length can be cached, or stored as
+    property in paper-column.
+  */
+
+  if (Moment *measure_len = get_measure_length (lc))
     {
+      delta_t = min (delta_t, *measure_len);
+
       /*
-       when toying with mmrests, it is possible to have musical
-       column on the left and non-musical on the right, spanning
-       several measures.
+       The following is an extra safety measure, such that
+       the length of a mmrest event doesn't cause havoc.
       */
-
-      Moment *dt = get_measure_length (lc);
-      if (dt)
-       {
-         delta_t = min (delta_t, *dt);
-
-         /*
-           The following is an extra safety measure, such that
-           the length of a mmrest event doesn't cause havoc.
-         */
-         shortest_playing_len = min (shortest_playing_len, *dt);
-       }
+      shortest_playing_len = min (shortest_playing_len, *measure_len);
     }
 
   Real dist = 0.0;
index c6fc091de0711f4a4ac31bbff8be752d64bd62f7..81d5f2c8294a7f8b95a6bf2da46cb0457a394628 100644 (file)
@@ -68,12 +68,14 @@ protected:
   DECLARE_ACKNOWLEDGER (staff_spacing);
   DECLARE_ACKNOWLEDGER (note_spacing);
   DECLARE_ACKNOWLEDGER (rhythmic_head);
+  DECLARE_ACKNOWLEDGER (rhythmic_grob);
   DECLARE_TRANSLATOR_LISTENER (spacing_section);
 
   void start_translation_timestep ();
   void stop_translation_timestep ();
   void process_music ();
-  
+  void add_starter_duration (Grob_info i);
+
   virtual void finalize ();
 
   void start_spanner ();
@@ -144,8 +146,21 @@ Spacing_engraver::acknowledge_staff_spacing (Grob_info i)
   Pointer_group_interface::add_grob (spacing_, ly_symbol2scm ("wishes"), i.grob ());
 }
 
+void
+Spacing_engraver::acknowledge_rhythmic_grob (Grob_info i)
+{
+ add_starter_duration (i);  
+}
+
 void
 Spacing_engraver::acknowledge_rhythmic_head (Grob_info i)
+{
+  add_starter_duration (i);
+}
+
+
+void
+Spacing_engraver::add_starter_duration (Grob_info i)
 {
   if (i.grob ()->internal_has_interface (ly_symbol2scm ("lyric-syllable-interface"))
       || i.grob ()->internal_has_interface (ly_symbol2scm ("multi-measure-interface")))
@@ -243,6 +258,7 @@ Spacing_engraver::start_translation_timestep ()
 ADD_ACKNOWLEDGER (Spacing_engraver, staff_spacing);
 ADD_ACKNOWLEDGER (Spacing_engraver, note_spacing);
 ADD_ACKNOWLEDGER (Spacing_engraver, rhythmic_head);
+ADD_ACKNOWLEDGER (Spacing_engraver, rhythmic_grob);
 
 ADD_TRANSLATOR (Spacing_engraver,
                "make a SpacingSpanner and do "
index 31f7df6c8e72fba6e118f9dd2e0f4bf945cbe109..a196c3990f10b141ee53cea5463e0b98687c9214 100644 (file)
@@ -146,9 +146,6 @@ Spacing_spanner::calc_common_shortest_duration (SCM grob)
          max_idx = i;
          max_count = counts[i];
        }
-
-      // printf ("duration %d/%d, count %d\n",
-      // durations[i].num (), durations[i].den (), counts[i]);
     }
 
   SCM bsd = me->get_property ("base-shortest-duration");
index 90eb463c44932ac307902bd3e8a7e5e210b7984f..3ca397976b06c890094fdc2673deefc9fbc50833 100644 (file)
@@ -245,10 +245,7 @@ System::add_column (Paper_column *p)
       ga = unsmob_grob_array (scm_ga);
     }
 
-  p->rank_
-    = ga->size ()
-    ? Paper_column::get_rank (ga->array ().back ()) + 1
-    : 0;
+  p->rank_ = ga->size ();
 
   ga->add (p);
   Axis_group_interface::add_element (this, p);
index f98ac23c2fc1af222789727a764559ca8c661ffa..96460ec2d29dd84afd8dd41a28d3509bb3ebfa3c 100644 (file)
@@ -25,13 +25,12 @@ Timing_translator::stop_translation_timestep ()
       Moment barleft = (measure_length () - measure_position (context ()));
       Moment now = now_mom ();
 
-      if (barleft > Moment (0)
-         /*
-           Hmm. We insert the bar moment every time we process a
-           moment.  A waste of cpu?
-         */
-         && !now.grace_part_)
-       global->add_moment_to_process (now + barleft);
+      if (barleft > Moment (0))
+       {
+         Moment nextmom = now + barleft;
+         nextmom.grace_part_ = Rational (0);
+         global->add_moment_to_process (nextmom);
+       }
     }
 }
 
index ada3cf8bf804eefaac74be2a4309e6e35f7f9b1d..6907308aab1577977113ec9653f528c088af8f6e 100644 (file)
@@ -232,6 +232,7 @@ contained staves are not connected vertically."
   \consists "Script_engraver"
   \consists "Script_column_engraver"
   \consists "Rhythmic_column_engraver"
+  \consists "Note_spacing_engraver"
   \consists "Phrasing_slur_engraver"
   \consists "Cluster_spanner_engraver"
   \consists "Slur_engraver"
@@ -413,7 +414,7 @@ printing of a single line of lyrics.  "
   \consists "Chord_name_engraver"
   \consists "Skip_event_swallow_translator"
   \consists "Hara_kiri_engraver"
-  
+%  \consists "Note_spacing_engraver"
   voltaOnThisStaff = ##f
   \override VerticalAxisGroup #'minimum-Y-extent = #'(0 . 2.5)
   \override SeparatingGroupSpanner #'padding = #0.8
index e7d59622d4fec6af82016cdbe0d3c73cd4364f07..2bda1a2d025f020c4fcc3c20c5c3a05bc367db9b 100644 (file)
@@ -37,6 +37,7 @@
     (span-dynamic-event . (decrescendo-event crescendo-event))
     (pedal-event . (sostenuto-event sustain-event una-corda-event))
     (rhythmic-event . (lyric-event melodic-event multi-measure-rest-event
+                                  percent-event
                                   rest-event skip-event bass-figure-event))
     (melodic-event . (cluster-note-event note-event))
     (() . (Announcement))
index c6eb5204936c859ac80d3ea840048179a6ac6e7c..bf2c5b6c9910b638cae5b88b3b004da79499feba 100644 (file)
 
 (ly:add-interface
  'rhythmic-grob-interface
- "Any object with a rhythmic basis. Used to determine which grobs
-are interesting enough to maintain a hara-kiri staff."
+ "Any object with a duration. Used to determine which grobs are
+interesting enough to maintain a hara-kiri staff."
  '())
 
 
index f258856924849a94c50d4be736b6966310e1fd99..a794f75470ba16e892353429638d2b6c955b8598 100644 (file)
      . (
        (Y-extent . ,ly:cluster-beacon::height)
        (meta . ((class . Item)
-                (interfaces . (cluster-beacon-interface))))))
+                (interfaces . (rhythmic-grob-interface
+                               cluster-beacon-interface))))))
 
     (ClusterSpanner
      . (
        (thickness . 0.48)
        (slope . 1.7)
        (meta . ((class . Item)
-                (interfaces . (percent-repeat-item-interface))))))
+                (interfaces . (rhythmic-grob-interface
+                               percent-repeat-item-interface))))))
 
     (RepeatTie
      . (
index 99036e4ed49f9c0fea41f5e0878a51bad20a3187..bec7bc5efcdea16691abb1879b2aad3f1c6fa84f 100644 (file)
@@ -387,7 +387,7 @@ Syntax: @code{\\property @var{context}.@var{prop} = @var{scheme-val}}.")
     (PercentEvent
      . (
        (description .  "Used internally to signal percent repeats.")
-       (types . (general-music event percent-event))
+       (types . (general-music event percent-event rhythmic-event))
        ))
 
     (PesOrFlexaEvent
index 1f0ef120f1a1250dc9ce8baf87c2ca3bddadf762..549e82b69c2570579616592b74ae0f5c95d96277 100644 (file)
@@ -31,7 +31,7 @@ for p in ['share', 'lib']:
 import lilylib as ly
 global _;_=ly._
 
-from convertrules import *
+import convertrules
 
 lilypond_version_re_str = '\\\\version *\"([0-9.]+)"'
 lilypond_version_re = re.compile (lilypond_version_re_str)
@@ -133,13 +133,13 @@ def version_cmp (t1, t2):
 def get_conversions (from_version, to_version):
     def is_applicable (v, f = from_version, t = to_version):
         return version_cmp (v[0], f) > 0 and version_cmp (v[0], t) <= 0
-    return filter (is_applicable, conversions)
+    return filter (is_applicable, convertrules.conversions)
 
 def latest_version ():
-    return conversions[-1][0]
+    return convertrules.conversions[-1][0]
 
 def show_rules (file, from_version, to_version):
-    for x in conversions:
+    for x in convertrules.conversions:
         if (not from_version or x[0] > from_version) \
            and (not to_version or x[0] <= to_version):
             file.write  ('%s: %s\n' % (tup_to_str (x[0]), x[2]))
@@ -150,25 +150,24 @@ tuple (LAST,STR), with the last succesful conversion and the resulting
 string."""
     conv_list = get_conversions (from_version, to_version)
 
-    if error_file:
-        error_file.write (_ ("Applying conversion: "))
+    if convertrules.error_file:
+        convertrules.error_file.write (_ ("Applying conversion: "))
         
     last_conversion = ()
     try:
         for x in conv_list:
-            error_file.write (tup_to_str (x[0]))
+            convertrules.error_file.write (tup_to_str (x[0]))
             if x != conv_list[-1]:
-                error_file.write (', ')
+                convertrules.error_file.write (', ')
             str = x[1] (str)
             last_conversion = x[0]
 
-    except FatalConversionError:
-        error_file.write (_ ("error while converting")) 
-        error_file.write ('\n')
-        error_file.write (_ ("Aborting"))
-        error_file.write ('\n')
-
-
+    except convertrules.FatalConversionError:
+        convertrules.error_file.write ('\n'
+                                       + _ ("Error while converting")
+                                       + '\n'
+                                       + _ ("Stopping at last succesful rule")
+                                       + '\n')
 
     return (last_conversion, str)
 
@@ -225,7 +224,7 @@ def do_one_file (infile_name):
         elif not global_options.skip_version_add:
             result = newversion + '\n' + result
             
-        error_file.write ('\n')            
+        convertrules.error_file.write ('\n')            
     
         if global_options.edit:
             try: