]> git.donarmstrong.com Git - lilypond.git/commitdiff
release: 1.5.28 release/1.5.28
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Sat, 29 Dec 2001 19:32:31 +0000 (20:32 +0100)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Sat, 29 Dec 2001 19:32:31 +0000 (20:32 +0100)
89 files changed:
ChangeLog
Documentation/regression-test.tely
Documentation/user/refman.itely
VERSION
input/no-notation/bar-check.ly [new file with mode: 0644]
input/no-notation/beam-warn.ly [new file with mode: 0644]
input/regression/auto-change.ly
input/regression/spacing-ended-voice.ly [new file with mode: 0644]
input/regression/spacing-folded-clef2.ly [new file with mode: 0644]
input/regression/spacing-individual-tuning.ly [new file with mode: 0644]
input/regression/spacing-stem-direction.ly [new file with mode: 0644]
lily/accidental-engraver.cc
lily/align-interface.cc
lily/arpeggio-engraver.cc
lily/auto-change-iterator.cc
lily/axis-group-interface.cc
lily/bar-check-iterator.cc [new file with mode: 0644]
lily/bar.cc
lily/beam.cc
lily/break-align-item.cc
lily/chord-name.cc
lily/clef-item.cc
lily/command-request.cc
lily/directional-element-interface.cc
lily/dot-column.cc
lily/grob.cc
lily/group-interface.cc
lily/hara-kiri-group-spanner.cc
lily/hyphen-spanner.cc
lily/include/command-request.hh
lily/include/grob.hh
lily/include/group-interface.hh
lily/include/lily-guile.hh
lily/include/lily-proto.hh
lily/include/my-lily-parser.hh
lily/include/new-spacing-spanner.hh [deleted file]
lily/include/note-spacing.hh
lily/include/spacing-spanner.hh
lily/include/timing-translator.hh
lily/item.cc
lily/key-engraver.cc
lily/line-of-score.cc
lily/lyric-extender.cc
lily/multi-measure-rest.cc
lily/my-lily-parser.cc
lily/new-spacing-spanner.cc
lily/note-column.cc
lily/note-spacing-engraver.cc [deleted file]
lily/note-spacing.cc
lily/parser.yy
lily/porrectus.cc
lily/request-chord.cc
lily/rest-collision.cc
lily/rhythmic-column-engraver.cc
lily/rhythmic-head.cc
lily/scm-hash.cc
lily/score-engraver.cc
lily/script-column.cc
lily/separating-group-spanner.cc
lily/separating-line-group-engraver.cc
lily/separation-item.cc
lily/sequential-music-iterator.cc
lily/side-position-interface.cc
lily/simple-music-iterator.cc
lily/slur.cc
lily/spaceable-grob.cc
lily/spacing-engraver.cc
lily/spacing-spanner.cc
lily/span-bar.cc
lily/spanner.cc
lily/staff-spacing.cc
lily/stem.cc
lily/system-start-delimiter-engraver.cc
lily/third-try.cc
lily/tie-column.cc
lily/tie.cc
lily/timing-engraver.cc
lily/timing-translator.cc
lily/tuplet-bracket.cc
lily/volta-spanner.cc
lily/warn.cc
ly/engraver-init.ly
make/out/lilypond.lsm
make/out/lilypond.mandrake.spec
make/out/lilypond.redhat.spec
make/out/lilypond.suse.spec
scm/grob-description.scm
scm/grob-property-description.scm
stepmake/stepmake/generic-targets.make

index f3bc5bfe2719c6d5fe65f3f8cf65e7d5b05a31b2..520a07988c49a4000bbf507a925c7a658670b49e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,38 @@
+2001-12-29  Han-Wen  <hanwen@cs.uu.nl>
+       
+       * VERSION: 1.5.28 released
+
+        * lily/parser.yy (My_lily_parser): Slightly kludgy warning for
+        illicit beams on [c4 c4] etc.
+
+        * lily/bar-check-iterator.cc (Bar_check_iterator): new
+        file. Make separate iterator for Bar_checks. Bar_check now happen
+        outside engravers, meaning that you can use them with
+        skipTypesetting. Associated changes in other files.
+        
+        * lily/new-spacing-spanner.cc (stem_dir_correction): removed
+        function
+        
+        * lily/spacing-spanner.cc (stem_dir_correction): removed function
+
+        * lily/include/grob.hh (unsmob_item, unsmob_spanner): Add functions
+
+        * lily/bar.cc (before_line_breaking): remove bar-line spacing code.
+
+        * lily/stem.cc (set_spacing_hints): removed function
+
+        * lily/note-spacing.cc (stem_dir_correction): new stem-direction
+        correction for spacing; now take vertical extents of the stem into
+        account.  
+
+        * lily/third-try.cc: More hacking to get spacing working.
+
+        * lily/note-spacing-engraver.cc: new file, Note_spacing_engraver
+        sits at staff level and creates note spacing objects. Scrap it
+        again, and document why.
+
+        * lily/include/group-interface.hh: rename functions. 
+
 2001-12-27  Jan Nieuwenhuizen  <janneke@gnu.org>
 
        * stepmake/stepmake/c++-rules.make:
index 42f5aad17e944de1e6a011e0ccb56fe708f47764..6dbe5dd5b9946f73fdfc8352186f06c4486879e6 100644 (file)
@@ -224,22 +224,28 @@ Grace note do weird things with timing. Fragile.
 
 @section Spacing
 
-@lilypondfile[printfilename]{stem-spacing.ly}
+@lilypondfile[printfilename]{spacing-accidental.ly}
 
-@lilypondfile[printfilename]{spacing-tight.ly}
+@lilypondfile[printfilename]{spacing-accidental-staffs.ly}
 
-@lilypondfile[printfilename]{spacing-natural.ly}
+@lilypondfile[printfilename]{spacing-folded-clef.ly}
 
-@lilypondfile[printfilename]{spacing-loose.ly}
+@lilypondfile[printfilename]{spacing-ended-voice.ly}
 
-@lilypondfile[printfilename]{spacing-accidental.ly}
+@lilypondfile[printfilename]{spacing-stem-direction.ly}
 
-@lilypondfile[printfilename]{spacing-accidental-staffs.ly}
+@lilypondfile[printfilename]{spacing-individual-tuning.ly}
 
 @lilypondfile[printfilename]{lyrics-bar.ly}
 
 @lilypondfile[printfilename]{non-empty-text.ly}
 
+@c @l ilypondfile[printfilename]{spacing-tight.ly}
+
+@c @l ilypondfile[printfilename]{spacing-natural.ly}
+
+@c @l ilypondfile[printfilename]{spacing-loose.ly}
+
 
 
 @section PianoStaff
index 2dbad10f96ad0e131354e80c416f8f873e02d4cf..2dcb3514404d915183841eededb26bb06e342bca 100644 (file)
@@ -3977,6 +3977,12 @@ A bar check is entered using the bar symbol, @code{|}:
   \time 3/4 c2 e4 | g2.
 @end example
 
+@cindex skipTypesetting
+
+Bar checks are not affected by @code{skipTypesetting}, so if you are
+debugging a large score, you are advised to run it with skipTypesetting
+first to correct all overfull and underfull measures.
+
 @c .  {Point and click}
 @node Point and click
 @subsection Point and click
diff --git a/VERSION b/VERSION
index ed162e12c4c5424acbdc1d120b0a1e70a47ec65d..390387bfc1d9eb5764c3e3eb5588fb8800f7d8fe 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1,8 +1,8 @@
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=1
 MINOR_VERSION=5
-PATCH_LEVEL=27
-MY_PATCH_LEVEL=jcn2
+PATCH_LEVEL=28
+MY_PATCH_LEVEL=
 
 # use the above to send patches: MY_PATCH_LEVEL is always empty for a
 # released version.
diff --git a/input/no-notation/bar-check.ly b/input/no-notation/bar-check.ly
new file mode 100644 (file)
index 0000000..c8a706a
--- /dev/null
@@ -0,0 +1,12 @@
+
+\header {
+
+texidoc = "skipTypesetting doesn't affect bar checks."
+
+}
+
+\score { \notes {
+       \property Score.skipTypesetting = ##t
+       c4 c4
+       |
+       c4 c4 }}
diff --git a/input/no-notation/beam-warn.ly b/input/no-notation/beam-warn.ly
new file mode 100644 (file)
index 0000000..02c86da
--- /dev/null
@@ -0,0 +1,10 @@
+
+\header        {
+
+texidoc = "The first duration following a beam-open request is checked if it is short enough."
+
+}
+
+\score {
+  \notes { [c4 c] }
+}
index e377fbf3cfa580d9b6f88a355204b1ca80774cb7..cd26b7ce9471064a843c5299d0c645dbc13a9b9a 100644 (file)
@@ -1,16 +1,18 @@
 \version "1.3.146"
 
-\header{
-texidoc="
-Auto change piano staff switches  voices  between up and down staves
-automatically rests are switched along with the coming note.
+\header {
+
+texidoc=" Auto change piano staff switches voices between up
+and down staves automatically rests are switched along with the coming
+note. When central C is reached, we don't switch (by default).
+
 "
 }
 
 \score {
        \notes \context PianoStaff <
        \context Staff = "up" {
-               \autochange Staff \context Voice = VA < \relative c' { g4 a  b c d r4 a g } >
+               \autochange Staff \context Voice = VA < \relative c' { g4 c e d c r4 a g } >
        }
        \context Staff = "down" {
                \clef bass 
diff --git a/input/regression/spacing-ended-voice.ly b/input/regression/spacing-ended-voice.ly
new file mode 100644 (file)
index 0000000..562c8de
--- /dev/null
@@ -0,0 +1,23 @@
+\header { texidoc = "
+
+A voicelet (a very short voice to get polyphonic chords correct)
+should not confuse the spacing engine."
+ }
+
+
+       \score {
+\notes {  \context Staff {
+  c4
+  <
+    \context Voice = I \relative c'' { \stemUp r4 dis4 }
+    \context Voice = III \relative c'' { \stemUp \shiftOn r4 bis  \shiftOff}
+    \context Voice = IV \relative c'' {
+      \stemDown
+      \shiftOn s4 gis }
+    \context Voice =  II \relative c' { \stemDown
+       % idem
+
+      r4 fis  }
+  >
+  c4
+}}}
diff --git a/input/regression/spacing-folded-clef2.ly b/input/regression/spacing-folded-clef2.ly
new file mode 100644 (file)
index 0000000..95ce23f
--- /dev/null
@@ -0,0 +1,23 @@
+\header {
+
+texidoc = "A clef can be folded below notes in a different staff, if
+there is space enough. With Paper_column molecule callbacks we can
+show where columns are in the score."
+}
+
+\score { \notes \relative c'' <
+       \context Staff = SA  { c4 c4 c4 \bar "|." }
+       \context Staff = SB { \clef bass c,2 \clef treble  c'2 }
+       >
+
+       \paper { linewidth = -1.
+
+       \translator { \ScoreContext
+         NonMusicalPaperColumn \override #'molecule-callback = #Paper_column::brew_molecule
+         PaperColumn \override #'molecule-callback = #Paper_column::brew_molecule        
+         NonMusicalPaperColumn \override #'font-family = #'roman
+         PaperColumn \override #'font-family = #'roman   
+
+       }
+       }}
+
diff --git a/input/regression/spacing-individual-tuning.ly b/input/regression/spacing-individual-tuning.ly
new file mode 100644 (file)
index 0000000..1845bfc
--- /dev/null
@@ -0,0 +1,22 @@
+\header {
+
+texidoc = "
+
+You can tune spacing of individual notes
+by setting @code{space-factor} in @code{NoteSpacing}.
+
+"
+}
+
+\score { \notes {
+\relative c'' { 
+c8 c8
+\property Voice.NoteSpacing \set #'space-factor = #0.7
+ c8 c8
+\property Voice.NoteSpacing \set #'space-factor = #1.4
+ c8 c8
+\property Voice.NoteSpacing \set #'space-factor = #1.0
+ c8 c8 
+} }
+\paper { linewidth = -1. }
+}
diff --git a/input/regression/spacing-stem-direction.ly b/input/regression/spacing-stem-direction.ly
new file mode 100644 (file)
index 0000000..91aef48
--- /dev/null
@@ -0,0 +1,23 @@
+\version "1.3.146"
+
+\header{
+
+texidoc="
+
+LilyPond corrects for optical spacing of stems. The overlap between to
+adjacent stems of different direction is used as a measure for how
+much to correct."
+
+}
+
+\score { 
+  \context Voice \notes\relative c {
+  % make sure neutral is down.
+    \property Voice.Stem \override #'neutral-direction = #-1
+       \time 16/4  c''4 c c,  c' d, c' e, c' f, c' g c a c b c
+       
+  }
+  \paper {
+    linewidth=-1.0
+  }  
+}
index 0f9b126eb3f8685e87622429f1d2a789e071396a..016832382bddc86a07bf4152f6648fb082421b53 100644 (file)
@@ -11,7 +11,6 @@
 #include "item.hh"
 #include "tie.hh"
 #include "rhythmic-head.hh"
-#include "timing-translator.hh"
 #include "engraver-group-engraver.hh"
 
 #include "staff-symbol-referencer.hh"
index 4c5151b6d5ae77381f685ec121a4985f97d33e25..c8ef6c9f4e745c206d15c14bd4f02d013c5940d1 100644 (file)
@@ -65,7 +65,7 @@ Align_interface::align_to_fixed_distance (Grob *me , Axis a)
     }
   
   Link_array<Grob> elems
-    = Pointer_group_interface__extract_elements (me, (Grob*) 0, "elements");
+    = Pointer_group_interface__extract_grobs (me, (Grob*) 0, "elements");
 
   Real where_f=0;
 
@@ -150,7 +150,7 @@ Align_interface::align_elements_to_extents (Grob * me, Axis a)
 
   Link_array<Grob> elems;
   Link_array<Grob> all_grobs
-    = Pointer_group_interface__extract_elements (me, (Grob*) 0, "elements");
+    = Pointer_group_interface__extract_grobs (me, (Grob*) 0, "elements");
   for (int i=0; i < all_grobs.size (); i++) 
     {
       Interval y = all_grobs[i]->extent (me, a);
index f366159596ef19c4d2f19a20a489eb0b4c39fc73..5a0a67ca1b3008684cbadb3602cf8159e91aa059 100644 (file)
@@ -85,7 +85,7 @@ Arpeggio_engraver::create_grobs ()
       
       for (int i = 0; i < stems_.size (); i++)
        {
-         Pointer_group_interface::add_element (arpeggio_, ly_symbol2scm ("stems"), stems_[i]);
+         Pointer_group_interface::add_grob (arpeggio_, ly_symbol2scm ("stems"), stems_[i]);
        }
       for (int i = 0; i < supports_.size (); i++)
        {
index 32b1b05608a6f05c763e19ff7e2764780a031af5..59cad0bc0748c6eb8d7a9931d361b71b47303cb6 100644 (file)
@@ -119,7 +119,14 @@ Auto_change_iterator::process (Moment m)
     {
       Pitch p = ps[0];
       Direction s = Direction (sign (p.steps ()));
-      if (s != where_dir_)
+      /*
+       Don't change for central C.
+
+       TODO: make this tunable somehow. Sometimes, you'd want to
+       switch for C.C. as well.
+
+      */
+      if (s && s != where_dir_)
        {
          where_dir_ = s;
          String to_id = (s >= 0) ?  "up" : "down";
index 34541a5a5d8d843082c6090446cb5f60e434cf59..85e21bda285e58e3b231d13a8da6031aa4732bf6 100644 (file)
@@ -21,7 +21,7 @@ Axis_group_interface::add_element (Grob*me,Grob *e)
        e->set_parent (me, a);
     }
 
-  Pointer_group_interface::add_element (me, ly_symbol2scm ("elements"), e);
+  Pointer_group_interface::add_grob (me, ly_symbol2scm ("elements"), e);
   me->add_dependency (e);
 }
 
diff --git a/lily/bar-check-iterator.cc b/lily/bar-check-iterator.cc
new file mode 100644 (file)
index 0000000..bfcaf62
--- /dev/null
@@ -0,0 +1,70 @@
+/*   
+
+     bar-check-iterator.cc -- implement Bar_check_iterator
+
+     source file of the GNU LilyPond music typesetter
+
+     (c) 2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ */
+
+#include "simple-music-iterator.hh"
+#include "command-request.hh"
+#include "translator-group.hh"
+
+/*
+  Check bar checks. We do this outside the engravers so that you can
+  race through the score using skipTypesetting to correct durations.
+ */
+class Bar_check_iterator : Simple_music_iterator
+{
+public:
+  VIRTUAL_COPY_CONS(Bar_check_iterator);
+  virtual void process (Moment);
+  Bar_check_iterator( );
+  static SCM constructor_cxx_function;
+};
+
+IMPLEMENT_CTOR_CALLBACK (Bar_check_iterator);
+
+Music * get_barcheck ()
+{
+  Music *bc = new Music;
+  bc->set_mus_property ("iterator-ctor", Bar_check_iterator::constructor_cxx_function);
+  return bc;
+}
+
+Bar_check_iterator::Bar_check_iterator()
+{
+}
+
+void
+Bar_check_iterator::process (Moment m)
+{
+  Simple_music_iterator::process(m);
+  if (!m.to_bool ())
+    {
+      Translator_group *tr = report_to_l ();
+
+      SCM mp = tr->get_property ("measurePosition");
+      SCM sync= tr->get_property ("barCheckNoSynchronize");
+
+      Moment * where =unsmob_moment (mp);
+      if (!where)
+       return;
+      
+      if (where->main_part_)
+       {
+         music_l ()->origin ()->warning (_f ("barcheck failed at: %s", 
+                                           where->str ()));
+       }
+      
+      if (!to_boolean (sync))
+       {
+         tr = tr->where_defined (ly_symbol2scm("measurePosition"));
+         Moment zero;
+         tr->set_property ("measurePosition", zero.smobbed_copy ());
+       }
+    }
+}
+    
index bd38f9637ce5c17d9fae1d2f938fe2065c612ae0..497af0fa3a222e68343b8ea4386c12abd24be171 100644 (file)
@@ -159,27 +159,6 @@ Bar::before_line_breaking (SCM smob)
   if (! gh_equal_p (g, orig))
     me->set_grob_property ("glyph", g);
 
-  
-  /*
-    set a (pseudo) stem-direction, so we extra space is inserted
-    between stemup and barline.
-
-    TODO: should check if the barline is the leftmost object of the
-    break alignment.
-
-  */
-  if (gh_string_p (g))
-    {
-      Grob * col = item->column_l ();
-      SCM dirlist = col->get_grob_property ("dir-list");
-      SCM scmdir = gh_int2scm (-1); 
-      if (scm_memq (scmdir, dirlist) == SCM_BOOL_F)
-       {
-         dirlist = gh_cons (scmdir, dirlist);
-         col->set_grob_property ("dir-list", dirlist);
-       }
-    }
-  
   return SCM_UNSPECIFIED;
 }
   
index 1c0ed8e545d44e2efd64822e5ed2400aa8bba642..3c12f0053f6008f9b8ea796c1d1cd8f7be53d062 100644 (file)
@@ -40,7 +40,7 @@
 void
 Beam::add_stem (Grob*me, Grob*s)
 {
-  Pointer_group_interface::add_element (me, ly_symbol2scm ("stems"), s);
+  Pointer_group_interface::add_grob (me, ly_symbol2scm ("stems"), s);
   
   s->add_dependency (me);
 
@@ -130,7 +130,7 @@ Beam::get_default_dir (Grob*me)
   Direction d = DOWN;
 
   Link_array<Item> stems=
-       Pointer_group_interface__extract_elements (me, (Item*)0, "stems");
+       Pointer_group_interface__extract_grobs (me, (Item*)0, "stems");
 
   for (int i=0; i <stems.size (); i++)
     do {
@@ -173,7 +173,7 @@ void
 Beam::set_stem_directions (Grob*me)
 {
   Link_array<Item> stems
-    =Pointer_group_interface__extract_elements (me, (Item*) 0, "stems");
+    =Pointer_group_interface__extract_grobs (me, (Item*) 0, "stems");
   Direction d = Directional_element_interface::get (me);
   
   for (int i=0; i <stems.size (); i++)
@@ -206,7 +206,7 @@ Beam::consider_auto_knees (Grob *me)
 
       Direction d = Directional_element_interface::get (me);
       Link_array<Item> stems=
-       Pointer_group_interface__extract_elements (me, (Item*)0, "stems");
+       Pointer_group_interface__extract_grobs (me, (Item*)0, "stems");
       
       Grob *common = me->common_refpoint (stems[0], Y_AXIS);
       for (int i=1; i < stems.size (); i++)
@@ -287,7 +287,7 @@ Beam::set_stem_shorten (Grob*m)
     shorten_f /= 2;
 
   Link_array<Item> stems=
-    Pointer_group_interface__extract_elements (me, (Item*)0, "stems");
+    Pointer_group_interface__extract_grobs (me, (Item*)0, "stems");
 
   for (int i=0; i < stems.size (); i++)
     {
@@ -364,7 +364,7 @@ Beam::least_squares (SCM smob)
       // ugh -> use commonx
       Real x0 = first_visible_stem (me)->relative_coordinate (0, X_AXIS);
       Link_array<Item> stems=
-       Pointer_group_interface__extract_elements (me, (Item*)0, "stems");
+       Pointer_group_interface__extract_grobs (me, (Item*)0, "stems");
 
       for (int i=0; i < stems.size (); i++)
        {
@@ -637,7 +637,7 @@ Beam::check_stem_length_f (Grob*me,Real y, Real dy)
   Direction dir = Directional_element_interface::get (me);
 
   Link_array<Item> stems=
-    Pointer_group_interface__extract_elements (me, (Item*)0, "stems");
+    Pointer_group_interface__extract_grobs (me, (Item*)0, "stems");
 
   for (int i=0; i < stems.size (); i++)
     {
@@ -678,7 +678,7 @@ Beam::set_stem_lengths (Grob *me)
 
   Real half_space = Staff_symbol_referencer::staff_space (me)/2;
   Link_array<Item> stems=
-    Pointer_group_interface__extract_elements (me, (Item*)0, "stems");
+    Pointer_group_interface__extract_grobs (me, (Item*)0, "stems");
 
   Grob *common = me->common_refpoint (stems[0], Y_AXIS);
   for (int i=1; i < stems.size (); i++)
@@ -754,7 +754,7 @@ void
 Beam::set_beaming (Grob*me,Beaming_info_list *beaming)
 {
   Link_array<Grob> stems=
-    Pointer_group_interface__extract_elements (me, (Grob*)0, "stems");
+    Pointer_group_interface__extract_grobs (me, (Grob*)0, "stems");
   
   Direction d = LEFT;
   for (int i=0; i  < stems.size (); i++)
@@ -946,7 +946,7 @@ Beam::brew_molecule (SCM smob)
     return SCM_EOL;
   Real x0,dx;
   Link_array<Item>stems = 
-    Pointer_group_interface__extract_elements (me, (Item*) 0, "stems");  
+    Pointer_group_interface__extract_grobs (me, (Item*) 0, "stems");  
   if (visible_stem_count (me))
     {
   // ugh -> use commonx
@@ -994,7 +994,7 @@ int
 Beam::forced_stem_count (Grob*me) 
 {
   Link_array<Item>stems = 
-    Pointer_group_interface__extract_elements (me, (Item*) 0, "stems");
+    Pointer_group_interface__extract_grobs (me, (Item*) 0, "stems");
   int f = 0;
   for (int i=0; i < stems.size (); i++)
     {
@@ -1020,7 +1020,7 @@ int
 Beam::visible_stem_count (Grob*me) 
 {
   Link_array<Item>stems = 
-    Pointer_group_interface__extract_elements (me, (Item*) 0, "stems");
+    Pointer_group_interface__extract_grobs (me, (Item*) 0, "stems");
   int c = 0;
   for (int i = stems.size (); i--;)
     {
@@ -1034,7 +1034,7 @@ Item*
 Beam::first_visible_stem (Grob*me) 
 {
   Link_array<Item>stems = 
-    Pointer_group_interface__extract_elements (me, (Item*) 0, "stems");
+    Pointer_group_interface__extract_grobs (me, (Item*) 0, "stems");
   
   for (int i = 0; i < stems.size (); i++)
     {
@@ -1048,7 +1048,7 @@ Item*
 Beam::last_visible_stem (Grob*me) 
 {
   Link_array<Item>stems = 
-    Pointer_group_interface__extract_elements (me, (Item*) 0, "stems");
+    Pointer_group_interface__extract_grobs (me, (Item*) 0, "stems");
   for (int i = stems.size (); i--;)
     {
       if (!Stem::invisible_b (stems[i]))
index be0b995068908554c7e82e5a8b79beb071a35d14..69ed53ecf3c79c2c7c41ffe56b9a2fb0e86188ef 100644 (file)
@@ -86,7 +86,7 @@ Break_align_interface::do_alignment (Grob *me)
 
   Link_array<Grob> elems;
   Link_array<Grob> all_elems
-    = Pointer_group_interface__extract_elements (me, (Grob*)0,
+    = Pointer_group_interface__extract_grobs (me, (Grob*)0,
                                                 "elements");
   
   for (int i=0; i < all_elems.size (); i++) 
index 2c0e717a89bef94498f513a3933485df340f2696..1cf1cc0a0c67d0a9e9e5148b56ac29a85fd56a51 100644 (file)
@@ -20,7 +20,7 @@ MAKE_SCHEME_CALLBACK (Chord_name,after_line_breaking,1);
 SCM
 Chord_name::after_line_breaking (SCM smob)
 {
-  Item* me = dynamic_cast<Item*> (unsmob_grob (smob));
+  Item* me = unsmob_item (smob);
   assert (me);
     
   SCM s = me->get_grob_property ("begin-of-line-visible");
index d7c323ee609b38d463ecbc5e6de38aa6394c2eee..b1c38317cc34d0194b5385c6d5706d8a5cecd59b 100644 (file)
@@ -20,7 +20,7 @@ MAKE_SCHEME_CALLBACK (Clef,before_line_breaking,1);
 SCM
 Clef::before_line_breaking (SCM smob)
 {
-  Item * s = dynamic_cast<Item*> (unsmob_grob (smob));
+  Item * s = unsmob_item (smob);
 
   SCM glyph = s->get_grob_property ("glyph-name");
   
index 13089e274377c011f99f4766cba8b2ddbf0fd760..6bf73e365788f662e2be586f9637835225673c4c 100644 (file)
 #include "debug.hh"
 #include "musical-request.hh"
 
-bool
-Barcheck_req::do_equal_b (Request const *r) const
-{
-  Barcheck_req  const*b = dynamic_cast<Barcheck_req const*> (r);
-  return b;
-}
-
 Tempo_req::Tempo_req ()
 {
   set_mus_property ("duration", Duration (2,0).smobbed_copy ());
@@ -101,7 +94,6 @@ Mark_req::do_equal_b (Request const * r) const
 
 
 ADD_MUSIC (Articulation_req);
-ADD_MUSIC (Barcheck_req);
 ADD_MUSIC (Break_req);
 ADD_MUSIC (Breathing_sign_req);
 ADD_MUSIC (Busy_playing_req);
index ac2c40927d4c35f287465cb551339345b4094cd8..b65fe31582de7c95f5d0d0fa77f9f87c44f9e077 100644 (file)
@@ -34,6 +34,9 @@ Directional_element_interface::set (Grob*me, Direction d)
 {
   SCM sd = gh_int2scm (d);
 
+  /*
+    Vain attempt to save some conses.
+   */
   if (me->get_grob_property ("direction") != sd)
     me->set_grob_property ("direction", sd);
 }
index f59a32c20a1ed4315c99b6ad10a90a4166b47e35..fc6edcb963537c62bd82568a043d5046066a468e 100644 (file)
@@ -135,7 +135,7 @@ Dot_column::add_head (Grob * me, Grob *rh)
     {
       Side_position_interface::add_support (me,rh);
 
-      Pointer_group_interface::add_element (me, ly_symbol2scm ("dots"), d);
+      Pointer_group_interface::add_grob (me, ly_symbol2scm ("dots"), d);
       d->add_offset_callback (Dot_column::force_shift_callback_proc , Y_AXIS);
       Axis_group_interface::add_element (me, d);
     }
index fd519adb7498a1e17d3a43addc77b3a93c6ac82b..c579990a7e0dfcc6dad1c5a8d3926b4181f574c8 100644 (file)
@@ -330,7 +330,7 @@ Grob::add_dependency (Grob*e)
 {
   if (e)
     {
-      Pointer_group_interface::add_element (this, ly_symbol2scm ("dependencies"),e);
+      Pointer_group_interface::add_grob (this, ly_symbol2scm ("dependencies"),e);
     }
   else
     programming_error ("Null dependency added");
index 74bd4ad75164eb07866d41ac8b9b3d796d61cb1b..092170d6068d24b0b98673a61028d27e97902b95 100644 (file)
@@ -54,7 +54,7 @@ Group_interface::count (Grob *me, String name)
 
 
 void
-Pointer_group_interface::add_element (Grob*me, SCM name, Grob*p) 
+Pointer_group_interface::add_grob (Grob*me, SCM name, Grob*p) 
 {
   Group_interface::add_thing (me, name, p->self_scm ());
 }
index 11ac30e8ac0bb633f53facdb559e9c5d4b314e07..50dd0dbc2ea296d0cd6ab88f8c9c3488e810f8d5 100644 (file)
@@ -99,5 +99,5 @@ void
 Hara_kiri_group_spanner::add_interesting_item (Grob* me,Grob* n)
 {
   me->add_dependency (n);
-  Pointer_group_interface::add_element (me, ly_symbol2scm ("items-worth-living"),n);
+  Pointer_group_interface::add_grob (me, ly_symbol2scm ("items-worth-living"),n);
 }
index c222091ef45a55af3243c9f72c7e16b54b1e6c4f..6b42b5b5547e175a953f47b0bb3bd13244810f41 100644 (file)
@@ -24,7 +24,7 @@ MAKE_SCHEME_CALLBACK (Hyphen_spanner,brew_molecule,1)
 SCM 
 Hyphen_spanner::brew_molecule (SCM smob)
 {
-  Spanner * sp = dynamic_cast<Spanner*> (unsmob_grob (smob));
+  Spanner * sp = unsmob_spanner (smob);
 
   Grob * common = sp;
   Direction d = LEFT;
index fa7d7f4e636f4a4ddc2a5f9e540b3369f35ea159..8a1fe1927807a73a8579accdd9cf97543bfa688e 100644 (file)
@@ -40,13 +40,6 @@ protected:
   VIRTUAL_COPY_CONS (Music);
 };
 
-/// check if we're at start of a  measure.
-class Barcheck_req  : public Request  {
-public:
-  bool do_equal_b (Request const *) const;
-  VIRTUAL_COPY_CONS (Music);
-};
-
 class Breathing_sign_req : public Request {
   VIRTUAL_COPY_CONS (Music);
 };
index 228a73fc60313929a3a5f3f9a111d7995ef7a589..aa0d1e13ceae3868e43cd546a0f0b18f81095602 100644 (file)
@@ -181,6 +181,9 @@ public:
 };
 
 DECLARE_UNSMOB(Grob,grob);
+Spanner* unsmob_spanner (SCM );
+Item* unsmob_item (SCM );
+
 
 #endif // STAFFELEM_HH
 
index 8df58bce5b527d460aa6874f90edf7d9f376d963..5db79487526fefe43c97dc1a9448a3ff51628675 100644 (file)
@@ -33,14 +33,14 @@ public:
 
 struct Pointer_group_interface : public Group_interface {
 public:
-  static void add_element (Grob*, SCM nm, Grob*e);
+  static void add_grob (Grob*, SCM nm, Grob*e);
 };
 /** 
   Put all score elements of ELT's property called NAME into an array,
   and return it.  */
 template<class T>
 Link_array<T>
-Pointer_group_interface__extract_elements (Grob const *elt, T *, const char* name)
+Pointer_group_interface__extract_grobs (Grob const *elt, T *, const char* name)
 {
   Link_array<T> arr;
 
index 7788833f4b19641dd9fa71d6f539fa59a9a641e8..79bf4ca69ed55c76d170834d94d6c2f276c81973 100644 (file)
@@ -101,9 +101,6 @@ SCM ly_truncate_list (int k, SCM l );
 #endif
 
 
-#ifdef CACHE_SYMBOLS
-
-
 /*
   We don't use gh_symbol2scm directly, since it has const-correctness
   problems in GUILE 1.3.4
@@ -111,6 +108,9 @@ SCM ly_truncate_list (int k, SCM l );
  */
 SCM my_gh_symbol2scm (const char* x);
 
+#ifdef CACHE_SYMBOLS
+
+
 /*
   Using this trick we cache the value of gh_symbol2scm ("fooo") where
   "fooo" is a constant string. This is done at the cost of one static
@@ -129,7 +129,7 @@ SCM my_gh_symbol2scm (const char* x);
   value = gh_symbol2scm ((char*) (x)); \
   value; })
 #else
-inline SCM ly_symbol2scm(char const* x) { return gh_symbol2scm((x)); }
+inline SCM ly_symbol2scm(char const* x) { return my_gh_symbol2scm((x)); }
 #endif 
 
 
index bafbe115783fb65be2d04885279513a49e12852d..20e444476001c0da86ac00b64fef2003d1151bae 100644 (file)
@@ -184,6 +184,5 @@ class Translator_group;
 class Transposed_music;
 class Tremolo_req;
 class Type_swallow_translator;
-class Unfolded_repeat_iterator;
 class yyFlexLexer;
 #endif // LILY_PROTO_HH;
index b82571b20c04a99df03cb7b34deaba784b0d3a65..c4f500cf5e2a65286128ab02498d1447d82b597b 100644 (file)
@@ -48,6 +48,9 @@ public:
 
   My_lily_lexer * lexer_p_;
   bool ignore_version_b_;
+
+  SCM last_beam_start_;
+  void beam_check (SCM); 
   
   Input here_input () const;
   void push_spot ();
diff --git a/lily/include/new-spacing-spanner.hh b/lily/include/new-spacing-spanner.hh
deleted file mode 100644 (file)
index 6238dde..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*   
-  spacing-spanner.hh -- declare New_spacing_spanner
-  
-  source file of the GNU LilyPond music typesetter
-  
-  (c) 1999--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-  
- */
-
-#ifndef SPACING_SPANNER_HH
-#define SPACING_SPANNER_HH
-
index 1905c72e85550fa9d5dd9666332e5b83ef9244ca..cedd931120ed3d4c574c539931f10ad3d7aad430 100644 (file)
@@ -18,8 +18,9 @@ public:
   static bool has_interface (Grob*);
 
   static Real get_spacing (Grob *me);
-
-  DECLARE_SCHEME_CALLBACK(before_line_breaking,(SCM));
+  static Real stem_dir_correction (Grob *me);  
+  static Item * right_column (Grob*);
+  static Item * left_column (Grob*);  
 };
 
 #endif /* NOTE_SPACING_HH */
index b045401a028d3fac6a21de30d72aefe824a8bbb0..f7a43ccd2ba5d71f3f4880febea64e387dd46335 100644 (file)
@@ -20,7 +20,6 @@ public:
   static void do_measure (Grob*,Link_array<Grob> const &) ;
   static void stretch_to_regularity (Grob*, Array<Spring> *, Link_array<Grob> const &);
   DECLARE_SCHEME_CALLBACK (set_springs, (SCM ));
-  static Real stem_dir_correction (Grob*,Grob*,Grob*)  ;
   static Real default_bar_spacing (Grob*,Grob*,Grob*,Moment)  ;
   static Real note_spacing (Grob*,Grob*,Grob*,Moment)  ;
   static Real get_duration_space (Grob*,Moment dur, Moment shortest) ;
index 8a170e301946fc67bd721a883e3a3c8415d12c8f..a20151806787f77f5d7a252efd04eaf58579fede 100644 (file)
@@ -20,12 +20,9 @@ class Timing_translator : public virtual Translator
 public:
   VIRTUAL_COPY_CONS (Translator);
   Timing_translator ();
-  Music *check_;
 
 protected: 
   virtual void initialize ();
-  virtual bool try_music (Music *req_l);
-  virtual void process_music ();
   virtual void stop_translation_timestep ();
   virtual void start_translation_timestep ();
 
index 4447f3f64f542fb0654e9ac3c5a4ba89482d2123..08c2e76de8da02bddc35f439662370994bf80e80 100644 (file)
@@ -186,3 +186,9 @@ Item::do_derived_mark ()
     scm_gc_mark (broken_to_drul_[RIGHT]->self_scm ());
   return SCM_EOL;
 }
+
+Item*
+unsmob_item (SCM s )
+{
+  return dynamic_cast<Item*> (unsmob_grob (s));
+}
index 445d1972656af812639fa4b9f9237191aa22811b..6f331d75c4db95e10372963c54bbef6504ca58a2 100644 (file)
@@ -11,7 +11,6 @@
 #include "musical-request.hh"
 #include "item.hh"
 #include "bar.hh"
-#include "timing-translator.hh"
 #include "staff-symbol-referencer.hh"
 #include "translator-group.hh"
 #include "engraver.hh"
index eaadc08fa5dab1981799e7ab91fa990a2f85a909..22a9521178cb4b44c3671786f0f76d62630f12a1 100644 (file)
@@ -51,7 +51,7 @@ void
 Line_of_score::typeset_grob (Grob * elem_p)
 {
   elem_p->pscore_l_ = pscore_l_;
-  Pointer_group_interface::add_element (this, ly_symbol2scm ("all-elements"),elem_p);
+  Pointer_group_interface::add_grob (this, ly_symbol2scm ("all-elements"),elem_p);
   scm_gc_unprotect_object (elem_p->self_scm ());
 }
 
@@ -469,7 +469,7 @@ Link_array<Grob>
 Line_of_score::column_l_arr ()const
 {
   Link_array<Grob> acs
-    = Pointer_group_interface__extract_elements (this, (Grob*) 0, "columns");
+    = Pointer_group_interface__extract_grobs (this, (Grob*) 0, "columns");
   bool bfound = false;
   for (int i= acs.size (); i -- ;)
     {
index 57d790618f6ba8f8875a4d576d1e68e8dad3b5cd..5e4750221b3ca66783d018ed1b17f915e5cb13aa 100644 (file)
@@ -20,7 +20,7 @@ MAKE_SCHEME_CALLBACK (Lyric_extender,brew_molecule,1)
 SCM 
 Lyric_extender::brew_molecule (SCM smob) 
 {
-  Spanner *sp = dynamic_cast<Spanner*> (unsmob_grob (smob));
+  Spanner *sp = unsmob_spanner (smob);
 
   // ugh: refp
   Real leftext = sp->get_bound (LEFT)->extent (sp->get_bound (LEFT),
index ac54514748b9b325abff690a2c97a6ed79c92667..0ea2cf13f3c568312dcc312342598836f9dc8546 100644 (file)
@@ -223,7 +223,7 @@ Multi_measure_rest::brew_molecule (SCM smob)
 void
 Multi_measure_rest::add_column (Grob*me,Item* c)
 {
-  Pointer_group_interface::add_element (me, ly_symbol2scm ("columns"),c);
+  Pointer_group_interface::add_grob (me, ly_symbol2scm ("columns"),c);
 
   add_bound_item (dynamic_cast<Spanner*> (me),c);
 }
index 937c0f338aaaa337dbc59d899e4b57fbecaebb7f..f5221ad0e3e617b184a8edc9ec68f5c09170d3c1 100644 (file)
@@ -21,7 +21,7 @@ My_lily_parser::My_lily_parser (Sources * source_l)
   lexer_p_ = 0;
   default_duration_ = Duration (2,0);
   error_level_i_ = 0;
-
+  last_beam_start_ = SCM_EOL;
 
   default_header_p_ =0;
 }
index 9ec228cad14dcd12997a77372b0fd2f69b8658df..4107f1deba464145918e26dd586de5d1fd2d3dfe 100644 (file)
@@ -27,7 +27,6 @@ public:
   static void stretch_to_regularity (Grob*, Array<Spring> *, Link_array<Grob> const &);
   static void breakable_column_spacing (Item* l, Item *r);
   DECLARE_SCHEME_CALLBACK (set_springs, (SCM ));
-  static Real stem_dir_correction (Grob*,Grob*,Grob*)  ;
   static Real default_bar_spacing (Grob*,Grob*,Grob*,Moment)  ;
   static Real note_spacing (Grob*,Grob*,Grob*,Moment)  ;
   static Real get_duration_space (Grob*,Moment dur, Moment shortest) ;
@@ -187,8 +186,6 @@ cout << "params for cols " << Paper_column::rank_i (l) << " " << Paper_column::r
              hinterfleisch += -headwid + Separation_item::my_width (lm)[RIGHT] -
                0.5 * Separation_item::my_width (rm)[LEFT];
 
-
-             hinterfleisch += stem_dir_correction (me, l, r);
            }
 
          // ? why.
@@ -478,55 +475,6 @@ New_spacing_spanner::note_spacing (Grob*me, Grob *lc, Grob *rc,
   return dist;
 }
 
-
-/**
-   Correct for optical illusions. See [Wanske] p. 138. The combination
-   up-stem + down-stem should get extra space, the combination
-   down-stem + up-stem less.
-
-   This should be more advanced, since relative heights of the note
-   heads also influence required correction.
-
-   Also might not work correctly in case of multi voices or staff
-   changing voices
-
-   TODO: lookup correction distances?  More advanced correction?
-   Possibly turn this off?
-
-   TODO: have to check wether the stems are in the same staff.
-
-   This routine reads the DIR-LIST property of both its L and R arguments.  */
-Real
-New_spacing_spanner::stem_dir_correction (Grob*me, Grob*l, Grob*r) 
-{
-  SCM dl = l->get_grob_property ("dir-list");
-  SCM dr = r->get_grob_property ("dir-list");
-  
-  if (scm_ilength (dl) != 1 || scm_ilength (dr) != 1)
-    return 0.;
-
-  dl = ly_car (dl);
-  dr = ly_car (dr);
-
-  assert (gh_number_p (dl) && gh_number_p (dr));
-  int d1 = gh_scm2int (dl);
-  int d2 = gh_scm2int (dr);
-
-  if (d1 == d2)
-    return 0.0;
-
-
-  Real correction = 0.0;
-  Real ssc = gh_scm2double (me->get_grob_property ("stem-spacing-correction"));
-
-  if (d1 && d2 && d1 * d2 == -1)
-    {
-      correction = d1 * ssc;
-    }
-  else
-    programming_error ("Stem directions not set correctly for optical correction");
-  return correction;
-}
   
 
 MAKE_SCHEME_CALLBACK (New_spacing_spanner, set_springs,1);
index 95b2cd67ed9f8ace6e4e59cff8aa628d6a7d4894..5c1b664bbe9c5aee17aa42be34988d3877f6cb75 100644 (file)
@@ -47,7 +47,7 @@ Item *
 Note_column::stem_l (Grob*me) 
 {
   SCM s = me->get_grob_property ("stem");
-  return  dynamic_cast<Item*> (unsmob_grob (s));
+  return  unsmob_item (s);
 }
   
 Slice
@@ -99,7 +99,7 @@ Note_column::add_head (Grob*me,Grob *h)
     }
   else if (Note_head::has_interface (h))
     {
-      Pointer_group_interface::add_element (me, ly_symbol2scm ("note-heads"),h);
+      Pointer_group_interface::add_grob (me, ly_symbol2scm ("note-heads"),h);
     }
   Axis_group_interface::add_element (me, h);
 }
diff --git a/lily/note-spacing-engraver.cc b/lily/note-spacing-engraver.cc
deleted file mode 100644 (file)
index 47b11ae..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-#if 0
-/*   
-  note-spacing-engraver.cc --  implement  Note_spacing_engraver.
-
-  source file of the GNU LilyPond music typesetter
-
-  (c) 2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-
-*/
-
-#include "grob.hh"
-#include "moment.hh"
-#include "engraver.hh"
-#include "note-spacing.hh"
-#include "note-column.hh"
-
-/*
-  Originally, we tried to have this functionality at Staff_level
-  
-  - by simply using the sequence of Separation-item as
-  spacing-sequences. Unfortunately, this fucks up if there are
-  different kinds of tuplets combined (8th and 8ths triplets combined
-  made the program believe there were 1/12 th notes.).
-
-
-  - We also created them from Rhythmic_column_engraver, but this has
-  the problem that voices can appear and disappear at will, leaving
-  lots of loose ends (the StaffSpacing don't know where to connect the
-  last note of the voice on the right with)
-  
- */
-
-struct Grob_moment_tuple
-{
-  Link_array<Grob> current_heads_;
-  Link_array<Grob> todo_heads_;
-  
-  Moment length_;
-  
-  static int time_compare (Grob_moment_tuple const &a, Grob_moment_tuple const &b)
-  {
-    return Moment::compare (a.length_, b.length_);
-  }
-};
-
-class Note_spacing_engraver : public Engraver
-{
-public:
-  TRANSLATOR_DECLARATIONS(Note_spacing_engraver);
-
-
-protected:
-  Array<Grob_moment_tuple> lengths_found_;
-
-  virtual void acknowledge_grob (Grob_info);
-};
-
-Note_spacing_engraver::Note_spacing_engraver()
-{
-}
-
-
-void
-Note_spacing_engraver::acknowledge_grob (Grob_info gi)
-{
-  if (Note_head::has_interface (gi.grob_l_))
-    {
-      Music *m = gi.music_cause();
-      Moment now = now_mom ();
-      Moment len = m->length_mom(); 
-      if (now.grace_part_ && len.main_part_)
-       {
-         len.grace_part_ += len.main_part_;
-         len.main_part_ = 0;
-       }
-      
-      for (int  i=0; i <  
-    }
-  Note_column::has_interface (gi.grob_l_))
-    {
-      Grob *head  =Note_column::first_head (gi.grob_l_);
-
-      head->
-    }
-}
-
-
-
-ENTER_DESCRIPTION(Note_spacing_engraver,
-/* descr */       "This engraver creates spacing objects. It should be placed at staff
-level, but will also function at voice level.
-
-",
-/* creats*/       "NoteSpacing",
-/* acks  */       "rhythmic-column-interface",
-/* reads */       "",
-/* write */       "");
-
-#endif
index 0628ffab827b7a675b54ebfb2ff99d8bfdb3522d..4b0d784b18e3930335865c9c5ae310d42c41f039 100644 (file)
@@ -14,6 +14,7 @@
 #include "grob.hh"
 #include "note-column.hh"
 #include "warn.hh"
+#include "stem.hh"
 
 bool
 Note_spacing::has_interface (Grob* g)
@@ -21,8 +22,6 @@ Note_spacing::has_interface (Grob* g)
   return g && g->has_interface (ly_symbol2scm ("note-spacing-interface"));
 }
 
-
-
 Real
 Note_spacing::get_spacing (Grob *me)
 {
@@ -40,6 +39,9 @@ Note_spacing::get_spacing (Grob *me)
          if (d == RIGHT)
            {
              Grob * accs = Note_column::accidentals (it);
+             if (!accs)
+               accs = Note_column::accidentals (it->get_parent (X_AXIS));
+             
              if (accs)
                extents[d].unite (accs->extent (it->column_l (), X_AXIS));
            }
@@ -60,29 +62,149 @@ Note_spacing::get_spacing (Grob *me)
   return dx;
 }
 
+Item *
+Note_spacing::left_column (Grob *me)
+{
+  if (me->immutable_property_alist_ == SCM_EOL)
+    return 0;
+  
+  return dynamic_cast<Item*> (me)->column_l ();
+}
 
-MAKE_SCHEME_CALLBACK(Note_spacing, before_line_breaking, 1)
-SCM
-Note_spacing::before_line_breaking (SCM g)
+/*
+  Compute the column of the right-items.  This is a big function,
+since RIGHT-ITEMS may span more columns (eg. if a clef if inserted,
+this will add a new columns to RIGHT-ITEMS. Here we look at the
+columns, and return the left-most. If there are multiple columns, we
+prune RIGHT-ITEMS.
+   
+ */
+Item *
+Note_spacing::right_column (Grob*me)
 {
-  Grob * me = unsmob_grob (g);
+  /*
+    ugh. should have generic is_live() method?
+   */
+  if (me->immutable_property_alist_ == SCM_EOL)
+    return 0;
+  
   SCM right = me->get_grob_property ("right-items");
+  Item *mincol = 0;
+  int min_rank = INT_MAX;
+  bool prune = false;
+  for (SCM s = right ; gh_pair_p (s) ; s = gh_cdr (s))
+    {
+      Item * ri = unsmob_item (gh_car (s));
+
+      Item * col = ri->column_l ();
+      int rank = Paper_column::rank_i (col);
+
+      if (rank < min_rank)
+       {
+         min_rank = rank;
+         if (mincol)
+           prune = true;
 
-  if (gh_pair_p (right))
-    right = gh_car (right);
+         mincol = col;
+       }
+    }
   
-  Grob *right_grob = unsmob_grob (right);
+  if (prune)
+    {
+      // I'm a lazy bum. We could do this in-place.
+      SCM newright  = SCM_EOL;
+      for (SCM s = right ; gh_pair_p (s) ; s =gh_cdr (s))
+       {
+         if (unsmob_item (gh_car (s))->column_l () == mincol)
+           newright = gh_cons (gh_car (s), newright);
+       }
 
-  Item * ri = dynamic_cast<Item*> (right_grob);
-  if (!ri)
+      me->set_grob_property ("right-items", newright);
+    }
+  
+  if (!mincol)
     {
+      /*
       int r = Paper_column::rank_i (dynamic_cast<Item*>(me)->column_l ());
       programming_error (_f("Spacing wish column %d has no right item.", r));
+      */
+
+      return 0;
     }
-  else
+
+  return mincol;
+}
+
+/**
+   Correct for optical illusions. See [Wanske] p. 138. The combination
+   up-stem + down-stem should get extra space, the combination
+   down-stem + up-stem less.
+
+   TODO: have to check wether the stems are in the same staff.
+
+   TODO: also correct for bar lines in RIGHT-ITEMS.  Should check if
+   the barline is the leftmost object of the break alignment.
+
+*/
+Real
+Note_spacing::stem_dir_correction (Grob*me) 
+{
+  Drul_array<Direction> stem_dirs(CENTER,CENTER);
+  Drul_array<Interval> posns;
+  Drul_array<SCM> props(me->get_grob_property ("left-items"),
+                       me->get_grob_property ("right-items"));
+
+  stem_dirs[LEFT] = stem_dirs[RIGHT] = CENTER;
+  Interval intersect;
+  bool correct = true;
+  Direction d = LEFT;
+  do
     {
-      me->set_grob_property ("right-column", ri->column_l ()->self_scm());
+      for (SCM  s = props[d]; gh_pair_p (s); s = gh_cdr (s))
+       {
+         Item * it= dynamic_cast<Item*> (unsmob_grob (gh_car(s)));
+
+         Grob *stem = Note_column::stem_l (it);
+
+         if (!stem || Stem::invisible_b (stem))
+           {
+             correct = false;
+             goto exit_loop ;
+           }
+
+         Direction sd = Stem::get_direction (stem);
+         if (stem_dirs[d] && stem_dirs[d] != sd)
+           {
+             correct = false;
+             goto exit_loop;
+           }
+         stem_dirs[d] = sd;
+
+         Real chord_start = Stem::head_positions (stem)[sd];
+         Real stem_end = Stem::stem_end_position (stem);
+         
+         posns[d] = Interval(chord_start<?stem_end, chord_start>? stem_end);
+       }
     }
+  while (flip (&d) != LEFT);
   
-  return SCM_UNSPECIFIED;
+  intersect = posns[LEFT];  
+  intersect.intersect(posns[RIGHT]);
+  correct = correct && !intersect.empty_b ();
+  correct = correct && (stem_dirs[LEFT] *stem_dirs[RIGHT] == -1);
+  
+ exit_loop:
+  if(!correct)
+    return 0.0;
+
+  /*
+    Ugh. 7 is hardcoded.
+   */
+  Real correction = abs (intersect.length ());
+  correction = (correction/7) <? 1.0;
+  correction *= stem_dirs[LEFT] ;
+  correction *= gh_scm2double (me->get_grob_property ("stem-spacing-correction"));
+
+  return correction;
 }
index 0a7437fead2a9fba1f5685d894f0fbc5e63a6063..0de5be0bf5534ede0307ca544bb724ceee8d813d 100644 (file)
@@ -284,7 +284,7 @@ yylex (YYSTYPE *s,  void * v_l)
 %type <scm>    identifier_init 
 
 %type <scm> steno_duration optional_notemode_duration multiplied_duration
-%type <scm>  explicit_duration
+%type <scm>  verbose_duration
        
 %type <reqvec>  pre_requests post_requests
 %type <request> gen_text_def
@@ -468,7 +468,7 @@ identifier_init:
                $$ = $1->self_scm ();
                scm_gc_unprotect_object ($$);
        }
-       | explicit_duration {
+       | verbose_duration {
                $$ = $1;
        }
        | number_expression {
@@ -1112,6 +1112,11 @@ command_element:
                $$-> set_spot (THIS->here_input ());
                $1-> set_spot (THIS->here_input ());
        }
+       | '|'      {
+               extern Music * get_barcheck();
+               $$ = get_barcheck ();
+               $$->set_spot (THIS->here_input ());
+       }
        | BAR STRING                    {
                Music *t = set_property_music (ly_symbol2scm ("whichBar"), $2);
 
@@ -1206,9 +1211,6 @@ shorthand_command_req:
        | hyphen_req {
                $$ = $1;
        }
-       | '|'                           {
-               $$ = new Barcheck_req;
-       }
        | '~'   {
                $$ = new Tie_req;
        }
@@ -1217,6 +1219,9 @@ shorthand_command_req:
                b->set_span_dir (START);
                b->set_mus_property ("span-type", ly_str02scm ("beam"));
                $$ =b;
+
+
+               THIS->last_beam_start_ = b->self_scm ();
        }
        | ']'           {
                Span_req*b= new Span_req;
@@ -1449,7 +1454,7 @@ explicit_pitch:
        }
        ;
 
-explicit_duration:
+verbose_duration:
        DURATION embedded_scm   {
                $$ = $2;
                if (!unsmob_duration ($2))
@@ -1602,20 +1607,25 @@ duration_length:
        multiplied_duration {
                $$ = $1;
        }
-       | explicit_duration {
+       | verbose_duration {
                $$ = $1;
        }       
        ;
 
 optional_notemode_duration:
        {
-               $$ = THIS->default_duration_.smobbed_copy ();
+               Duration dd = THIS->default_duration_;
+               $$ = dd.smobbed_copy ();
+
+               THIS->beam_check ($$);
        }
        | multiplied_duration   {
                $$ = $1;
                THIS->default_duration_ = *unsmob_duration ($$);
+
+               THIS->beam_check ($$);
        }
-       | explicit_duration {
+       | verbose_duration {
                $$ = $1;
                THIS->default_duration_ = *unsmob_duration ($$);
        }       
@@ -2067,3 +2077,24 @@ My_lily_parser::do_yyparse ()
 }
 
 
+/*
+Should make this optional?    It will also complain when you do
+
+       [s4]
+
+which is entirely legitimate.
+
+Or we can scrap it. Barchecks should detect wrong durations, and
+skipTypesetting speeds it up a lot.
+*/
+void
+My_lily_parser::beam_check (SCM dur)
+{
+  Duration *d = unsmob_duration (dur);
+  if (unsmob_music (last_beam_start_) && d->duration_log () <= 2)
+    {
+      Music * m = unsmob_music (last_beam_start_);
+      m->origin ()->warning (_("Suspect duration found following this beam"));
+    }
+  last_beam_start_ = SCM_EOL;
+}
index e05da73520753026d03052b83d586cc5164c8378..1ef6002699ef6eaa8f7ccaec99c706854afcf17b 100644 (file)
@@ -47,7 +47,7 @@ Porrectus::get_left_head (Grob *me)
     }
   else
     {
-      Item *left_head = dynamic_cast<Item*> (unsmob_grob (left_head_scm));
+      Item *left_head = unsmob_item (left_head_scm);
       return left_head;
     }
 }
@@ -77,7 +77,7 @@ Porrectus::get_right_head (Grob *me)
     }
   else
     {
-      Item *right_head = dynamic_cast<Item*> (unsmob_grob (right_head_scm));
+      Item *right_head = unsmob_item (right_head_scm);
       return right_head;
     }
 }
index 50835d2946374b66a2cdfd18bbcaa79a7d335dae..170d4996dfb3e989d48a0864fef425a11d37cfe7 100644 (file)
@@ -16,8 +16,6 @@ Request_chord::Request_chord ()
                    Request_chord_iterator::constructor_cxx_function);
 }
 
-
-
 Pitch
 Request_chord::to_relative_octave (Pitch last)
 {
@@ -43,6 +41,4 @@ Request_chord::start_mom () const
   return Music::start_mom ();
 }
 
-
-
 ADD_MUSIC (Request_chord);
index a521f8aaf92390a8313f6f5a4e2df955d4d95d1d..c3caa235c1c5300bad39966ab7f7bf911bfabcb3 100644 (file)
@@ -47,7 +47,7 @@ void
 Rest_collision::add_column (Grob*me,Grob *p)
 {
   me->add_dependency (p);
-  Pointer_group_interface::add_element (me, ly_symbol2scm ("elements"), p);
+  Pointer_group_interface::add_grob (me, ly_symbol2scm ("elements"), p);
 
   /*
     only add callback for the rests, since we don't move anything else.
index 84bd2ae16c8549947405b4669172d9244665d326..905af2118641988622e7ccbb39d7e4ea447539cc 100644 (file)
 #include "dot-column.hh"
 #include "musical-request.hh"
 #include "item.hh"
+#include "group-interface.hh"
+
+
+
+/*
+  this engraver  glues together stems, rests and note heads into a NoteColumn
+  grob.
+
+  It also generates spacing objects.  Originally, we have tried to
+  have the spacing functionality at different levels.
+  
+  - by simply using the sequence of Separation-item as
+  spacing-sequences (at staff level). Unfortunately, this fucks up if
+  there are different kinds of tuplets in different voices (8th and
+  8ths triplets combined made the program believe there were 1/12 th
+  notes.).
+
+  Doing it in a separate engraver using timing info is generally
+  complicated (start/end time management), and fucks up if a voice
+  changes staff.
+
+  Now we do it from here again. This has the problem that voices can
+  appear and disappear at will, leaving lots of loose ends (the note
+  spacing engraver don't know where to connect the last note of the
+  voice on the right with), but we don't complain about those, and let
+  the default spacing do its work.
+
+ */
+
 
 class Rhythmic_column_engraver :public Engraver
 {
@@ -58,6 +87,19 @@ Rhythmic_column_engraver::create_grobs ()
          note_column_ = new Item (get_property ("NoteColumn"));
          Note_column::set_interface (note_column_);
          announce_grob (note_column_, 0);
+
+
+         spacing_ = new Item (get_property ("NoteSpacing"));
+         spacing_->set_grob_property ("left-items", gh_cons (note_column_->self_scm (), SCM_EOL));
+         announce_grob (spacing_, 0);
+
+         if (last_spacing_)
+           {
+            Pointer_group_interface::add_grob (last_spacing_,
+                                               ly_symbol2scm ("right-items" ),
+                                               note_column_);
+           }
+
        }
 
       for (int i=0; i < rhead_l_arr_.size (); i++)
@@ -133,7 +175,7 @@ Rhythmic_column_engraver::start_translation_timestep ()
 
 ENTER_DESCRIPTION(Rhythmic_column_engraver,
 /* descr */       "Generates NoteColumn, an objects that groups stems, noteheads and rests.",
-/* creats*/       "NoteColumn",
+/* creats*/       "NoteColumn NoteSpacing",
 /* acks  */       "stem-interface rhythmic-head-interface dot-column-interface",
 /* reads */       "",
 /* write */       "");
index 849a849e434de28eb1e3117799c143dcb79bc44a..889b9112c7d907667b999e33c0bc4602c49402ac 100644 (file)
@@ -18,7 +18,7 @@ Item*
 Rhythmic_head::dots_l (Grob*me) 
 {
   SCM s = me->get_grob_property ("dot");
-  return dynamic_cast<Item*> (unsmob_grob (s));
+  return unsmob_item (s);
 }
 
 int
@@ -32,7 +32,7 @@ Item*
 Rhythmic_head::stem_l (Grob*me) 
 {
   SCM s = me->get_grob_property ("stem");
-  return dynamic_cast<Item*> (unsmob_grob (s));
+  return unsmob_item (s);
 }
 
 int
index 5a4d27018afb6867a992cdab73a92bee1fa76d07..7fc08cd6ef6fe5f0f018189a77809e84ebcb269b 100644 (file)
@@ -67,10 +67,10 @@ Scheme_hash_table::print_smob (SCM s, SCM p, scm_print_state*)
   assert (unsmob (s));
   char str[1000];
   sprintf (str, "#<Scheme_hash_table 0x%0lx ", SCM_UNPACK(s));
-   Scheme_hash_table *me = (Scheme_hash_table*) SCM_CELL_WORD_1 (s);
-   scm_display (me->hash_tab_, p);      
-   scm_puts ("> ",p);        
-   return 1;
+  Scheme_hash_table *me = (Scheme_hash_table*) SCM_CELL_WORD_1 (s);
+  scm_display (me->hash_tab_, p);      
+  scm_puts ("> ",p);        
+  return 1;
 }
 
 bool
index 6aad0e533e26b7a96d8d92aaa076bbfa1239d6d4..74ca09b651c6225cd96eba17a841e5d23c13e061 100644 (file)
@@ -289,15 +289,15 @@ Score_engraver::acknowledge_grob (Grob_info gi)
 {
   if (Staff_spacing::has_interface (gi.grob_l_))
     {
-      Pointer_group_interface::add_element (command_column_l_,
+      Pointer_group_interface::add_grob (command_column_l_,
                                            ly_symbol2scm ("spacing-wishes"),
                                            gi.grob_l_);
     }
   if (Note_spacing::has_interface (gi.grob_l_))
     {
-      Pointer_group_interface::add_element (musical_column_l_,
-                                           ly_symbol2scm ("spacing-wishes"),
-                                           gi.grob_l_);
+      Pointer_group_interface::add_grob (musical_column_l_,
+                                        ly_symbol2scm ("spacing-wishes"),
+                                        gi.grob_l_);
     }
 }
 
index 7d8cdc7467f6495360e64f4976cfe3411e90b17d..c45ee3c92ca5de624511bdea5b6858b5185ae206 100644 (file)
@@ -18,7 +18,7 @@ Script_column::add_staff_sided (Grob *me, Item *i)
   if (!gh_number_p (p))
     return;
 
-  Pointer_group_interface::add_element (me, ly_symbol2scm ("scripts"),i);
+  Pointer_group_interface::add_grob (me, ly_symbol2scm ("scripts"),i);
   
   me->add_dependency (i);
 }
@@ -41,7 +41,7 @@ Script_column::before_line_breaking (SCM smob)
   Grob* me = unsmob_grob (smob);
   Drul_array<Link_array<Grob> > arrs;
   Link_array<Grob> staff_sided 
-    = Pointer_group_interface__extract_elements (me, (Grob*)0, "scripts");
+    = Pointer_group_interface__extract_grobs (me, (Grob*)0, "scripts");
                                     
                                     
   for (int i=0; i < staff_sided.size (); i++)
index 52d25ec48985e3f138f417decd6816ba544a726e..4b24e995013c08680489bc0aca7a735d61e666c8 100644 (file)
@@ -92,7 +92,7 @@ Separating_group_spanner::set_spacing_rods (SCM smob)
        Order of elements is reversed!
        */
       SCM elt = ly_car (s);
-      Item *r = dynamic_cast<Item*> (unsmob_grob (elt));
+      Item *r = unsmob_item (elt);
 
       if (!r)
        continue;
@@ -131,7 +131,7 @@ Separating_group_spanner::set_spacing_rods (SCM smob)
 void
 Separating_group_spanner::add_spacing_unit (Grob* me ,Item*i)
 {
-  Pointer_group_interface::add_element (me, ly_symbol2scm ("elements"), i);
+  Pointer_group_interface::add_grob (me, ly_symbol2scm ("elements"), i);
   me->add_dependency (i);
 }
 
index 57100c952ec5402b9439fca66beb55a8107ca6ae..26e59e6439eaa422faec1d2bbfc793565fa971ce 100644 (file)
@@ -14,7 +14,7 @@
 #include "engraver.hh"
 #include "axis-group-interface.hh"
 #include "note-spacing.hh"
-
+#include "group-interface.hh"
 
 struct Spacings
 {
@@ -132,10 +132,10 @@ Separating_line_group_engraver::acknowledge_grob (Grob_info i)
 
          if (int i = last_spacings_.note_spacings_.size ())
            {
-             SCM break_malt = gh_cons (break_malt_p_->self_scm (), SCM_EOL);
              for (; i--;)
-               last_spacings_.note_spacings_[i]
-                 ->set_grob_property ("right-items",break_malt);
+               Pointer_group_interface::add_grob (last_spacings_.note_spacings_[i],
+                                                  ly_symbol2scm ("right-items"),
+                                                  break_malt_p_);
                                     
            }
          else if (last_spacings_.staff_spacing_)
@@ -174,7 +174,8 @@ Separating_line_group_engraver::stop_translation_timestep ()
        note-spacing grobs.
        */
       if (musical_malt_p_)
-       sp->set_grob_property ("right-items", musical_malt_p_->self_scm());
+       Pointer_group_interface::add_grob (sp, ly_symbol2scm ("right-items"),
+                                          musical_malt_p_);
 
       typeset_grob (sp);
     }
index 534d209182fb18f6d9ee6ac05fa8eea7c3998827..ca51ff9c2bca0ba8d0e34f923a3685cde00ebd50 100644 (file)
@@ -23,7 +23,7 @@ void
 Separation_item::add_item (Grob*s,Item* i)
 {
   assert (i);
-  Pointer_group_interface::add_element (s, ly_symbol2scm ("elements"),i);
+  Pointer_group_interface::add_grob (s, ly_symbol2scm ("elements"),i);
   s->add_dependency (i);
 }
 
@@ -40,7 +40,7 @@ Separation_item::my_width (Grob *me)
       if (!unsmob_grob (elt))
        continue;
 
-      Item *il = dynamic_cast<Item*> (unsmob_grob (elt));
+      Item *il = unsmob_item (elt);
       if (pc != il->column_l ())
        {
          /* this shouldn't happen, but let's continue anyway. */
index e77983a529269371479cdb9cce3e8c4ba270d1c1..9b8b19c98989eb0acaeb5557b0cf96151b544606 100644 (file)
@@ -10,7 +10,6 @@
 #include "debug.hh"
 #include "sequential-music-iterator.hh"
 #include "music-list.hh"
-#include "request-chord-iterator.hh"
 
 
 /*
index a006af5a6925ce31801fc4f28879e3ec8b030e53..a382836e2075fbc170d6f6c90c0f4146903ba243 100644 (file)
@@ -19,7 +19,7 @@
 void
 Side_position_interface::add_support (Grob*me, Grob*e)
 {
-  Pointer_group_interface::add_element (me, ly_symbol2scm ("side-support-elements"), e);
+  Pointer_group_interface::add_grob (me, ly_symbol2scm ("side-support-elements"), e);
 }
 
 
index 6db86ee0d9a59583333928f2146b16833e4846bf..ea9c26d2cd9e09cd9c5bf5455530fb06328c7408 100644 (file)
@@ -29,6 +29,14 @@ Simple_music_iterator::ok ()const
   return last_processed_mom_ < music_length_mom ();
 }
 
+/*
+  TODO: remove last_processed_mom_, and the complete shit.  We should
+  only process a simple-music once, and that is at its start.
+
+  Engravers can detect and request the end-moments to be processed as
+  well.
+
+*/
 Moment
 Simple_music_iterator::pending_moment ()const
 {
index 479e11f6652e8864393a52e63e469b250652d229..15a8b30ea8fb2b453794c9dc25f095366cebda2a 100644 (file)
@@ -48,7 +48,7 @@ Slur::add_column (Grob*me, Grob*n)
     warning (_ ("Putting slur over rest.  Ignoring."));
   else
     {
-      Pointer_group_interface::add_element (me, ly_symbol2scm ("note-columns"), n);
+      Pointer_group_interface::add_grob (me, ly_symbol2scm ("note-columns"), n);
       me->add_dependency (n);
     }
 
@@ -92,7 +92,7 @@ Direction
 Slur::get_default_dir (Grob*me) 
 {
   Link_array<Grob> encompass_arr =
-    Pointer_group_interface__extract_elements (me, (Grob*)0, "note-columns");
+    Pointer_group_interface__extract_grobs (me, (Grob*)0, "note-columns");
   
   Direction d = DOWN;
   for (int i=0; i < encompass_arr.size (); i ++) 
index ec1e0430c008b26310594bacde440277dc59463d..3d54aa372343d79699e3edb5e38feb7128539672 100644 (file)
@@ -67,7 +67,6 @@ Spaceable_grob::remove_interface (Grob*me)
 {
   me->remove_grob_property ("minimum-distances");
   me->remove_grob_property ("ideal-distances");
-  me->remove_grob_property ("dir-list");
 }
 
 
index ebba459d17b9dd54d252364b39fbdd3078a218c1..f9849da294799c8286f13ba52020ff493cd15f61 100644 (file)
@@ -97,7 +97,7 @@ Spacing_engraver::acknowledge_grob (Grob_info i)
 {
   if (Note_spacing::has_interface (i.grob_l_) || Staff_spacing::has_interface (i.grob_l_))
     {
-      Pointer_group_interface::add_element (spacing_p_, ly_symbol2scm  ("wishes"), i.grob_l_);
+      Pointer_group_interface::add_grob (spacing_p_, ly_symbol2scm  ("wishes"), i.grob_l_);
     }
   
   if (to_boolean (i.grob_l_->get_grob_property ("non-rhythmic")))
index 92b7cb748017c229603bfc368b0d5d7b3015ddfd..841fa7ccfb3757e7fe54ed5d4a2ace0a911af519 100644 (file)
@@ -163,12 +163,7 @@ Spacing_spanner::do_measure (Grob*me, Link_array<Grob> const & cols)
            don't want to create too much extra space for accidentals
          */
          if (Paper_column::musical_b (rc))
-          {
-             if (to_boolean (rc->get_grob_property ("contains-grace")))
-               right_dist *= gh_scm2double (rc->get_grob_property ("before-grace-spacing-factor")); // fixme.
-             else
-               right_dist *= gh_scm2double (lc->get_grob_property ("before-musical-spacing-factor"));
-          }
+           right_dist *= gh_scm2double (lc->get_grob_property ("before-musical-spacing-factor"));
 
          s.distance_f_ = left_distance + right_dist;
            
@@ -407,14 +402,6 @@ Spacing_spanner::note_spacing (Grob*me, Grob *lc, Grob *rc,
 
 
 
-  /*
-    UGH: KLUDGE!
-  */
-  
-  if (delta_t > Moment (Rational (1,32)))
-    dist += stem_dir_correction (me, lc,rc);
-
-
   Moment *lm = unsmob_moment (lc->get_grob_property ("when"));
   Moment *rm = unsmob_moment (rc->get_grob_property ("when"));
 
@@ -430,57 +417,6 @@ Spacing_spanner::note_spacing (Grob*me, Grob *lc, Grob *rc,
   return dist;
 }
 
-
-/**
-   Correct for optical illusions. See [Wanske] p. 138. The combination
-   up-stem + down-stem should get extra space, the combination
-   down-stem + up-stem less.
-
-   This should be more advanced, since relative heights of the note
-   heads also influence required correction.
-
-   Also might not work correctly in case of multi voices or staff
-   changing voices
-
-   TODO: lookup correction distances?  More advanced correction?
-   Possibly turn this off?
-
-   TODO: have to check wether the stems are in the same staff.
-
-   This routine reads the DIR-LIST property of both its L and R arguments.  */
-Real
-Spacing_spanner::stem_dir_correction (Grob*me, Grob*l, Grob*r) 
-{
-  SCM dl = l->get_grob_property ("dir-list");
-  SCM dr = r->get_grob_property ("dir-list");
-  
-  if (scm_ilength (dl) != 1 || scm_ilength (dr) != 1)
-    return 0.;
-
-  dl = ly_car (dl);
-  dr = ly_car (dr);
-
-  assert (gh_number_p (dl) && gh_number_p (dr));
-  int d1 = gh_scm2int (dl);
-  int d2 = gh_scm2int (dr);
-
-  if (d1 == d2)
-    return 0.0;
-
-
-  Real correction = 0.0;
-  Real ssc = gh_scm2double (me->get_grob_property ("stem-spacing-correction"));
-
-  if (d1 && d2 && d1 * d2 == -1)
-    {
-      correction = d1 * ssc;
-    }
-  else
-    programming_error ("Stem directions not set correctly for optical correction");
-  return correction;
-}
-  
-
 MAKE_SCHEME_CALLBACK (Spacing_spanner, set_springs,1);
 SCM
 Spacing_spanner::set_springs (SCM smob)
index bf39b2d3ac95229d1dbb2849a25892fe36f19abd..55b700a9bdfe10f2cef69a16be479bce80829c26 100644 (file)
@@ -20,7 +20,7 @@
 void
 Span_bar::add_bar (Grob*me, Grob*b)
 {
-  Pointer_group_interface::add_element (me, ly_symbol2scm ("elements"),  b);
+  Pointer_group_interface::add_grob (me, ly_symbol2scm ("elements"),  b);
 
   me->add_dependency (b);
 }
index 3579abefca1efc1d1036d41a9f5141cfc3fe2354..8f9cdd2412d75487fa328e2d3c25fdb900e8d9cb 100644 (file)
@@ -190,7 +190,7 @@ Spanner::set_bound (Direction d, Grob*s)
   */
   if (dynamic_cast<Paper_column*> (i))
     {
-      Pointer_group_interface::add_element (i, ly_symbol2scm ("bounded-by-me"), this);  
+      Pointer_group_interface::add_grob (i, ly_symbol2scm ("bounded-by-me"), this);  
     }
 }
 
@@ -399,3 +399,10 @@ Spanner::set_spacing_rods (SCM smob)
   r.add_to_cols ();
   return SCM_UNSPECIFIED;
 }
+
+
+Spanner*
+unsmob_spanner (SCM s )
+{
+  return dynamic_cast<Spanner*> (unsmob_grob (s));
+}
index a662f541331e5ea5ade65188b2b6f662c28e4e40..38c2b7072c28fcd21b3ffeaccdae1e203d4e1646 100644 (file)
@@ -1,5 +1,5 @@
 /*   
-staff-spacing.cc --  implement 
+staff-spacing.cc --  implement Staff_spacing
 
 source file of the GNU LilyPond music typesetter
 
@@ -16,3 +16,10 @@ Staff_spacing::has_interface (Grob* g)
   return g && g->has_interface (ly_symbol2scm ("staff-spacing-interface"));
 }
 
+
+/*
+  
+  TODO: move computation of clef/key-sig/whatever to first-note
+  distance here.
+
+*/
index 8502c7581c558ccf8c1ffa2e97900cacb980135c..304c382a81b0e2f7353ce8b00927450e5b9dbee4 100644 (file)
@@ -82,7 +82,6 @@ Stem::stem_end_position (Grob*me)
   Real pos;
   if (!gh_number_p (p))
     {
-
       pos = get_default_stem_end_position (me);
       me->set_grob_property ("stem-end-position", gh_double2scm (pos));
     }
@@ -228,7 +227,7 @@ Stem::add_head (Grob*me, Grob *n)
 
   if (Note_head::has_interface (n))
     {
-      Pointer_group_interface::add_element (me, ly_symbol2scm ("heads"), n);
+      Pointer_group_interface::add_grob (me, ly_symbol2scm ("heads"), n);
     }
   else
     {
@@ -380,7 +379,7 @@ Stem::position_noteheads (Grob*me)
     return;
   
   Link_array<Grob> heads =
-    Pointer_group_interface__extract_elements (me, (Grob*)0, "heads");
+    Pointer_group_interface__extract_grobs (me, (Grob*)0, "heads");
 
   heads.sort (compare_position);
   Direction dir =get_direction (me);
@@ -434,11 +433,9 @@ Stem::before_line_breaking (SCM smob)
       // suicide ();
     }
   
-  set_spacing_hints (me);
   return SCM_UNSPECIFIED;
 }
 
-
 /*
   ugh.
   When in a beam with tuplet brackets, brew_mol is called early,
@@ -460,31 +457,6 @@ Stem::height (SCM smob, SCM ax)
 }
 
 
-/**
-   set stem directions for hinting the optical spacing correction.
-
-   Modifies DIR_LIST property of the Stem's Paper_column
-
-   TODO: more advanced: supply height of noteheads as well, for more advanced spacing possibilities
- */
-void
-Stem::set_spacing_hints (Grob*me) 
-{
-  if (!invisible_b (me))
-    {
-      SCM scmdir  = gh_int2scm (get_direction (me));
-
-      Item* item = dynamic_cast<Item*> (me);
-      Item * col =  item->column_l ();
-      SCM dirlist =col->get_grob_property ("dir-list");
-      if (scm_c_memq (scmdir, dirlist) == SCM_BOOL_F)
-       {
-         dirlist = gh_cons (scmdir, dirlist);
-         col->set_grob_property ("dir-list", dirlist);
-       }
-    }
-}
-
 Molecule
 Stem::flag (Grob*me)
 {
index 1cda41fe53a4aa38851e64a26aae4650470ce669..8f09785c38f25f71db7361a4576ad8fc29ae22db 100644 (file)
@@ -39,7 +39,7 @@ System_start_delimiter_engraver::acknowledge_grob (Grob_info inf)
        don't add as Axis_group_interface::add_element (delim_,),
        because that would set the parent as well */
          
-      Pointer_group_interface::add_element (delim_, ly_symbol2scm ("elements"),  inf.grob_l_);
+      Pointer_group_interface::add_grob (delim_, ly_symbol2scm ("elements"),  inf.grob_l_);
     }
   else if (System_start_delimiter::has_interface (inf.grob_l_))
     {
index bfc1a34ac8597f9e4229f32d5a7ae8c2059bb3a7..45f356073f24da01c001bdb3f47f445a735c4d98 100644 (file)
 
     right-neighbors = List of spacing-wish grobs that are close to the
     current column.
-  
- */
 
 
+    left-neighbors = idem
+
+    (TODO: property-doc these!)
+ */
+
 class Third_spacing_spanner
 {
 public:
@@ -86,11 +89,13 @@ loose_column (Grob *l, Grob *c, Grob *r)
     return false;
 
   l_neighbor = l_neighbor->column_l();
-  r_neighbor = r_neighbor->column_l();
+  r_neighbor = dynamic_cast<Item*> (Note_spacing::right_column  (r_neighbor));
 
   if (l == l_neighbor && r == r_neighbor)
     return false;
 
+  if (!l_neighbor || !r_neighbor)
+    return false;
 
   /*
     Only declare loose if the bounds make a little sense.  This means
@@ -149,6 +154,14 @@ Third_spacing_spanner::prune_loose_colunms (Link_array<Grob> *cols)
          rns = gh_car (unsmob_grob (rns)->get_grob_property ("right-items"));
          c->set_grob_property ("between-cols", gh_cons (lns,
                                                         rns));
+
+
+         /*
+           TODO: we should have distance constraints for loose
+           columns anyway, and the placement could be improved. Clefs
+           easily run into their neigbhors when folded into too
+           little space.
+         */
        }
       else
        {
@@ -171,14 +184,13 @@ Third_spacing_spanner::set_explicit_neighbor_columns (Link_array<Grob> cols)
       int min_rank = 100000;   // inf.
 
 
-
-      SCM wishes=  cols[i]-> get_grob_property ("spacing-wishes");
+      SCM wishes=  cols[i]->get_grob_property ("spacing-wishes");
       for (SCM s =wishes; gh_pair_p (s); s = gh_cdr (s))
        {
          Item * wish = dynamic_cast<Item*> (unsmob_grob (gh_car (s)));
 
          Item * lc = wish->column_l ();
-         Grob * right = unsmob_grob (wish->get_grob_property ("right-column"));
+         Grob * right = Note_spacing::right_column (wish);
 
          if (!right)
            continue;
@@ -356,8 +368,6 @@ Third_spacing_spanner::do_measure (Grob*me, Link_array<Grob> *cols)
 
       SCM seq  = lc->get_grob_property ("right-neighbors");
 
-      Moment dt = Paper_column::when_mom (r) - Paper_column::when_mom (l);
-      
       /*
        hinterfleisch = hind-meat = amount of space following a note.
 
@@ -367,48 +377,49 @@ Third_spacing_spanner::do_measure (Grob*me, Link_array<Grob> *cols)
        property SPACING-SEQUENCE.  */
 
       Real stretch_distance = note_space;
-      if (shortest_in_measure <= dt)
-       {
-         /*
-           currently SPACING-SEQUENCE is set in
-           Separating_group_spanner::find_musical_sequences (), which
-           works neatly for one-voice-per staff, however,
-
-           it can't find out the actual duration of the notes on a
-           staff, so when putting tuplets and normal patterns it gets
-           confused, (ie. believes that < { c8 c8 } { d8 d8 d8 }*2/3
-           > contains 1/12 notes. ).
 
-           here we kludge, by checking if the distance we're spacing
-           for is less than the shortest note.
-
-           TODO:
+      hinterfleisch = -1.0;
+      Real max_factor = 0.0;
+      for (SCM s = seq; gh_pair_p (s); s = ly_cdr (s))
+       {
+         Grob * wish = unsmob_grob (gh_car (s));
 
-           Move SPACING-SEQUENCE detection into a voice
-           level-engraver --or-- make sure that every column has
-           access to the note head.
+         /*
+           TODO: configgable.
 
+           TODO: don't do stem-dir correction in polyphonic
+           stuff. It wastes CPU time.
          */
-         for (SCM s = seq; gh_pair_p (s); s = ly_cdr (s))
+         if (Note_spacing::has_interface (wish))
            {
-             Grob * wish = unsmob_grob (gh_car (s));
+             hinterfleisch = hinterfleisch >?
+               ( - headwid +
 
-             // TODO; configgable.
-             if (Note_spacing::has_interface (wish))
-               {
-                 hinterfleisch += -headwid + Note_spacing::get_spacing (wish);
-               }
+                 (note_space + Note_spacing::get_spacing (wish))
+                 *gh_scm2double (wish->get_grob_property ("space-factor"))
 
-             // should move into Note_spacing
-             // hinterfleisch += stem_dir_correction (me, l, r);
+                 + Note_spacing::stem_dir_correction (wish));
            }
+       }
+
+      // ? why.
+      if (gh_pair_p (seq))
+       stretch_distance -= headwid;
 
-         // ? why.
-         if (gh_pair_p (seq))
-           stretch_distance -= headwid;
-       }      
+         /*
+           something failed, or we get ridiculous close.
+          */
+      if (hinterfleisch < 0)
+       {
+         // maybe should issue a programming error.
+         hinterfleisch = note_space;
+       }
+
+      if (max_factor == 0.0)
+       max_factor = 1.0; 
+      
       Spring s;
-      s.distance_f_ = hinterfleisch;
+      s.distance_f_ = max_factor *  hinterfleisch;
       s.strength_f_ = 1 / stretch_distance;
 
       s.item_l_drul_[LEFT] = l;
index 50844a3b1ba358f5740365bbb689feb8428a1476..fa588acdcfe67ff1397d194bf9c7a990b02576f7 100644 (file)
@@ -44,7 +44,7 @@ Tie_column::add_tie (Grob*me,Grob *s)
       dynamic_cast<Spanner*> (me)->set_bound (RIGHT, Tie::head (s,RIGHT));
     }
   
-  Pointer_group_interface::add_element (me, ly_symbol2scm ("ties"), s);
+  Pointer_group_interface::add_grob (me, ly_symbol2scm ("ties"), s);
   s->add_dependency (me);
 }
 
@@ -69,7 +69,7 @@ void
 Tie_column::set_directions (Grob*me)
 {
   Link_array<Grob> ties =
-    Pointer_group_interface__extract_elements (me, (Grob*)0, "ties");
+    Pointer_group_interface__extract_grobs (me, (Grob*)0, "ties");
 
   for (int i = ties.size (); i--;)
     if (Directional_element_interface::get (ties[i]))
index bb011b973d0707439dbee616a8c98de153fce5fb..7ba15e3491ab41f832fa19d986bdc8e10600c548 100644 (file)
@@ -110,7 +110,7 @@ Tie::get_default_dir (Grob*me)
 SCM
 Tie::get_control_points (SCM smob)
 {  
-  Spanner*me = dynamic_cast<Spanner*> (unsmob_grob (smob));
+  Spanner*me = unsmob_spanner (smob);
   Direction headdir = CENTER; 
   if (head (me,LEFT))
     headdir = LEFT;
index 909039db3a01954a183a585074b1af2776f4bce2..88a54c93b9912801d3ac5895ccb5d21c087aba05 100644 (file)
@@ -25,7 +25,6 @@ protected:
   
   virtual void start_translation_timestep ();
   virtual void stop_translation_timestep ();
-  virtual void process_music ();
 
 public:
   TRANSLATOR_DECLARATIONS(Timing_engraver);
@@ -81,15 +80,6 @@ Timing_engraver::stop_translation_timestep ()
 }
 
 
-/*
-  ugh. Translator doesn't do process_music ().
- */
-void
-Timing_engraver::process_music ()
-{
-  Timing_translator::process_music ();
-}
-
 ENTER_DESCRIPTION(Timing_engraver,
 /* descr */       " Responsible for synchronizing timing information from staves. 
 Normally in @code{Score}.  In order to create polyrhythmic music,
index 79b741034c2c16876ca6354bbbe56766322a0d26..8158bb18311b85d5453ece019cfed9d6c06e0336 100644 (file)
 #include "global-translator.hh"
 #include "multi-measure-rest.hh"
 
-/*
-  TODO: change the rest of lily, so communication with
-  Timing_translator is only done through properties.  This means the
-  class declaration can go here.  */
-bool
-Timing_translator::try_music (Music*r)
-{
-  if (dynamic_cast<Barcheck_req*> (r))
-    {
-      check_ = r;
-      return true;
-    }
-  return false;
-}
 
-void
-Timing_translator::process_music ()
-{
-  if (check_ && measure_position ().main_part_)
-    {
-      check_->origin ()->warning (_f ("barcheck failed at: %s", 
-                                     measure_position ().str ()));
-      Moment zero; 
-      
-      if (!to_boolean (get_property ("barCheckNoSynchronize")))
-       daddy_trans_l_->set_property ("measurePosition", zero.smobbed_copy ());
-    }
-}
 
 void
 Timing_translator::stop_translation_timestep ()
 {
-  check_ = 0;
   
   Translator *t = this;
   Global_translator *global_l =0;
@@ -127,7 +99,6 @@ Timing_translator::measure_position () const
 void
 Timing_translator::start_translation_timestep ()
 {
-  check_ = 0;
   Translator *t = this;
   Global_translator *global_l =0;
   do
index cf26511ffe019bb4542f0d8d9ec22d4af3cbe1c2..efc2e336818c722df2b41b7dd596c5efd7f74d2a 100644 (file)
@@ -48,7 +48,7 @@ Tuplet_bracket::brew_molecule (SCM smob)
   Grob *me= unsmob_grob (smob);
   Molecule  mol;
   Link_array<Grob> column_arr=
-    Pointer_group_interface__extract_elements (me, (Grob*)0, "columns");
+    Pointer_group_interface__extract_grobs (me, (Grob*)0, "columns");
 
 
   if (!column_arr.size ())
@@ -139,7 +139,7 @@ void
 Tuplet_bracket::calc_position_and_height (Grob*me,Real *offset, Real * dy) 
 {
   Link_array<Grob> column_arr=
-    Pointer_group_interface__extract_elements (me, (Grob*)0, "columns");
+    Pointer_group_interface__extract_grobs (me, (Grob*)0, "columns");
 
 
   Grob * commony = me->common_refpoint (me->get_grob_property ("columns"), Y_AXIS);
@@ -220,7 +220,7 @@ void
 Tuplet_bracket::calc_dy (Grob*me,Real * dy)
 {
   Link_array<Grob> column_arr=
-    Pointer_group_interface__extract_elements (me, (Grob*)0, "columns");
+    Pointer_group_interface__extract_grobs (me, (Grob*)0, "columns");
 
   /*
     ugh. refps.
@@ -236,7 +236,7 @@ Tuplet_bracket::after_line_breaking (SCM smob)
 {
   Grob * me = unsmob_grob (smob);
   Link_array<Note_column> column_arr=
-    Pointer_group_interface__extract_elements (me, (Note_column*)0, "columns");
+    Pointer_group_interface__extract_grobs (me, (Note_column*)0, "columns");
 
   if (!column_arr.size ())
     {
@@ -292,7 +292,7 @@ Tuplet_bracket::get_default_dir (Grob*me)
 void
 Tuplet_bracket::add_column (Grob*me, Item*n)
 {
-  Pointer_group_interface::add_element (me, ly_symbol2scm ("columns"), n);
+  Pointer_group_interface::add_grob (me, ly_symbol2scm ("columns"), n);
   me->add_dependency (n);
 
   add_bound_item (dynamic_cast<Spanner*> (me), n);
index d558d1ee04b8bee61b2c1b959239780326b4a13c..bf6805ef56c6e92a78db6b389d7e23e1b8ea95a3 100644 (file)
@@ -42,7 +42,7 @@ Volta_spanner::brew_molecule (SCM smob)
 {
   Grob *me = unsmob_grob (smob);
   Link_array<Item> bar_arr
-    = Pointer_group_interface__extract_elements (me, (Item*)0, "bars");
+    = Pointer_group_interface__extract_grobs (me, (Item*)0, "bars");
 
   if (!bar_arr.size ())
     return SCM_EOL;
@@ -117,7 +117,7 @@ Volta_spanner::brew_molecule (SCM smob)
 void
 Volta_spanner::add_bar (Grob *me, Item* b)
 {
-  Pointer_group_interface::add_element (me, ly_symbol2scm ("bars"), b);
+  Pointer_group_interface::add_grob (me, ly_symbol2scm ("bars"), b);
   Side_position_interface::add_support (me,b);
   add_bound_item (dynamic_cast<Spanner*> (me), b); 
 }
index 1788539e4042f697007207f3fe5891ef0104fb4a..1bead33c1dd1ef61c82b4e46933ebf810d571173 100644 (file)
@@ -9,7 +9,6 @@
 #include "debug.hh"
 #include "my-lily-lexer.hh"
 #include "moment.hh"
-#include "timing-translator.hh"
 #include "source-file.hh"
 #include "source.hh"
 #include "main.hh"
index 0e1f1e718108c0afb33b105708d3c38f6042aef6..26cd85e811d9268ff4cfca11b6a663f0666dcd57 100644 (file)
@@ -21,7 +21,6 @@ StaffContext=\translator {
        SeparatingGroupSpanner \override #'spacing-procedure
          =  #Separating_group_spanner::set_spacing_rods_and_seqs
 
-
        \consists "Clef_engraver"
        \consists "Key_engraver"
        \consists "Time_signature_engraver"
@@ -32,7 +31,7 @@ StaffContext=\translator {
        \consists "Piano_pedal_engraver"
        \consists "Instrument_name_engraver"
        \consists "Grob_pq_engraver"
-       
+
        \consistsend "Axis_group_engraver"
        
        MinimumVerticalExtent = #'(-4 . 4)
index 7a3ad6a10d39f6c705f7e44e371ae911610411b8..e2d08dc1f39b7eb9ee690a84c338e2fb2b2f4886 100644 (file)
@@ -1,15 +1,15 @@
 Begin3
 Title: LilyPond
-Version: 1.5.27
-Entered-date: 24DEC01
+Version: 1.5.28
+Entered-date: 29DEC01
 Description: @BLURB@
 Keywords: music notation typesetting midi fonts engraving
 Author: hanwen@cs.uu.nl (Han-Wen Nienhuys)
        janneke@gnu.org (Jan Nieuwenhuizen)
 Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys)
 Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert
-       1000k lilypond-1.5.27.tar.gz 
+       1000k lilypond-1.5.28.tar.gz 
 Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
-       1000k lilypond-1.5.27.tar.gz 
+       1000k lilypond-1.5.28.tar.gz 
 Copying-policy: GPL
 End
index b8784354e32e68ca674ef3e6c90d9cad453ae9bb..551d79e30885f0901073ef6ae96493ce4bc4ece9 100644 (file)
@@ -1,5 +1,5 @@
 %define name lilypond
-%define version 1.5.27
+%define version 1.5.28
 %define release 1mdk
 
 Name: %{name}
index 7d16d85b7d353deca287b6fb3c0b9fe4d4fcca89..5566932b400f7f739ffe766570e3bd74100435a4 100644 (file)
@@ -1,11 +1,11 @@
 %define info yes
 
 Name: lilypond
-Version: 1.5.27
+Version: 1.5.28
 Release: 1
 License: GPL
 Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.27.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.28.tar.gz
 Summary: Create and print music notation 
 URL: http://www.lilypond.org/
 BuildRoot: /tmp/lilypond-install
index afe1711f6a4c5f865b7dbca20e57ff97c8b25e70..eb1ce8bd702f91b20cf2194950bff7d22a2c93f8 100644 (file)
 
 Distribution: SuSE Linux 7.0 (i386)
 Name: lilypond
-Version: 1.5.27
+Version: 1.5.28
 Release: 2
 Copyright:    GPL
 Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.27.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.28.tar.gz
 # music notation software for.. ?
 Summary: A program for printing sheet music.
 URL: http://www.lilypond.org/
index 3938da7413f5b62d9a08930efee1018ccb45bea1..bf5f35f9dca9cd6dd3048e0c26c21b2980b17e3b 100644 (file)
@@ -1,4 +1,3 @@
-
 ;;;; grob-description.scm -- part of generated backend documentation
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
        
        (PaperColumn . (
                (axes 0)
-               (before-grace-spacing-factor . 1.2)
-                (before-musical-spacing-factor . 0.4)
                (meta . ,(grob-description paper-column-interface axis-group-interface spaceable-element-interface))
        ))
        (PhrasingSlur . (
        
        (NonMusicalPaperColumn . (
                 (axes 0)
-                (before-musical-spacing-factor . 1.0)
-               (column-space-strength . 2.0)
                (meta . ,(grob-description paper-column-interface axis-group-interface spaceable-element-interface))
         ))
 
                 ))
              
        (SpacingSpanner . (
-               (spacing-procedure . ;; ,Third_spacing_spanner::set_springs
-                                       ,Spacing_spanner::set_springs
-                                  )
-               (stem-spacing-correction . 0.5)
+               (spacing-procedure .  ,Third_spacing_spanner::set_springs)
                (grace-space-factor . 0.8)
 
                ;; TODO: change naming -- unintuitive
                (arithmetic-basicspace . 2.0)
                (arithmetic-multiplier . ,(* 0.9 1.32))
+
                ;; assume that notes at least this long are present.
                (maximum-duration-for-spacing . ,(make-moment 1 8))
                (meta . ,(grob-description  spacing-spanner-interface))
        (NoteSpacing . (
                (X-extent-callback . #f)
                (Y-extent-callback . #f)
-
+               (stem-spacing-correction . 0.)
+               (space-factor . 1.0)
                (meta . ,(grob-description note-spacing-interface))
        ))
 
index 0d018c3d971ada032d313ef83de935aa5e0b1e89..9afa0705303f5d43c584cd5ca04821b97525fd09 100644 (file)
@@ -49,10 +49,7 @@ This procedure is called (using dependency resolution) after line breaking. Retu
 arrow on the arpeggio squiggly line.")
 (grob-property-description 'attachment pair? "cons of symbols, '(LEFT-TYPE . RIGHT-TYPE), where both types may be alongside-stem, stem, head or loose-end.")
 
-(grob-property-description 'stem-attachment-function procedure? "Where
-does the stem attach to the notehead? Function takes a symbol argument
-being the style. It returns a (X . Y) pair, specifying location in
-terms of note head bounding box.")
+
 (grob-property-description 'attachment-offset pair? "cons of offsets,
 '(LEFT-offset . RIGHT-offset).  This offset is added to the
 attachments to prevent ugly slurs.  [fixme: we need more documentation here].
@@ -285,7 +282,10 @@ reference point.
 (grob-property-description 'slope number? "some kind of slope")
 (grob-property-description 'slope-limit number? "set slope to zero if slope is running away steeper than this.")
 (grob-property-description 'solid boolean? "should porrectus be solidly filled?.")
+
 (grob-property-description 'space-alist list? "Alist of break align spacing tuples. See basic-property.scm")
+(grob-property-description 'space-factor number? "Scale horizontal spacing up by this amount.")
+
 (grob-property-description 'space-function procedure? "function of type multiplicity -> real (in staffspace).")
 (grob-property-description 'spacing-procedure procedure? "procedure
 taking grob as argument. This is called after
@@ -297,7 +297,14 @@ itself.  Return value is ignored.")
 (grob-property-description 'staff-symbol boolean? "the staff symbol grob that we're in.")
 (grob-property-description 'staffline-clearance number? "don't get closer than this to stafflines.")
 (grob-property-description 'stem ly-grob? "pointer to Stem object.")
-(grob-property-description 'stem-direction dir? "up or down?.")
+(grob-property-description 'stem-attachment-function procedure? "Where
+does the stem attach to the notehead? Function takes a symbol argument
+being the style. It returns a (X . Y) pair, specifying location in
+terms of note head bounding box.")
+(grob-property-description 'stem-direction dir? "up or down?.
+
+[docme: why not direction]
+")
 (grob-property-description 'stem-end-position number? "Where does the stem end (the end is opposite to the support-head.")
 (grob-property-description 'stem-length number? "length of stem.")
 (grob-property-description 'stem-shorten list? "shorten stems in forced directions given flag multiplicity.")
index 5c7d038bf4b35175f76ede04878cc09bd708d321..1348328f1f9b097132dd3d3b53de85b979e6b0f5 100644 (file)
@@ -163,6 +163,6 @@ release:
 rpm: $(depth)/$(package-icon) dist
        @echo "Assuming Red Hat system" #FIXME: check distro, then issue rpm
        $(MAKE) -C $(depth)/make
-       cd $(depth) && rmp -bb make/$(outdir)/lilypond.redhat.spec
+       cd $(depth) && rpm -bb make/$(outdir)/lilypond.redhat.spec
 #      su -c 'rpm -tb $(depth)/$(outdir)/$(distname).tar.gz'