]> git.donarmstrong.com Git - lilypond.git/commitdiff
release: 1.3.92 release/1.3.92
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Sun, 1 Oct 2000 11:13:56 +0000 (13:13 +0200)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Sun, 1 Oct 2000 11:13:56 +0000 (13:13 +0200)
==========

* RPM .spec fixes.

* italiano.ly

* mudela-book updates by Tom Cato Amundsen.

* Allow lyric hara kiri as well.

* Bugfix: left/right mixup  in Side_position_interface::aligned_on_self ()

* rest collision of differing rests.

* Cleanup of Sequential_music_iterator, Simple_music_iterator.

* Unfolded_repeat_iterator now signals repeats using \property
  repeatCommands. You could override this, eg.

\property Score.repeatCommands = #'((volta "X") start-repeat)

  will print a |: and a volta bracket saying X. See also
  input/test/manual-volta.ly

* Volta_engraver, Repeat_acknowledge_engraver: new engravers that are
controlled by repeatCommands; much cleaner than the Repeat_engraver.

* Junked Repeat_engraver.

1.3.91.j

52 files changed:
CHANGES
Documentation/GNUmakefile
Documentation/header.html.in
Documentation/regression-test.tely
Documentation/topdocs/INSTALL.texi
Documentation/user/refman.itely
INSTALL.txt
NEWS
TODO [deleted file]
VERSION
input/paddy.abc
input/test/manual-volta.ly [new file with mode: 0644]
input/test/rest-collision.ly
lily/align-interface.cc
lily/axis-group-engraver.cc
lily/bar-engraver.cc
lily/break-align-engraver.cc
lily/break-align-item.cc
lily/folded-repeat-iterator.cc
lily/include/align-interface.hh
lily/include/bar-engraver.hh [deleted file]
lily/include/break-align-item.hh
lily/include/rest-collision.hh
lily/include/scm-hash.hh
lily/include/sequential-music-iterator.hh
lily/include/side-position-interface.hh
lily/include/unfolded-repeat-iterator.hh
lily/lexer.ll
lily/multi-measure-rest-engraver.cc
lily/repeat-acknowledge-engraver.cc [new file with mode: 0644]
lily/repeat-engraver.cc [deleted file]
lily/request-chord-iterator.cc
lily/rest-collision.cc
lily/sequential-music-iterator.cc
lily/side-position-interface.cc
lily/simple-music-iterator.cc
lily/stem-tremolo.cc
lily/timing-engraver.cc
lily/unfolded-repeat-iterator.cc
lily/volta-engraver.cc [new file with mode: 0644]
ly/engraver.ly
ly/italiano.ly
ly/nederlands.ly
ly/params.ly
make/lilypond.spec.in
make/out/lilypond.lsm
make/out/lilypond.spec
make/toplevel.make.in
midi2ly/GNUmakefile
midi2ly/TODO [deleted file]
scripts/GNUmakefile
scripts/etf2ly.py

diff --git a/CHANGES b/CHANGES
index 9b04a9f385c6df507782e4e6115dab32b2dab41a..5282a4ded37286508088fa7dc8bfd6a309b6d333 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,10 +1,39 @@
+1.3.91.uu1
+==========
+
+* RPM .spec fixes.
+
+* italiano.ly
+
+* mudela-book updates by Tom Cato Amundsen.
+
+* Allow lyric hara kiri as well.
+
+* Bugfix: left/right mixup  in Side_position_interface::aligned_on_self ()
+
+* rest collision of differing rests.
+
+* Cleanup of Sequential_music_iterator, Simple_music_iterator.
+
+* Unfolded_repeat_iterator now signals repeats using \property
+  repeatCommands. You could override this, eg.
+
+       \property Score.repeatCommands = #'((volta "X") start-repeat)
+
+  will print a |: and a volta bracket saying X. See also
+  input/test/manual-volta.ly
+  
+* Volta_engraver, Repeat_acknowledge_engraver: new engravers that are
+controlled by repeatCommands; much cleaner than the Repeat_engraver.
+
+* Junked Repeat_engraver.
+
 1.3.91.jcn1
 ===========
 1.3.91.jcn1
 ===========
-
 * Abort all running spanners when part-combiner combines voices.
 
 * Abort all running spanners when part-combiner combines voices.
 
-1.3.90.jcn1
-===========
+1.3.91
+======
 
 * Use S_ISDIR () and check for stat.h.
 
 
 * Use S_ISDIR () and check for stat.h.
 
index 40b54c886bcbf10c2beb67f487e45f383348d14f..6a80c861652428c78bee4dd51dfb916567e9e33e 100644 (file)
@@ -5,7 +5,7 @@ SUBDIRS=user bibliography pictures topdocs ntweb misc
 STEPMAKE_TEMPLATES=documentation texinfo tex
 LOCALSTEPMAKE_TEMPLATES=lilypond mudela
 
 STEPMAKE_TEMPLATES=documentation texinfo tex
 LOCALSTEPMAKE_TEMPLATES=lilypond mudela
 
-README_TOP_FILES=NEWS DEDICATION CHANGES TODO
+README_TOP_FILES=NEWS DEDICATION CHANGES 
 EXTRA_DIST_FILES=
 
 include $(depth)/make/stepmake.make 
 EXTRA_DIST_FILES=
 
 include $(depth)/make/stepmake.make 
index 9ec9553da75ef2cbeb09fe272bdc064fa02a97a1..34540561254f03cd40d29f9971d2bd92dec35b55 100644 (file)
@@ -50,7 +50,7 @@ which substitutes some @AT_VARIABLES@ as well.
       <tr><td><font size=-1>
        <a href="@TOP@Documentation/out-www/NEWS.html">NEWS</a><br>
        <a href="@TOP@Documentation/out-www/CHANGES.html">Change Log</a><br>
       <tr><td><font size=-1>
        <a href="@TOP@Documentation/out-www/NEWS.html">NEWS</a><br>
        <a href="@TOP@Documentation/out-www/CHANGES.html">Change Log</a><br>
-       <a href="@TOP@Documentation/out-www/faq.html">FAQ</a><br>
+       <a href="http://appel.lilypond.org/wiki/index.php3?LilyPondFaqs">FAQ</a><br>
        <a href="@TOP@Documentation/user/out-www/lilypond.html">User manual</a><br>
        <a href="@TOP@Documentation/out-www/regression-test.html">Features</a><br>
        <a href="http://appel.lilypond.org/lilypond/todo.html">Todo</a><br>
        <a href="@TOP@Documentation/user/out-www/lilypond.html">User manual</a><br>
        <a href="@TOP@Documentation/out-www/regression-test.html">Features</a><br>
        <a href="http://appel.lilypond.org/lilypond/todo.html">Todo</a><br>
index f0db906fb6985497ad7365068ae4bb159ed47168..5d9ca9f1978bd9f8b31c54e26a52ce8d6a102095 100644 (file)
@@ -17,6 +17,12 @@ the text correspond with the shown notation, we consider LilyPond
 Officially BugFree (tm).  This document is intended for finding bugs,
 and documenting bugfixes.
 
 Officially BugFree (tm).  This document is intended for finding bugs,
 and documenting bugfixes.
 
+[TODO: revise and completize this. ]
+
+[TODO: should generate out of header fields using ly2dvi?]
+
+
+
 @section Notes and rests
 
 Rests.  Note that the dot of 8th, 16th and 32nd rests rest should be
 @section Notes and rests
 
 Rests.  Note that the dot of 8th, 16th and 32nd rests rest should be
@@ -246,7 +252,10 @@ bracket should be equal
 
 @mudelafile{repeat-line-break.ly}
 
 
 @mudelafile{repeat-line-break.ly}
 
+Auto change piano staff switches  voices  between up and down staffs
+automatically; rests are switched along with the coming note.
 
 
+@mudelafile{auto-change.ly}
 
 @section Lyrics
 
 
 @section Lyrics
 
@@ -327,6 +336,13 @@ textNonEmpty is used to respect the horizontal size of text.
 
 @mudelafile{non-empty-text.ly}
 
 
 @mudelafile{non-empty-text.ly}
 
+
+
+
+@section PianoStaff
+
+
+
 @section Global stuff
 
 Breaks can be encouraged and discouraged using @code{\break} and
 @section Global stuff
 
 Breaks can be encouraged and discouraged using @code{\break} and
@@ -334,7 +350,6 @@ Breaks can be encouraged and discouraged using @code{\break} and
 
 @mudelafile{break.ly}
 
 
 @mudelafile{break.ly}
 
-
 Markings that are attached to (invisible) barlines are 
 delicate: the are attached to the rest of the score without the score
 knowing it.  Consequently, they fall over  often.
 Markings that are attached to (invisible) barlines are 
 delicate: the are attached to the rest of the score without the score
 knowing it.  Consequently, they fall over  often.
index 689828a969b53e6ece56add2c39d14860cd2496b..c414acdcc574a97a3a210acc966e548ee9c4df01 100644 (file)
@@ -7,16 +7,6 @@
 
 @chapter INSTALL - compiling and installing GNU LilyPond
 
 
 @chapter INSTALL - compiling and installing GNU LilyPond
 
-
-@section Abstract
-
-This document explains what you need to install LilyPond, and what you
-should do.  If you are going to compile and install LilyPond often,
-e.g. when doing development, you might want to check out the
-@file{buildscripts/set-lily.sh} script.  It sets some environment
-variables and symlinks, which comes in handy when you have to compile
-LilyPond more often.
-
 @section Obtaining
 
 You can get the latest version of LilyPond at
 @section Obtaining
 
 You can get the latest version of LilyPond at
@@ -45,7 +35,7 @@ For compilation you need:
 @itemize @bullet
 @item A GNU system: GNU LilyPond is known to run on these GNU systems: Linux
     (PPC, intel), FreeBSD, AIX, NeXTStep, IRIX, Digital Unix and
 @itemize @bullet
 @item A GNU system: GNU LilyPond is known to run on these GNU systems: Linux
     (PPC, intel), FreeBSD, AIX, NeXTStep, IRIX, Digital Unix and
-Solaris.
+    Solaris.
 
 @item Lots of disk space: LilyPond takes between 30 and 100 mb to
 compile if you use debugging information.  If you are short on
 
 @item Lots of disk space: LilyPond takes between 30 and 100 mb to
 compile if you use debugging information.  If you are short on
@@ -69,7 +59,7 @@ Version 1.4 is recommended for better performance.
 Check out
 @uref{ftp://ftp.gnu.org/gnu/make/,ftp://ftp.gnu.org/gnu/make/}.
 
 Check out
 @uref{ftp://ftp.gnu.org/gnu/make/,ftp://ftp.gnu.org/gnu/make/}.
 
-@item Flex (version 2.5.4 or newer). 
+@item Flex (version 2.5.4a or newer). 
 Check out @uref{ftp://ftp.gnu.org/gnu/flex/,ftp://ftp.gnu.org/gnu/flex/}.
 
 @item Bison (version 1.25 or newer).
 Check out @uref{ftp://ftp.gnu.org/gnu/flex/,ftp://ftp.gnu.org/gnu/flex/}.
 
 @item Bison (version 1.25 or newer).
@@ -93,12 +83,12 @@ note that tetex-0.4pl8 (included with Redhat 5.x) does not include
 @file{mfplain.mp}, which is needed for producing the scalable font
 files.
 
 @file{mfplain.mp}, which is needed for producing the scalable font
 files.
 
-If you do not want to use PostScript output, edit @file{mf/GNUmakefile}.
+If you do not want to use PostScript output, edit @file{mf/GNUmakefile},
+removing the line saying @code{PFA_FILES=}
 
 @item kpathsea, a library for searching (TeX) files.  @code{kpathsea} is
 usually included with your installation of TeX. 
 
 
 @item kpathsea, a library for searching (TeX) files.  @code{kpathsea} is
 usually included with your installation of TeX. 
 
-
 @end itemize
 
 @section Running
 @end itemize
 
 @section Running
@@ -114,24 +104,19 @@ following software
 @item  GUILE 1.3.4, check out @uref{http://www.gnu.org/programs/guile.html,http://www.gnu.org/software/guile/}
 @end itemize
 
 @item  GUILE 1.3.4, check out @uref{http://www.gnu.org/programs/guile.html,http://www.gnu.org/software/guile/}
 @end itemize
 
-For running LilyPond successfully you have to help TeX and MetaFont
-find various files.  The recommended way of doing so is adjusting the
-environment variables in the start-up scripts of your shell.  An
-example is given here for the Bourne shell:
-@example 
-export MFINPUTS="/usr/local/share/lilypond/mf:"
-export TEXINPUTS="/usr/local/share/lilypond/tex:/usr/local/share/lilypond/ps:"
-@end example 
+For running LilyPond successfully you have to help TeX and MetaFont find
+various files.  The recommended way of doing so is adjusting the
+environment variables in the start-up scripts of your shell. Appropriate
+Csh and sh scripts are left in @file{buildscripts/out/lilypond-profile}
+and @file{buildscripts/out/lilypond-login} after compilation.
 
 
-The empty path component
-represents TeX and MetaFont's default search paths.  Scripts with
-the proper paths for the bourne and C-shell respectively are generated in
-@file{buildscripts/out/lilypond-profile} and
-@file{buildscripts/out/lilypond-login} during compilation. 
+The empty path component represents TeX and MetaFont's default search
+paths.  Scripts with the proper paths for the bourne and C-shell
+respectively are generated in @file{buildscripts/out/lilypond-profile}
+and @file{buildscripts/out/lilypond-login} during compilation.
 
 
-LilyPond is a hiddeously big, slow and bloated program.  A fast CPU
-and plenty of RAM is recommended for comfortable use.
+LilyPond is a big and slow program.  A fast CPU and plenty of RAM is
+recommended for comfortable use.
 
 @section Website
 
 
 @section Website
 
@@ -159,21 +144,7 @@ at
 
 The version of @file{pnmtopng} that is distributed with RedHat 5.1 and
 5.2 contains a bug: pnmtopng is dynamically linked to the wrong
 
 The version of @file{pnmtopng} that is distributed with RedHat 5.1 and
 5.2 contains a bug: pnmtopng is dynamically linked to the wrong
-version of libpng, which results in cropped images.  Recompile it from 
-source, and make sure that the pnmtopng binary is linked statically to 
-the libpng that is included in libgr.  RedHat 6.0 does not have this 
-problem.
-
-@example 
- tar xzf libgr-2.0.13.tar.gz
-      make
-      cd png
-      rm libpng.so*
-      make pnmtopng
-@end example 
-
-You can then install the new pnmtopng into @file{/usr/local/bin/}
+version of libpng.
 
 @item @uref{http://pertsserver.cs.uiuc.edu/~hull/bib2html,Bib2html}.
     Which, in turn depends on man2html for proper installation.
 
 @item @uref{http://pertsserver.cs.uiuc.edu/~hull/bib2html,Bib2html}.
     Which, in turn depends on man2html for proper installation.
@@ -188,13 +159,11 @@ hypertextified bibliography.
 
 to install GNU LilyPond, simply type:
 @example 
 
 to install GNU LilyPond, simply type:
 @example 
-
        gunzip -c lilypond-x.y.z | tar xf -
        cd lilypond-x.y.z
        ./configure             # fill in your standard prefix with --prefix
        make
        make install
        gunzip -c lilypond-x.y.z | tar xf -
        cd lilypond-x.y.z
        ./configure             # fill in your standard prefix with --prefix
        make
        make install
 @end example 
 
 This will install a number of files, something close to:
 @end example 
 
 This will install a number of files, something close to:
index 725091c139c4a7d69ede50977baa38bbef78530a..3cbf3e94eb2d842e12aa7edb9b765cd3ce184503 100644 (file)
@@ -724,11 +724,16 @@ appearance of note heads or rests.
 
 
 Rests are entered like notes, with note name `@code{r}@indexcode{r}',
 
 
 Rests are entered like notes, with note name `@code{r}@indexcode{r}',
-or `@code{R}@indexcode{R}'.  There is also a note name `@code{s}@indexcode{s}',
-which produces a space of the specified duration. 
-`@code{R}' is specifically meant for entering parts: the @code{R} rest
-can expand to fill a score with rests, or it can be printed as a
-single multimeasure rest.
+or `@code{R}@indexcode{R}'.  There is also a note name
+`@code{s}@indexcode{s}', which produces a space of the specified
+duration.  `@code{R}' is specifically meant for entering parts: the
+@code{R} rest can expand to fill a score with rests, or it can be
+printed as a single multimeasure rest.
+
+You can control the expansion by setting the property
+@code{Score.skipBars}. If this is set to true, Lily will not expand
+empty measures, and the multimeasure rests automatically adds the
+appropriate number.
 
 
 @cindex lyrics expressions
 
 
 @cindex lyrics expressions
index db0ba70a3c7110b40a85d36885bece99d660b6f2..cf0e511331e8e1ce4525bea0c0ce2e0e41a7b681 100644 (file)
@@ -3,16 +3,6 @@
 INSTALL - compiling and installing GNU LilyPond
 ***********************************************
 
 INSTALL - compiling and installing GNU LilyPond
 ***********************************************
 
-Abstract
-========
-
-   This document explains what you need to install LilyPond, and what
-you should do.  If you are going to compile and install LilyPond often,
-e.g. when doing development, you might want to check out the
-`buildscripts/set-lily.sh' script.  It sets some environment variables
-and symlinks, which comes in handy when you have to compile LilyPond
-more often.
-
 Obtaining
 =========
 
 Obtaining
 =========
 
@@ -39,7 +29,7 @@ Prerequisites
 
    * A GNU system: GNU LilyPond is known to run on these GNU systems:
      Linux     (PPC, intel), FreeBSD, AIX, NeXTStep, IRIX, Digital Unix
 
    * A GNU system: GNU LilyPond is known to run on these GNU systems:
      Linux     (PPC, intel), FreeBSD, AIX, NeXTStep, IRIX, Digital Unix
-     and Solaris.
+     and     Solaris.
 
    * Lots of disk space: LilyPond takes between 30 and 100 mb to
      compile if you use debugging information.  If you are short on
 
    * Lots of disk space: LilyPond takes between 30 and 100 mb to
      compile if you use debugging information.  If you are short on
@@ -61,7 +51,7 @@ Prerequisites
    * GNU Make.  Check out ftp://ftp.gnu.org/gnu/make/
      (ftp://ftp.gnu.org/gnu/make/).
 
    * GNU Make.  Check out ftp://ftp.gnu.org/gnu/make/
      (ftp://ftp.gnu.org/gnu/make/).
 
-   * Flex (version 2.5.4 or newer).  Check out
+   * Flex (version 2.5.4a or newer).  Check out
      ftp://ftp.gnu.org/gnu/flex/ (ftp://ftp.gnu.org/gnu/flex/).
 
    * Bison (version 1.25 or newer).  Check out
      ftp://ftp.gnu.org/gnu/flex/ (ftp://ftp.gnu.org/gnu/flex/).
 
    * Bison (version 1.25 or newer).  Check out
@@ -86,7 +76,8 @@ Prerequisites
      `mfplain.mp', which is needed for producing the scalable font
      files.
 
      `mfplain.mp', which is needed for producing the scalable font
      files.
 
-     If you do not want to use PostScript output, edit `mf/GNUmakefile'.
+     If you do not want to use PostScript output, edit `mf/GNUmakefile',
+     removing the line saying `PFA_FILES='
 
    * kpathsea, a library for searching (TeX) files.  `kpathsea' is
      usually included with your installation of TeX.
 
    * kpathsea, a library for searching (TeX) files.  `kpathsea' is
      usually included with your installation of TeX.
@@ -109,18 +100,17 @@ following software
 
    For running LilyPond successfully you have to help TeX and MetaFont
 find various files.  The recommended way of doing so is adjusting the
 
    For running LilyPond successfully you have to help TeX and MetaFont
 find various files.  The recommended way of doing so is adjusting the
-environment variables in the start-up scripts of your shell.  An
-example is given here for the Bourne shell:
-     export MFINPUTS="/usr/local/share/lilypond/mf:"
-     export TEXINPUTS="/usr/local/share/lilypond/tex:/usr/local/share/lilypond/ps:"
+environment variables in the start-up scripts of your shell. Appropriate
+Csh and sh scripts are left in `buildscripts/out/lilypond-profile' and
+`buildscripts/out/lilypond-login' after compilation.
 
 
-   The empty path component represents TeX and MetaFont's default
-search paths.  Scripts with the proper paths for the bourne and C-shell
+   The empty path component represents TeX and MetaFont's default search
+paths.  Scripts with the proper paths for the bourne and C-shell
 respectively are generated in `buildscripts/out/lilypond-profile' and
 `buildscripts/out/lilypond-login' during compilation.
 
 respectively are generated in `buildscripts/out/lilypond-profile' and
 `buildscripts/out/lilypond-login' during compilation.
 
-   LilyPond is a hiddeously big, slow and bloated program.  A fast CPU
-and plenty of RAM is recommended for comfortable use.
+   LilyPond is a big and slow program.  A fast CPU and plenty of RAM is
+recommended for comfortable use.
 
 Website
 =======
 
 Website
 =======
@@ -148,18 +138,7 @@ additional conversion tools.
 
      The version of `pnmtopng' that is distributed with RedHat 5.1 and
      5.2 contains a bug: pnmtopng is dynamically linked to the wrong
 
      The version of `pnmtopng' that is distributed with RedHat 5.1 and
      5.2 contains a bug: pnmtopng is dynamically linked to the wrong
-     version of libpng, which results in cropped images.  Recompile it
-     from source, and make sure that the pnmtopng binary is linked
-     statically to the libpng that is included in libgr.  RedHat 6.0
-     does not have this problem.
-
-           tar xzf libgr-2.0.13.tar.gz
-                make
-                cd png
-                rm libpng.so*
-                make pnmtopng
-
-     You can then install the new pnmtopng into `/usr/local/bin/'
+     version of libpng.
 
    * Bib2html (http://pertsserver.cs.uiuc.edu/~hull/bib2html).
      Which, in turn depends on man2html for proper installation.
 
    * Bib2html (http://pertsserver.cs.uiuc.edu/~hull/bib2html).
      Which, in turn depends on man2html for proper installation.
@@ -175,7 +154,6 @@ Configuring and compiling
 =========================
 
    to install GNU LilyPond, simply type:
 =========================
 
    to install GNU LilyPond, simply type:
-
        gunzip -c lilypond-x.y.z | tar xf -
        cd lilypond-x.y.z
        ./configure             # fill in your standard prefix with --prefix
        gunzip -c lilypond-x.y.z | tar xf -
        cd lilypond-x.y.z
        ./configure             # fill in your standard prefix with --prefix
diff --git a/NEWS b/NEWS
index 86e3b9bb61479c607b987dfa99e17ea2ce22ec0b..a35ea9667956b9b59766d586733b83bae1c05298 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -21,21 +21,21 @@ internals: LilyPond is smaller, cleaner, more flexible, etc.
 
 * Typography: More elegant slurs, aligned dynamics, text crescendos,
 
 
 * Typography: More elegant slurs, aligned dynamics, text crescendos,
 
-* Better lyrics placement: Automagical phrasing, melisma alignment,
-  stanza numbering.
+* Better lyrics placement: Automatical phrasing, melisma alignment,
+  and stanza numbering.
 
 * Part combining for orchestral scores and hymns: two voices are
 
 * Part combining for orchestral scores and hymns: two voices are
-  combined automatic into a staff automatically, including Solo/`a2
+  combined into a staff automatically, including Solo/`a2
   indications as appropriate.
 
 * Chordnames are now configurable in every respect
 
   indications as appropriate.
 
 * Chordnames are now configurable in every respect
 
-* Included extensive glossary
+* Includes an extensive glossary of musical terms.
 
 * Many bugfixes.
 
 * Finished ouverture Coriolan as full orchestral score example.
 
 
 * Many bugfixes.
 
 * Finished ouverture Coriolan as full orchestral score example.
 
-* AsciiScript
+* AsciiScript: ASCII-art output 
 
 
-* Translations into Japanese and Russian
+* Translations into Japanese, French and Russian
diff --git a/TODO b/TODO
deleted file mode 100644 (file)
index ee47eb5..0000000
--- a/TODO
+++ /dev/null
@@ -1,2 +0,0 @@
-
-[see http://www.cs.uu.nl/people/hanwen/lily-devel/index.html]
diff --git a/VERSION b/VERSION
index e8eabc10d0394bf5d7ae58c0bcb2994734e7bd96..82c759db9c9062f730cf71c671d56308c1eb040c 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1,8 +1,8 @@
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=1
 MINOR_VERSION=3
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=1
 MINOR_VERSION=3
-PATCH_LEVEL=91
-MY_PATCH_LEVEL=jcn1
+PATCH_LEVEL=92
+MY_PATCH_LEVEL=
 
 # use the above to send patches: MY_PATCH_LEVEL is always empty for a
 # released version.
 
 # use the above to send patches: MY_PATCH_LEVEL is always empty for a
 # released version.
index 6b574944f591e8297bff3b8329b4f2d392294611..0aadebc63c1e9f3144087a46af9fbd5448ef8905 100644 (file)
@@ -1,3 +1,9 @@
+%
+%  This is NOT a lilypond input file. It is an ABC file, see
+%  http://www.gre.ac.uk/~c.walshaw/abc/
+%  
+%  LilyPond includes import tools for Finale, Musedata, ABC, MIDI and PMX
+%
 X:1
 T:Paddy O'Rafferty
 C:Trad.
 X:1
 T:Paddy O'Rafferty
 C:Trad.
diff --git a/input/test/manual-volta.ly b/input/test/manual-volta.ly
new file mode 100644 (file)
index 0000000..e458b78
--- /dev/null
@@ -0,0 +1,9 @@
+
+\score { \notes {
+ c4
+    \property Score.repeatCommands = #'((volta "93") end-repeat)
+ c4 c4
+    \property Score.repeatCommands = #'((volta #f))
+ c4 c4
+}
+}
index c6944f7ea6ebf3d113a57513121d5268398ff9ca..c424161dbacd7cbc16ab9cff1004419e99bf0b3e 100644 (file)
@@ -6,6 +6,17 @@ scale = \notes \relative c' {
 rests = \notes             {
   r r r  r r r r r r r r r r r r r
 } 
 rests = \notes             {
   r r r  r r r r r r r r r r r r r
 } 
+different =< \context Voice = one {
+      \stemup
+      \notes \relative c'' {
+        r8 a e4 a e
+      }
+    }
+    \context Voice = two {
+      \stemdown
+      \notes \relative c'' {
+        r1
+      }} >
 
 scales = \context Staff \notes <
        \context Voice=i { \stemup r1 r2 r2   \scale    c''1 c'2 a'2 \rests  }
 
 scales = \context Staff \notes <
        \context Voice=i { \stemup r1 r2 r2   \scale    c''1 c'2 a'2 \rests  }
@@ -27,7 +38,7 @@ restsII = \context Staff \notes {
        [c8 r8 c8 c8]
        [c''8 r8 c''8 c''8]
        [c'8 r8 r8 c'''8]
        [c8 r8 c8 c8]
        [c''8 r8 c''8 c''8]
        [c'8 r8 r8 c'''8]
-       
+       \different      
        }
 }
 
        }
 }
 
index 621c691203bad975ea5f660e673f2fb8d13a620c..8e07f9870ec24725847d7074de1c14d7afb927e6 100644 (file)
@@ -30,19 +30,6 @@ Align_interface::alignment_callback (Score_element *sc, Axis ax)
 }
 
 
 }
 
 
-Real
-Align_interface::center_on_element (Score_element *me, Axis a)
-{
-  Score_element *cent = unsmob_element (me->get_elt_property ("group-center-element"));
-
-  if (cent)
-    {
-      Real r = cent->relative_coordinate (me,  a);
-      return -r;
-    }
-  return 0;
-}
-
 /*
   Hairy function to put elements where they should be. Can be tweaked
   from the outside by setting minimum-space and extra-space in its
 /*
   Hairy function to put elements where they should be. Can be tweaked
   from the outside by setting minimum-space and extra-space in its
index ef031b322953df93a43bfbf426f72c3efe04d5db..73fa3b8adea9b897dad5887d798b1de398c0fd6a 100644 (file)
@@ -157,7 +157,8 @@ void
 Hara_kiri_engraver::acknowledge_element (Score_element_info i)
 {
   Axis_group_engraver::acknowledge_element (i);
 Hara_kiri_engraver::acknowledge_element (Score_element_info i)
 {
   Axis_group_engraver::acknowledge_element (i);
-  if (Rhythmic_head::has_interface (i.elem_l_))
+  if (Rhythmic_head::has_interface (i.elem_l_)
+      || i.elem_l_->has_interface (ly_symbol2scm ("lyric-syllable-interface")))
     {
       Hara_kiri_group_spanner::add_interesting_item (staffline_p_, i.elem_l_);
     }
     {
       Hara_kiri_group_spanner::add_interesting_item (staffline_p_, i.elem_l_);
     }
index c9d1466f6f25490fd472d9d3e3fb6ec1041f4bc6..5a45005be8cfc6e19a28e9ec0672b0dab3c5e942 100644 (file)
@@ -9,7 +9,6 @@
 
 #include "bar.hh"
 #include "score-engraver.hh"
 
 #include "bar.hh"
 #include "score-engraver.hh"
-#include "bar-engraver.hh"
 #include "musical-request.hh"
 #include "multi-measure-rest.hh"
 #include "command-request.hh"
 #include "musical-request.hh"
 #include "multi-measure-rest.hh"
 #include "command-request.hh"
 #include "engraver-group-engraver.hh"
 #include "warn.hh"
 #include "item.hh"
 #include "engraver-group-engraver.hh"
 #include "warn.hh"
 #include "item.hh"
+#include "engraver.hh"
+
+/**
+  generate bars. Either user ("|:"), or default (new measure)
+  */
+class Bar_engraver : public Engraver
+{
+public:
+  Bar_engraver();
+  VIRTUAL_COPY_CONS(Translator);
+  void request_bar (String type_str);
+    
+protected:
+  virtual void do_creation_processing ();
+  virtual void do_removal_processing ();
+  virtual void do_process_music();
+  virtual void do_pre_move_processing();
+
+private:
+  void typeset_bar ();
+  void create_bar ();
+
+  Item * bar_p_;
+};
 
 Bar_engraver::Bar_engraver()
 {
 
 Bar_engraver::Bar_engraver()
 {
@@ -30,6 +53,11 @@ Bar_engraver::create_bar ()
   if (!bar_p_)
     {
       bar_p_ = new Item (get_property ("basicBarProperties"));
   if (!bar_p_)
     {
       bar_p_ = new Item (get_property ("basicBarProperties"));
+
+      SCM gl = get_property ("whichBar");
+      if (scm_equal_p (gl, bar_p_->get_elt_property ("glyph")) != SCM_BOOL_T)
+         bar_p_->set_elt_property ("glyph", gl);
+      
       announce_element (bar_p_, 0);
     }
 }
       announce_element (bar_p_, 0);
     }
 }
@@ -64,9 +92,6 @@ Bar_engraver::typeset_bar ()
 {
   if (bar_p_) 
     {
 {
   if (bar_p_) 
     {
-      SCM gl = get_property ("whichBar");
-      if (scm_equal_p (gl, bar_p_->get_elt_property ("glyph")) != SCM_BOOL_T)
-         bar_p_->set_elt_property ("glyph", gl);
       typeset_element (bar_p_);
       bar_p_ =0;
     }
       typeset_element (bar_p_);
       bar_p_ =0;
     }
@@ -97,6 +122,3 @@ Bar_engraver::do_pre_move_processing()
 }
 
 ADD_THIS_TRANSLATOR(Bar_engraver);
 }
 
 ADD_THIS_TRANSLATOR(Bar_engraver);
-
-
-
index aa3bc9760cfb4cbcb10de497d3692e678efa7f2c..df01cfb4d0604ee8fdfbc36e4a422baecd7f8dd8 100644 (file)
@@ -37,7 +37,7 @@ void
 Break_align_engraver::add_column (SCM smob)
 {
   Score_element * e = unsmob_element (smob);
 Break_align_engraver::add_column (SCM smob)
 {
   Score_element * e = unsmob_element (smob);
-  Break_align_item::add_element (align_l_,e);
+  Break_align_interface::add_element (align_l_,e);
   typeset_element (e);
 }
 
   typeset_element (e);
 }
 
@@ -104,12 +104,19 @@ Break_align_engraver::acknowledge_element (Score_element_info inf)
       if (!align_l_)
        {
          align_l_ = new Item (get_property ("basicBreakAlignProperties"));
       if (!align_l_)
        {
          align_l_ = new Item (get_property ("basicBreakAlignProperties"));
-         Break_align_item::set_interface (align_l_);
+         Break_align_interface::set_interface (align_l_);
          announce_element (align_l_,0);
 
          SCM edge_sym = ly_symbol2scm ("Left_edge_item");
          Item * edge = new Item (get_property ("leftEdgeBasicProperties"));
 
          announce_element (align_l_,0);
 
          SCM edge_sym = ly_symbol2scm ("Left_edge_item");
          Item * edge = new Item (get_property ("leftEdgeBasicProperties"));
 
+         /*
+           We must have left-edge in the middle.  Instrument-names
+           are left to left-edge, so they don't enter the staff.
+         */
+         align_l_->set_elt_property ("self-alignment-X", edge->self_scm ());
+         
+
          /*
            If the element is empty, it will be ignored in the break
            alignment stuff.
          /*
            If the element is empty, it will be ignored in the break
            alignment stuff.
@@ -144,6 +151,7 @@ Break_align_engraver::acknowledge_element (Score_element_info inf)
          group->set_parent (align_l_, Y_AXIS);
          announce_element (group, 0);
          column_alist_ = scm_assoc_set_x (column_alist_, align_name, group->self_scm ());
          group->set_parent (align_l_, Y_AXIS);
          announce_element (group, 0);
          column_alist_ = scm_assoc_set_x (column_alist_, align_name, group->self_scm ());
+
        }
       Axis_group_interface::add_element (group, item_l);
     }
        }
       Axis_group_interface::add_element (group, item_l);
     }
index 91ea3fea3eb6eeba8048081075f92e5f1df5acf7..d8c5f6d2b230a10982e0b7319f37f6df00b8d1ce 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
-  break-align-item.cc -- implement Break_align_item
+  break-align-item.cc -- implement Break_align_interface
 
   source file of the GNU LilyPond music typesetter
 
 
   source file of the GNU LilyPond music typesetter
 
 #include "group-interface.hh"
 #include "align-interface.hh"
 
 #include "group-interface.hh"
 #include "align-interface.hh"
 
-MAKE_SCHEME_CALLBACK(Break_align_item,before_line_breaking);
+MAKE_SCHEME_CALLBACK(Break_align_interface,before_line_breaking);
 
 SCM
 
 SCM
-Break_align_item::before_line_breaking (SCM smob)
+Break_align_interface::before_line_breaking (SCM smob)
 {
   Score_element* me = unsmob_element (smob);
   do_alignment (me);
 {
   Score_element* me = unsmob_element (smob);
   do_alignment (me);
@@ -32,39 +32,46 @@ Break_align_item::before_line_breaking (SCM smob)
 }
 
 Real
 }
 
 Real
-Break_align_item::alignment_callback (Score_element*c, Axis a)
+Break_align_interface::alignment_callback (Score_element*c, Axis a)
 {
   assert (a == X_AXIS);
   Score_element *par = c->parent_l (a);
   if (par && !to_boolean (par->get_elt_property ("break-alignment-done")))\
     {
       par->set_elt_property ("break-alignment-done", SCM_BOOL_T);
 {
   assert (a == X_AXIS);
   Score_element *par = c->parent_l (a);
   if (par && !to_boolean (par->get_elt_property ("break-alignment-done")))\
     {
       par->set_elt_property ("break-alignment-done", SCM_BOOL_T);
-      Break_align_item::do_alignment (par);
+      Break_align_interface::do_alignment (par);
     }
     
   return 0.0;
 }
 
     }
     
   return 0.0;
 }
 
+Real
+Break_align_interface::self_align_callback (Score_element *me, Axis a)
+{
+  assert (a == X_AXIS);
+  
+  Item* item = dynamic_cast<Item*> (me);
+  Direction bsd = item->break_status_dir();
+  if (bsd == LEFT)
+    {
+      me->set_elt_property ("self-alignment-X", gh_int2scm (RIGHT));
+    }
+
+  return Side_position::aligned_on_self (me, a);  
+}
+
 void
 void
-Break_align_item::add_element (Score_element*me, Score_element *toadd)
+Break_align_interface::add_element (Score_element*me, Score_element *toadd)
 {
   toadd->add_offset_callback (alignment_callback, X_AXIS);
   Axis_group_interface::add_element (me, toadd);
 }
 
 void
 {
   toadd->add_offset_callback (alignment_callback, X_AXIS);
   Axis_group_interface::add_element (me, toadd);
 }
 
 void
-Break_align_item::do_alignment (Score_element *me)
+Break_align_interface::do_alignment (Score_element *me)
 {
   Item * item = dynamic_cast<Item*> (me);
   Item *column = item->column_l ();
 {
   Item * item = dynamic_cast<Item*> (me);
   Item *column = item->column_l ();
-  if (item->break_status_dir() == LEFT)
-    {
-      me->set_elt_property ("self-alignment-X", gh_int2scm (RIGHT));
-    }
-  else
-    {
-      me->add_offset_callback (Align_interface::center_on_element, X_AXIS);
-    }
 
   Real interline= me->paper_l ()->get_var ("staffspace");      
   Link_array<Score_element> elems;
 
   Real interline= me->paper_l ()->get_var ("staffspace");      
   Link_array<Score_element> elems;
@@ -206,10 +213,10 @@ Break_align_item::do_alignment (Score_element *me)
 
 
 void
 
 
 void
-Break_align_item::set_interface (Score_element*me)
+Break_align_interface::set_interface (Score_element*me)
 {
   Align_interface::set_interface (me); 
   Align_interface::set_axis (me,X_AXIS);
 
 {
   Align_interface::set_interface (me); 
   Align_interface::set_axis (me,X_AXIS);
 
-  me->add_offset_callback (Side_position::aligned_on_self, X_AXIS);
+  me->add_offset_callback (Break_align_interface::self_align_callback, X_AXIS);
 }
 }
index b8b4e1603373f49aeffdb1517eaf7b71c15d5f9f..ddc6e68839099eaf68e7e3d53e91c1032d4468b6 100644 (file)
@@ -7,6 +7,12 @@
   
  */
 
   
  */
 
+
+/*
+   Folded repeats are a stupid idea at this point, so we refrain from
+   implementing get_music () and skip ().
+*/
+
 #include "folded-repeat-iterator.hh"
 #include "repeated-music.hh"
 #include "music-list.hh"
 #include "folded-repeat-iterator.hh"
 #include "repeated-music.hh"
 #include "music-list.hh"
index f570a60509603c28bf7a2e2f42ff61ba34089fdb..3eb8b9e972066614ad08d986b8c94c6d8a508875 100644 (file)
 
   alignment-done -- boolean to administrate whether we've done the alignment already (to ensure that the process is done only once)
 
 
   alignment-done -- boolean to administrate whether we've done the alignment already (to ensure that the process is done only once)
 
-  group-center-element -- element which will be at the center of the group
-    after aligning (when using Align_interface::center_on_element)
+  center-element -- element which will be at the center of the group
+    after aligning (when using
+    Align_interface::center_on_element). The center element should
+    have this object as a reference point.
 
   elements -- to be aligned elements 
 
 
   elements -- to be aligned elements 
 
diff --git a/lily/include/bar-engraver.hh b/lily/include/bar-engraver.hh
deleted file mode 100644 (file)
index 5d91c15..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
-  bar-engraver.hh -- declare Bar_engraver
-
-  source file of the GNU LilyPond music typesetter
-
-  (c)  1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-
-#ifndef BAR_ENGRAVER_HH
-#define BAR_ENGRAVER_HH
-
-#include "engraver.hh"
-
-/**
-  generate bars. Either user ("|:"), or default (new measure)
-  */
-class Bar_engraver : public Engraver
-{
-public:
-  Bar_engraver();
-  VIRTUAL_COPY_CONS(Translator);
-  
-  void request_bar (String type_str);
-    
-protected:
-  virtual void do_creation_processing ();
-  virtual void do_removal_processing ();
-  virtual void do_process_music();
-  virtual void do_pre_move_processing();
-
-
-private:
-  void typeset_bar ();
-  void create_bar ();
-
-  Item * bar_p_;
-};
-
-#endif // BAR_ENGRAVER_HH
index 028b4f282eddbf8e18030df6a5d85c192343ff1e..8449f07498e8828b317b3bb7c2e45b5a835182e2 100644 (file)
    break-align-symbol -- the index in the spacing table (symbol) of
    the to be aligned item.
 
    break-align-symbol -- the index in the spacing table (symbol) of
    the to be aligned item.
 
-
-   TODO: remove this as a class, and make interface.
- */
-
-class Break_align_item
+*/
+class Break_align_interface
 {
 public:
   static SCM before_line_breaking (SCM);
 {
 public:
   static SCM before_line_breaking (SCM);
@@ -33,5 +30,6 @@ public:
   static bool has_interface (Score_element*);
   static void add_element (Score_element*me, Score_element*add);
   static Real alignment_callback (Score_element*, Axis);
   static bool has_interface (Score_element*);
   static void add_element (Score_element*me, Score_element*add);
   static Real alignment_callback (Score_element*, Axis);
+  static Real self_align_callback (Score_element*, Axis);
 };
 #endif // BREAK_ALIGN_ITEM_HH
 };
 #endif // BREAK_ALIGN_ITEM_HH
index f7a547a94b5e889f6c6c22c149f3a12f267943a2..c2ae9cd1fd1e4c772ea60cb438cc108fba22a15c 100644 (file)
 
 #include "lily-proto.hh"
 #include "lily-guile.hh"
 
 #include "lily-proto.hh"
 #include "lily-guile.hh"
+
+
+
 /*
 /*
+  Move rests in note-columns so that they do not collide.
+  
   properties:
 
   properties:
 
+  read-only
+
+  maximum-rest-count -- kill off rests so we don't more than this
+    number left.
+
+  minimum-distance -- minimum distance between notes and rests.
+
+  read/write
+  
   elements -- list of elts (both rests and notes) participating in the
     collision.
 
   elements -- list of elts (both rests and notes) participating in the
     collision.
 
+
+  sets in elements:
+
+    rest-collision -- pointer to self.
+
+    
+  
+    
 */
 
 class Rest_collision           // interface
 */
 
 class Rest_collision           // interface
index ae733e9df80a53acfe909c23b70d157fcb632fa0..a19ed279e777a8b415063979328fbd1cd6fe2eaf 100644 (file)
@@ -28,7 +28,7 @@ struct SCM_less
 typedef map<SCM,SCM, SCM_less> Scm_stl_map;
 
 /**
 typedef map<SCM,SCM, SCM_less> Scm_stl_map;
 
 /**
-   auto resizing hash table. This should come from GUILE.
+   auto resizing hash table. 
 
    1. ALWAYS USE THIS AS VIA A POINTER, i.e.
 
 
    1. ALWAYS USE THIS AS VIA A POINTER, i.e.
 
@@ -46,6 +46,15 @@ typedef map<SCM,SCM, SCM_less> Scm_stl_map;
    2. UPON DESTRUCTION, DO
 
    scm_unprotect_object (tab->self_scm_);
    2. UPON DESTRUCTION, DO
 
    scm_unprotect_object (tab->self_scm_);
+
+
+
+
+   TODO:
+
+   This should come from GUILE. We're typically doing double work,
+   because KEY already is a symbol, and is looked up in a symbol
+   hashtable.
    
  */
 class Scheme_hash_table :  private Scm_stl_map
    
  */
 class Scheme_hash_table :  private Scm_stl_map
@@ -66,7 +75,6 @@ public:
 
   SCM to_alist () const;
   DECLARE_SMOBS(Scheme_hash_table,foo);
 
   SCM to_alist () const;
   DECLARE_SMOBS(Scheme_hash_table,foo);
-
 };
 
 #endif /* SCM_HASH_HH */
 };
 
 #endif /* SCM_HASH_HH */
index d4f83c4585bd32a8125ec2b3416b3e8faaeb6d41..a2dee9359dfe013254a0741686aa0097fce9243c 100644 (file)
@@ -35,10 +35,10 @@ protected:
 
 private:
   Moment here_mom_;
 
 private:
   Moment here_mom_;
-
   SCM cursor_;
   Music_iterator * iter_p_;
 
   SCM cursor_;
   Music_iterator * iter_p_;
 
+  void next_element ();
   void descend_to_child ();
 };
 
   void descend_to_child ();
 };
 
index 6d8563d434dfb656603e1cf5419c7059b085004f..a4f8e903566e25ad8c39391f1d6d8fee8478503d 100644 (file)
@@ -33,6 +33,8 @@
 
    self-alignment-X -- real number: -1 = left aligned, 0 = center, 1
      right-aligned in X direction.
 
    self-alignment-X -- real number: -1 = left aligned, 0 = center, 1
      right-aligned in X direction.
+
+     Set to an element pointer, if you want that element to be the center. 
      
    self-alignment-Y -- like self-alignment-X but for Y axis
    
      
    self-alignment-Y -- like self-alignment-X but for Y axis
    
index 6ffdbb62aaf790969d2cc594b339b303907afa21..3aa3ceae325354e73d2cbaf7f041a17d187042e0 100644 (file)
@@ -18,6 +18,8 @@
  */
 class Unfolded_repeat_iterator : public Music_iterator
 {
  */
 class Unfolded_repeat_iterator : public Music_iterator
 {
+  void add_repeat_command (SCM);
+
 public:
   VIRTUAL_COPY_CONS (Music_iterator);
   /**
 public:
   VIRTUAL_COPY_CONS (Music_iterator);
   /**
@@ -25,17 +27,16 @@ public:
    */
   int done_count_;
 
    */
   int done_count_;
 
+  /*
+    are we now busy doing the body?
 
 
-  /// unfold everything, or do volta?
-  bool full_unfold_b_;
-  
-  /// are we busy doing the body?
+   */
   bool do_main_b_;
 
   /** How far have we progressed into the repeat.
       This excludes the elt currently being iterated.
   */
   bool do_main_b_;
 
   /** How far have we progressed into the repeat.
       This excludes the elt currently being iterated.
   */
-  Moment done_mom_;
+  Moment here_mom_;
   int alternative_count_i_;
   Music_iterator * current_iter_p_;
   
   int alternative_count_i_;
   Music_iterator * current_iter_p_;
   
@@ -44,15 +45,16 @@ public:
   ~Unfolded_repeat_iterator();
   Unfolded_repeat_iterator ();
 
   ~Unfolded_repeat_iterator();
   Unfolded_repeat_iterator ();
 
-
 protected:  
   virtual void construct_children ();
   virtual Moment pending_moment () const;
   virtual void process (Moment);
   virtual Music_iterator *try_music_in_children (Music *) const;
 protected:  
   virtual void construct_children ();
   virtual Moment pending_moment () const;
   virtual void process (Moment);
   virtual Music_iterator *try_music_in_children (Music *) const;
-
+  virtual void skip (Moment);
+  virtual SCM get_music (Moment) const;
+  
   virtual bool ok () const;
   virtual bool ok () const;
-  virtual void next_element ();
+  virtual void next_element (bool side_effect);
 };
 #endif /* UNFOLDED_REPEAT_ITERATOR_HH */
 
 };
 #endif /* UNFOLDED_REPEAT_ITERATOR_HH */
 
index 87fbcacb82ef1e2868d4369f8f5826f017aecdc0..208e7034205c25f956e9ba673a80ba4486eba89a 100644 (file)
@@ -480,7 +480,7 @@ My_lily_lexer::scan_escaped_word (String str)
        } else if (gh_number_p (sid)) {
                yylval.scm = sid;
                return NUMBER_IDENTIFIER;
        } else if (gh_number_p (sid)) {
                yylval.scm = sid;
                return NUMBER_IDENTIFIER;
-       } else if (Translator_def* tr = unsmob_translator_def (sid)) {
+       } else if (unsmob_translator_def (sid)) {
                yylval.scm = sid;
                return TRANSLATOR_IDENTIFIER;
        } else if (Music * mus =unsmob_music (sid)) {
                yylval.scm = sid;
                return TRANSLATOR_IDENTIFIER;
        } else if (Music * mus =unsmob_music (sid)) {
index 3729344c06448cd434d021043bffdba3f4c26d2e..552865111bdd9c3073a09fd84827b1d196354e3f 100644 (file)
 
 /**
    The name says it all: make multi measure rests 
 
 /**
    The name says it all: make multi measure rests 
- */
+
+FIXME? The MM rest engraver must be able to see bar lines, so it won't
+work at Voice level. Not a problem in practice, but aesthetically pleasing? 
+
+*/
 class Multi_measure_rest_engraver : public Engraver
 {
 public:
 class Multi_measure_rest_engraver : public Engraver
 {
 public:
diff --git a/lily/repeat-acknowledge-engraver.cc b/lily/repeat-acknowledge-engraver.cc
new file mode 100644 (file)
index 0000000..477e295
--- /dev/null
@@ -0,0 +1,89 @@
+/*   
+  repeat-acknowledge-engraver.cc --  implement Repeat_acknowledge_engraver
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+#include "engraver.hh"
+#include "translator-group.hh"
+#include "repeated-music.hh"
+
+
+/*
+  Objective:
+
+  -- set and reset repeatCommands, so Unfolded_repeat_iterator knows
+    where to set variables.
+
+  -- collect information passed by Unfolded_repeat_iterator for
+   Bar_engraver: writes whichBar property. (TODO: check for
+   interactions with timing engraver.)
+  
+ */
+class Repeat_acknowledge_engraver : public Engraver
+{
+public:
+  VIRTUAL_COPY_CONS (Translator);
+  Repeat_acknowledge_engraver();
+  
+  virtual void do_post_move_processing ();
+  virtual void do_process_music ();
+  virtual void do_creation_processing ();
+};
+
+void
+Repeat_acknowledge_engraver::do_creation_processing ()
+{
+  daddy_trans_l_->set_property ("repeatCommands", SCM_EOL);
+}
+
+
+Repeat_acknowledge_engraver::Repeat_acknowledge_engraver()
+{
+}
+
+void
+Repeat_acknowledge_engraver::do_post_move_processing ()
+{
+  Translator_group * tr = daddy_trans_l_->where_defined (ly_symbol2scm ("repeatCommands"));
+  if (!tr)
+    tr = daddy_trans_l_;
+
+  tr->set_property ("repeatCommands", SCM_EOL);
+}
+
+void
+Repeat_acknowledge_engraver::do_process_music ()
+{
+  SCM cs = get_property ("repeatCommands");
+
+  String s = "";
+  bool start  = false;
+  bool end = false;
+  while (gh_pair_p (cs))
+    {
+      SCM command = gh_car (cs);
+      if (command == ly_symbol2scm ("start-repeat"))
+       start = true;
+      else if (command == ly_symbol2scm ("end-repeat"))
+       end = true;
+      cs = gh_cdr (cs);      
+    }
+
+  if ( start && end )
+    s = ":|:";
+  else if (start)
+    s = "|:";
+  else if (end)
+    s = ":|";
+
+  if (s != "")
+    {
+      daddy_trans_l_->set_property ("whichBar", ly_str02scm(s.ch_C()));
+    }
+}
+
+
+ADD_THIS_TRANSLATOR(Repeat_acknowledge_engraver);
diff --git a/lily/repeat-engraver.cc b/lily/repeat-engraver.cc
deleted file mode 100644 (file)
index 96b11d5..0000000
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
-  repeat-engraver.cc -- implement Repeat_engraver
-
-  source file of the GNU LilyPond music typesetter
-
-  (c) 1998--2000 Jan Nieuwenhuizen <janneke@gnu.org>
-*/
-
-#include "engraver.hh"
-#include "cons.hh"
-#include "bar.hh"
-#include "bar-engraver.hh"
-#include "musical-request.hh"
-#include "multi-measure-rest.hh"
-#include "command-request.hh"
-#include "timing-translator.hh"
-#include "engraver-group-engraver.hh"
-#include "repeated-music.hh"
-#include "timing-translator.hh"
-#include "volta-spanner.hh"
-#include "note-column.hh"
-#include "paper-def.hh"
-#include "music-list.hh"
-#include "side-position-interface.hh"
-#include "spanner.hh"
-#include "note-column.hh"
-
-struct Bar_create_event
-{
-  Moment when_;
-  bool bar_b_;
-  bool last_b_;
-  String type_;
-  Bar_create_event();
-  Bar_create_event (Moment w, String s);
-  Bar_create_event (Moment w, int i, int j);
-};
-
-int compare (Bar_create_event const & c1, Bar_create_event const &c2)
-{
-  return (c1.when_ - c2.when_).sign();
-}
-
-/**
-  Generate repeat-bars |: :| for repeated-music
-  */
-class Repeat_engraver : public Engraver 
-{
-public:
-  VIRTUAL_COPY_CONS(Translator);
-  Repeat_engraver ();
-protected:
-  virtual void acknowledge_element (Score_element_info i);
-  virtual void do_removal_processing ();
-  virtual bool do_try_music (Music *req_l);
-  virtual void do_process_music();
-  virtual void do_pre_move_processing();
-  virtual void do_post_move_processing ();
-  void queue_events ();
-
-private:
-  Repeated_music *repeated_music_l_;
-  bool done_this_one_b_;
-
-  /*
-    Royal_brackla_create_queue is only two Whiskies away. :-)
-   */
-  Cons<Bar_create_event> *create_barmoments_queue_;
-
-  Spanner * volta_span_p_;
-  Spanner* end_volta_span_p_;
-};
-
-
-
-
-ADD_THIS_TRANSLATOR (Repeat_engraver);
-
-bool
-Repeat_engraver::do_try_music (Music* m)
-{
-  if (Repeated_music* r = dynamic_cast<Repeated_music *> (m))
-    {
-      if (repeated_music_l_)
-       return false;
-      
-      if (r->volta_fold_b_)
-       {
-         repeated_music_l_ = r;
-       }
-
-      /*
-       We acknowledge other types of unfolded music as well, to
-       get auto context selection right.
-       */
-      if (r->type_ == "volta" || r->type_ == "unfolded")
-       return true;
-
-    }
-  return false;
-}
-
-/**
- Walk through repeat music, and generate events for appropriate times.
-
- UGH. Should use Music_iteration for this.
-
- Should also queue some event to get timing information reset during
- 2nd and following voltas.
-*/
-void
-Repeat_engraver::queue_events ()
-{
-  Music_sequence* alt = repeated_music_l_->alternatives ();
-  Moment walk_mom = now_mom () + repeated_music_l_->body ()->length_mom ();
-
-  SCM novolta = get_property ("noVoltaBraces");
-  bool create_volta = !to_boolean (novolta);
-
-  Cons_list<Bar_create_event> becel;
-  becel.append (new Bar_create_event (now_mom (), "|:"));
-
-  if (!alt)
-    {
-      becel.append  (new Bar_create_event (walk_mom, ":|"));
-      becel.append  (new Bar_create_event (walk_mom, "stop"));
-   }
-  else
-    {
-      int last_number = 0;
-      int volta_number = repeated_music_l_->repeats_i_ - alt->length_i () + 1;
-
-      /*
-       all repeat alternatives, and generate events with
-       appropriate timestamps. The volta spanner event (a number string)
-       happens at the begin of the alt. The :| bar event at the ending.
-      */
-
-      for (SCM s = repeated_music_l_->alternatives ()->music_list ();
-          gh_pair_p (s);  s = gh_cdr (s))
-       {
-         Music *mus =unsmob_music (gh_car (s));
-
-         /*
-           some idiot might typeset a repeat not starting on a
-           barline.  Make sure there is one.
-
-           (todo: should try to avoid line breaks?)
-         */
-         if (last_number == 0)
-           {
-             becel.append (new Bar_create_event (walk_mom, ""));
-           }
-
-         
-         if (create_volta)
-           {
-             Bar_create_event * c = new Bar_create_event (walk_mom, last_number+ 1,
-                                                          volta_number);
-             
-             if (!gh_pair_p (gh_cdr (s)))
-               c->last_b_ = true;
-             
-             becel.append (c);
-             last_number = volta_number;
-             volta_number ++;
-             SCM l (get_property ("voltaSpannerDuration"));
-             if (unsmob_moment(l))
-               {
-                 Moment vSD_mom = *unsmob_moment (l);
-                 if ( vSD_mom < mus->length_mom() ) // terminate volta early ?
-                   {
-                     vSD_mom += walk_mom;
-                     c->last_b_ = true;
-                     becel.append (new Bar_create_event (vSD_mom, "stop"));
-                   }
-               }
-           }
-         walk_mom += mus->length_mom();
-
-         if (gh_pair_p (gh_cdr (s)))
-           becel.append (new Bar_create_event (walk_mom, ":|"));
-         else
-           becel.append (new Bar_create_event (walk_mom, "stop"));
-       }
-    }
-
-  /*
-    ugh, should merge :| and |: here.
-   */
-  Cons<Bar_create_event> * last = last_cons (create_barmoments_queue_);
-  Cons<Bar_create_event> **tail = last?  & last->next_
-    : & create_barmoments_queue_;
-
-  *tail = becel.head_ ;
-  
-  becel.head_ = 0;
-}
-
-void
-Repeat_engraver::do_process_music ()
-{
-  if (repeated_music_l_ && !done_this_one_b_)
-    { 
-      queue_events ();
-      done_this_one_b_ = true;
-    }
-  
-  
-  Cons<Bar_create_event> * head = create_barmoments_queue_;
-  if (!head)
-    return;
-
-  /*
-    Do all the events that need to be done now.
-  */
-  while (head && now_mom () == head->car_->when_)
-    {
-      create_barmoments_queue_ = create_barmoments_queue_->next_;
-      head->next_ =0;
-      String t = head->car_->type_;
-      if (head->car_->bar_b_)
-       {
-         if (t == "stop" || t == ":|")
-           {
-             end_volta_span_p_ = volta_span_p_;
-             volta_span_p_ =0;
-           }
-
-         SCM whsym = ly_symbol2scm ("whichBar");
-         Translator_group* where = daddy_trans_l_->where_defined (whsym);
-         SCM which = where->get_property (whsym);
-
-         /*
-           Should use symbols for bar glyphs.
-         */
-         if (t == "stop" && which == SCM_UNDEFINED)
-           which = ly_str02scm ("");
-         else if (t != "stop")
-           {
-             SCM l = ly_str02scm (":|");
-             SCM r = ly_str02scm ("|:");                 
-                 
-             if ( (t == "|:" && scm_equal_p (which, l) == SCM_BOOL_T)
-                  || (t == ":|" && scm_equal_p (which, r)== SCM_BOOL_T))
-               t = ":|:";
-
-             if (t != "" || !gh_string_p (which))
-               which = ly_str02scm (t.ch_C());
-           }
-         where->set_property (whsym, which);
-       }
-      else
-       {
-         assert (!volta_span_p_);
-         volta_span_p_ = new Spanner (get_property ("basicVoltaSpannerProperties"));
-         Volta_spanner::set_interface (volta_span_p_);
-         announce_element (volta_span_p_,0);
-         volta_span_p_->set_elt_property ("text",
-                                          ly_str02scm (t.ch_C()));
-         volta_span_p_->set_elt_property ("last-volta",
-                                          gh_bool2scm (head->car_->last_b_));
-         // voltaSpannerDuration stuff here.
-         // other property stuff here.
-       }
-         
-
-      delete head->car_;
-      delete head;
-
-      head = create_barmoments_queue_;
-    }
-
-  assert (!head || head->car_->when_ > now_mom ());
-}  
-
-
-void
-Repeat_engraver::acknowledge_element (Score_element_info i)
-{
-  if (Item* item = dynamic_cast<Item*> (i.elem_l_))
-    {
-      if (Note_column::has_interface (item))
-       {
-         if (volta_span_p_)
-           Volta_spanner::add_column (volta_span_p_,item);
-         if (end_volta_span_p_)
-           Volta_spanner::add_column (end_volta_span_p_,item);      
-       }
-      if (Bar::has_interface (item))
-       {
-         if (volta_span_p_)
-           Volta_spanner::add_bar (volta_span_p_, item);
-         if (end_volta_span_p_)
-           Volta_spanner::add_bar(end_volta_span_p_ , item);
-       }
-    }
-}
-
-void
-Repeat_engraver::do_removal_processing ()
-{
-  if (volta_span_p_)
-    {
-      typeset_element(volta_span_p_);
-    }
-  if (end_volta_span_p_)
-    {
-      typeset_element (end_volta_span_p_);
-    }
-  // todo: the paranoid may also delete create_barmoments_queue_
-}
-
-void
-Repeat_engraver::do_post_move_processing ()
-{
-  for (Cons<Bar_create_event> *p = create_barmoments_queue_;
-       p && p->car_->when_ == now_mom (); p = p->next_)
-    if (p->car_->type_ == "stop")
-      {
-       repeated_music_l_ = 0;
-       done_this_one_b_ = false;
-      }
-}
-
-void 
-Repeat_engraver::do_pre_move_processing ()
-{
-  if (end_volta_span_p_)
-    {
-      Side_position::add_staff_support (end_volta_span_p_);
-      
-      typeset_element (end_volta_span_p_ );
-      end_volta_span_p_ =0;
-    }
-    
-}
-
-
-Repeat_engraver::Repeat_engraver()
-{
-  repeated_music_l_ =0;
-  end_volta_span_p_ =0;
-  volta_span_p_ =0;
-  done_this_one_b_ = false;
-  create_barmoments_queue_ =0;
-}
-                                
-/* ************** */
-Bar_create_event::Bar_create_event()
-{
-  last_b_ =false;
-  bar_b_ = true;
-}
-
-Bar_create_event::Bar_create_event (Moment w, String s)
-{
-  last_b_ =false;
-  when_ = w;
-  type_ = s;
-  bar_b_ = true;
-}
-
-Bar_create_event::Bar_create_event (Moment w, int i, int j)
-{
-  last_b_ =false;
-  when_ = w ;
-  bar_b_ = false;
-
-  if (i!=j)
-    type_ = to_str (i) + ".-" ;
-
-  type_ += to_str(j) + ".";
-}
index 080240a8b519b726b25d9dc6d8e1e3fe58d0009c..aaeeeecac7bcb5427fad13d5c56aa341d839d8e3 100644 (file)
@@ -49,7 +49,7 @@ SCM
 Request_chord_iterator::get_music (Moment) const
 {
   SCM s = SCM_EOL;
 Request_chord_iterator::get_music (Moment) const
 {
   SCM s = SCM_EOL;
-  if (music_l_)
+  if (last_processed_mom_ < Moment (0))
     {
       Music_sequence * ms = dynamic_cast<Music_sequence*> (music_l_);
      
     {
       Music_sequence * ms = dynamic_cast<Music_sequence*> (music_l_);
      
@@ -64,7 +64,7 @@ Request_chord_iterator::get_music (Moment) const
 void
 Request_chord_iterator::process (Moment m)
 {
 void
 Request_chord_iterator::process (Moment m)
 {
-  if (music_l_)
+  if (last_processed_mom_ < Moment (0))
     {
       for (SCM s = dynamic_cast<Music_sequence *> (music_l_)->music_list ();
           gh_pair_p (s);  s = gh_cdr (s))
     {
       for (SCM s = dynamic_cast<Music_sequence *> (music_l_)->music_list ();
           gh_pair_p (s);  s = gh_cdr (s))
index 952bded8fa92f265fb3cb262ab8cbac411bfdfc7..a6cecb90135d5c6ca75ea4228041d576355c1658 100644 (file)
@@ -51,6 +51,10 @@ Rest_collision::add_column (Score_element*me,Score_element *p)
   p->set_elt_property ("rest-collision", me->self_scm ());
 }
 
   p->set_elt_property ("rest-collision", me->self_scm ());
 }
 
+
+/*
+  Combination of dot-count and duration-log.
+ */
 static SCM
 head_characteristic (Score_element * col)
 {
 static SCM
 head_characteristic (Score_element * col)
 {
@@ -105,11 +109,6 @@ Rest_collision::do_shift (Score_element *me, SCM elts)
   // meisjes met meisjes
   if (!notes.size()) 
     {
   // meisjes met meisjes
   if (!notes.size()) 
     {
-
-      /*
-       FIXME: col2rhythmic_head and rhythmic_head2mom sucks bigtime.
-       
-      */
       SCM characteristic = head_characteristic  (rests[0]);
       int i = 1;
       for (; i < rests.size (); i++)
       SCM characteristic = head_characteristic  (rests[0]);
       int i = 1;
       for (; i < rests.size (); i++)
@@ -142,13 +141,29 @@ Rest_collision::do_shift (Score_element *me, SCM elts)
        display_count = rests.size ();
       
       /*
        display_count = rests.size ();
       
       /*
-       UGH.  Should get dims from table.  Should have minimum dist.
+       Ugh. Should have minimum dist.
+
+       Ugh. What do we do if we have three different rests?
+       
        */
        */
-      int dy = display_count > 2 ? 6 : 4;
+      int dy = display_count > 2 ? 6 : 4; // FIXME Should get dims from table.
       if (display_count > 1)
        {
       if (display_count > 1)
        {
-         Note_column::translate_rests (rests[0],dy);   
-         Note_column::translate_rests (rests[1], -dy);
+         Direction d0 = Note_column::dir (rests[0]);
+         Direction d1 = Note_column::dir (rests[1]);     
+
+         if (!d0 && !d1)
+           {
+             d0= UP;
+             d1 = DOWN;
+           }
+         else if (!d0)
+           d0 = - d1;
+         else if (!d1)
+           d1 = -d0;
+               
+         Note_column::translate_rests (rests[0],d0 *dy);       
+         Note_column::translate_rests (rests[1], d1 *dy);
        }
     }
   // meisjes met jongetjes
        }
     }
   // meisjes met jongetjes
index de480844e5b105677b42830671a8caa56cf1f37c..7260e3eb83f1e49c0d946489607239c1abc64496 100644 (file)
 #include "music-list.hh"
 #include "request-chord-iterator.hh"
 
 #include "music-list.hh"
 #include "request-chord-iterator.hh"
 
+/*
+  Invariant for the data structure.
+
+
+  if (gh_pair_p (cursor_))
+    iter_p_->music_l_ == unsmob_music (gh_car (cursor_))
+  else
+    iter_p_ == 0;
+
+  The length of musiclist from start to up to cursor_ (cursor_ not
+  including), is summed
+
+  here_mom_  = sum (length (musiclist [start ... cursor> ))  %)  
+  
+ */
+
+
 Sequential_music_iterator::Sequential_music_iterator ()
 {
 Sequential_music_iterator::Sequential_music_iterator ()
 {
-  cursor_ = 0;
-  here_mom_ = 0;
+  cursor_ = SCM_EOL;
+  here_mom_ = Moment (0);
+
   iter_p_ =0;
 }
 
   iter_p_ =0;
 }
 
@@ -39,23 +57,40 @@ void
 Sequential_music_iterator::construct_children()
 {
   cursor_ = dynamic_cast<Music_sequence const*> (music_l_)->music_list ();
 Sequential_music_iterator::construct_children()
 {
   cursor_ = dynamic_cast<Music_sequence const*> (music_l_)->music_list ();
-  
-  while (gh_pair_p (cursor_ ))
+
+  iter_p_ = gh_pair_p (cursor_) ?  get_iterator_p (unsmob_music (gh_car (cursor_))) : 0;
+  while (iter_p_ && !iter_p_->ok ())
     {
     {
-      iter_p_ =  get_iterator_p (unsmob_music (gh_car (cursor_)));
-      
-      if (iter_p_->ok()) 
-       {
-         descend_to_child ();
-         return;
-       }
-
-      delete iter_p_ ;
-      iter_p_ =0;
-      cursor_ = gh_cdr (cursor_);
+      next_element ();
     }
     }
+
+  /*
+    iter_p_->ok () is tautology, but what the heck.
+   */
+  if (iter_p_ && iter_p_->ok()) 
+    descend_to_child ();
+
+}
+
+
+/*
+  maintain invariants: change cursor, iter and here_mom_ in one fell
+  swoop.
+*/
+void
+Sequential_music_iterator::next_element ()
+{
+  here_mom_ += iter_p_->music_length_mom ();
+  delete iter_p_;
+  cursor_ = gh_cdr (cursor_);
+
+  if (gh_pair_p (cursor_))
+    iter_p_ = get_iterator_p (unsmob_music (gh_car (cursor_)));
+  else
+    iter_p_ = 0;
 }
 }
- /*
+
+/*
   move to context of child iterator if it is deeper down in the
   hierarchy.
   */
   move to context of child iterator if it is deeper down in the
   hierarchy.
   */
@@ -63,7 +98,6 @@ Sequential_music_iterator::construct_children()
 void
 Sequential_music_iterator::descend_to_child ()
 {
 void
 Sequential_music_iterator::descend_to_child ()
 {
-       
   Translator_group  * child_report = child_report = iter_p_->report_to_l ();
   if (dynamic_cast<Grace_iterator*> (iter_p_))
     child_report = child_report->daddy_trans_l_;
   Translator_group  * child_report = child_report = iter_p_->report_to_l ();
   if (dynamic_cast<Grace_iterator*> (iter_p_))
     child_report = child_report->daddy_trans_l_;
@@ -96,28 +130,24 @@ Sequential_music_iterator::get_music (Moment until)const
   if (until <  pending_moment ())
     return s;
 
   if (until <  pending_moment ())
     return s;
 
-  SCM curs = cursor_;
-  Music_iterator * iter = iter_p_->clone ();
-  while (1)
+  Sequential_music_iterator * me =
+    dynamic_cast<Sequential_music_iterator*> (clone ());
+  while (me->ok ())
     {
     {
-      SCM nm = iter->get_music (until - here_mom_);
+      SCM nm = me->iter_p_->get_music (until - me->here_mom_);
       s = gh_append2 (nm, s);
       
       Moment m = 0;
       for (SCM i = nm; gh_pair_p(i); i = gh_cdr (i))
        m = m >? unsmob_music (gh_car (i))->length_mom ();
 
       s = gh_append2 (nm, s);
       
       Moment m = 0;
       for (SCM i = nm; gh_pair_p(i); i = gh_cdr (i))
        m = m >? unsmob_music (gh_car (i))->length_mom ();
 
-      delete iter;
-
-      curs = gh_cdr (curs);
-
-      if (!gh_pair_p (curs) ||  m > Moment (0))
-       return s;
+      if (m > Moment (0))
+       break ;
       else
       else
-       {
-         iter = get_iterator_p (unsmob_music (gh_car (curs)));
-       }      
+       me->next_element ();
     }
     }
+  delete me;
+  
   return s;
 }
 /*
   return s;
 }
 /*
@@ -129,7 +159,7 @@ Sequential_music_iterator::get_music (Moment until)const
 void
 Sequential_music_iterator::skip (Moment until)
 {
 void
 Sequential_music_iterator::skip (Moment until)
 {
-  while (1)
+  while (ok ())
     {
       Moment l =iter_p_->music_length_mom ();
       if (l >= until - here_mom_)
     {
       Moment l =iter_p_->music_length_mom ();
       if (l >= until - here_mom_)
@@ -137,24 +167,15 @@ Sequential_music_iterator::skip (Moment until)
 
       if (iter_p_->ok ())
        return ; 
 
       if (iter_p_->ok ())
        return ; 
-      
-      here_mom_ = here_mom_ + l;
-      delete iter_p_;
-      iter_p_ =0;
-
-      cursor_ = gh_cdr (cursor_);
 
 
-      if (!gh_pair_p (cursor_))
-       return ;
-      else
-       iter_p_ = get_iterator_p (unsmob_music (gh_car (cursor_)));
+      next_element ();
     }
 }
 
 void
 Sequential_music_iterator::process (Moment until)
 {
     }
 }
 
 void
 Sequential_music_iterator::process (Moment until)
 {
-  while (1)
+  while (iter_p_)
     {
       iter_p_->process (until - here_mom_);
 
     {
       iter_p_->process (until - here_mom_);
 
@@ -167,23 +188,9 @@ Sequential_music_iterator::process (Moment until)
       if (iter_p_->ok ())
        return ;
 
       if (iter_p_->ok ())
        return ;
 
-      here_mom_ += iter_p_->music_length_mom ();
-
       descend_to_child ();
       descend_to_child ();
-      delete iter_p_;
-      iter_p_ =0;
-
-      cursor_ = gh_cdr (cursor_);
-
-      if (!gh_pair_p (cursor_))
-       return ;
-      else
-       {
-         delete iter_p_;
-         iter_p_ = get_iterator_p (unsmob_music (gh_car (cursor_)));
-       }      
+      next_element ();
     }
     }
-
 }
 
 Moment
 }
 
 Moment
index e3ea3d65014ee3c15414621be5caa27f1c628f9d..7c2c974c7e9e6e8f895e84a5ef318b77729360ff 100644 (file)
@@ -108,16 +108,16 @@ Side_position::side_position (Score_element *cme, Axis axis)
   callback that centers the element on itself
  */
 Real
   callback that centers the element on itself
  */
 Real
-Side_position::aligned_on_self (Score_element *elm, Axis ax)
+Side_position::aligned_on_self (Score_element *me, Axis ax)
 {
   String s ("self-alignment-");
 
   s +=  (ax == X_AXIS) ? "X" : "Y";
 
 {
   String s ("self-alignment-");
 
   s +=  (ax == X_AXIS) ? "X" : "Y";
 
-  SCM align (elm->get_elt_property (s.ch_C()));
+  SCM align (me->get_elt_property (s.ch_C()));
   if (gh_number_p (align))
     {
   if (gh_number_p (align))
     {
-      Interval ext(elm->extent (ax));
+      Interval ext(me->extent (ax));
 
       if (ext.empty_b ())
        {
 
       if (ext.empty_b ())
        {
@@ -126,11 +126,14 @@ Side_position::aligned_on_self (Score_element *elm, Axis ax)
        }
       else
        {
        }
       else
        {
-         Real lambda = (0.5 + gh_scm2double (align) / 2.0);
+         Real lambda = (0.5 - gh_scm2double (align) / 2.0);
          return - (lambda * ext[LEFT] + (1 - lambda) * ext[RIGHT]);
        }
     }
          return - (lambda * ext[LEFT] + (1 - lambda) * ext[RIGHT]);
        }
     }
-  else
+  else if (unsmob_element (align))
+    {
+      return - unsmob_element (align)->relative_coordinate (me,  ax);
+    }
     return 0.0;
 }
 
     return 0.0;
 }
 
index c4a78e9583a8f9048b2ba200a233ad4d1a7959f4..855ff7078086e3a881d01e601adb507757bad259 100644 (file)
@@ -32,7 +32,7 @@ Simple_music_iterator::ok ()const
 Moment
 Simple_music_iterator::pending_moment ()const
 {
 Moment
 Simple_music_iterator::pending_moment ()const
 {
-  if (music_l_)
+  if (last_processed_mom_ < Moment (0))
     return Moment (0);
   else
     return music_length_mom ();
     return Moment (0);
   else
     return music_length_mom ();
@@ -48,17 +48,9 @@ Simple_music_iterator::skip (Moment m)
 void
 Simple_music_iterator::process (Moment m)
 {
 void
 Simple_music_iterator::process (Moment m)
 {
-#if 0
   /*
   /*
-    try_music () causes trouble for base classes
-   */
-  if (music_l_)
-    {
-      bool b = try_music (music_l_);
-      if (!b)
-       music_l_->origin ()->warning (_f ("Junking music: `%s'",
-                                         classname (music_l_)));
-    }
-#endif
+  don't do try_music (), since it would make the function useless for
+  base classes */
+
   skip (m);
 }
   skip (m);
 }
index 2bfd4dfcbe423176dfff102c54b43dcfd362656f..11e2441645fee3f7c424308745275c049058e5fc 100644 (file)
 void
 Stem_tremolo::set_interface (Score_element *me)
 {
 void
 Stem_tremolo::set_interface (Score_element *me)
 {
+  me->set_interface (ly_symbol2scm ("stem-tremolo"));
+}
+
+bool
+Stem_tremolo::has_interface (Score_element *me)
+{
+  return me->has_interface (ly_symbol2scm ("stem-tremolo"));
 }
 
 
 }
 
 
index 95b68d0369885b807299b9e71a9d65699bc5ae36..c727c5889625c2aab8410811bd2b51e29ee5e4d2 100644 (file)
@@ -5,6 +5,7 @@
 
   (c)  1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
 
   (c)  1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
+#include <iostream.h>
 
 #include "translator-group.hh"
 #include "command-request.hh"
 
 #include "translator-group.hh"
 #include "command-request.hh"
@@ -23,8 +24,8 @@ protected:
   virtual bool do_try_music (Music * );
   virtual void do_post_move_processing ();
   virtual void do_process_music ();
   virtual bool do_try_music (Music * );
   virtual void do_post_move_processing ();
   virtual void do_process_music ();
+  virtual void do_pre_move_processing ();
 public:
 public:
-  String which_bar (); 
   VIRTUAL_COPY_CONS(Translator);
 };
 
   VIRTUAL_COPY_CONS(Translator);
 };
 
@@ -37,9 +38,12 @@ Timing_engraver::do_post_move_processing( )
   Timing_translator::do_post_move_processing ();
 
   SCM nonauto = get_property ("barNonAuto");
   Timing_translator::do_post_move_processing ();
 
   SCM nonauto = get_property ("barNonAuto");
-  SCM which = now_mom () ? SCM_UNDEFINED : ly_str02scm ("|");
+
+  SCM which = get_property ("whichBar");
+  if (!gh_string_p (which))
+    which = now_mom () ? SCM_EOL : ly_str02scm ("|");
   
   
-  if (which == SCM_UNDEFINED && !to_boolean (nonauto))
+  if (!gh_string_p (which) && !to_boolean (nonauto))
     {
       SCM always = get_property ("barAlways");
       if (!measure_position ()
     {
       SCM always = get_property ("barAlways");
       if (!measure_position ()
@@ -52,6 +56,13 @@ Timing_engraver::do_post_move_processing( )
   daddy_trans_l_->set_property ("whichBar", which);
 }
 
   daddy_trans_l_->set_property ("whichBar", which);
 }
 
+void
+Timing_engraver::do_pre_move_processing ()
+{
+  Timing_translator::do_pre_move_processing ();
+  daddy_trans_l_->set_property ("whichBar", SCM_EOL);  
+}
+
 bool
 Timing_engraver::do_try_music (Music*m)
 {
 bool
 Timing_engraver::do_try_music (Music*m)
 {
index 9a4155f54da58f9d0aa4b0b91045d233ca67258c..6e6b665f011d82a642422b3b4997ff7525fe58d1 100644 (file)
@@ -38,28 +38,45 @@ the  alternative just set.
    
  */
 void
    
  */
 void
-Unfolded_repeat_iterator::next_element () 
+Unfolded_repeat_iterator::next_element (bool side_effect
 {
 {
-  Repeated_music * mus =dynamic_cast<Repeated_music *> (music_l_);
+  Repeated_music * repmus =dynamic_cast<Repeated_music *> (music_l_);
   delete current_iter_p_;
   current_iter_p_ =0;
 
   delete current_iter_p_;
   current_iter_p_ =0;
 
-
+  bool do_repcommands = side_effect && repmus->volta_fold_b_;
+  
   if (do_main_b_)
     {
   if (do_main_b_)
     {
-      done_mom_ += mus->body ()->length_mom ();
+      /*
+       we were busy doing the main body, so
+
+       - go to alternative if we're a volta
+
+       - do something intelligent when we're fully unfolding (fixcomment)
+       */
+      
+      here_mom_ += repmus->body ()->length_mom ();
 
 
-      if (!mus->volta_fold_b_)
+      if (!repmus->volta_fold_b_)
        done_count_ ++;
      
       if (gh_pair_p (alternative_cons_))
        {
          current_iter_p_ = get_iterator_p (unsmob_music (gh_car (alternative_cons_)));
          do_main_b_ = false;
        done_count_ ++;
      
       if (gh_pair_p (alternative_cons_))
        {
          current_iter_p_ = get_iterator_p (unsmob_music (gh_car (alternative_cons_)));
          do_main_b_ = false;
+
+         if (repmus->volta_fold_b_)
+           {
+             String repstr = to_str (done_count_ + 1);
+             if (do_repcommands)
+               add_repeat_command (gh_list (ly_symbol2scm ("volta"),
+                                            gh_str02scm (repstr.ch_C()), SCM_UNDEFINED));
+           }     
        }
        }
-      else if (done_count_ <  mus->repeats_i_ && !mus->volta_fold_b_) 
+      else if (done_count_ <  repmus->repeats_i_ && !repmus->volta_fold_b_) 
        {
        {
-         current_iter_p_ = get_iterator_p (mus->body ());
+         current_iter_p_ = get_iterator_p (repmus->body ());
          do_main_b_ = true;
        }
     }
          do_main_b_ = true;
        }
     }
@@ -69,28 +86,55 @@ Unfolded_repeat_iterator::next_element ()
        we're not in the main part. So we're either in an alternative, or
        we just finished.
       */
        we're not in the main part. So we're either in an alternative, or
        we just finished.
       */
+
+      /*
+       we're in the alternatives.  We move the pointer to the
+       next alternative.
+       */
       if (alternative_cons_)
        {
       if (alternative_cons_)
        {
-         done_mom_ += unsmob_music (gh_car (alternative_cons_))->length_mom ();
+         here_mom_ += unsmob_music (gh_car (alternative_cons_))->length_mom ();
 
 
-         if (mus->volta_fold_b_ || 
-             mus->repeats_i_ - done_count_  < alternative_count_i_)
+         if (repmus->volta_fold_b_ || 
+             repmus->repeats_i_ - done_count_  < alternative_count_i_)
            alternative_cons_ = gh_cdr (alternative_cons_);
          
            alternative_cons_ = gh_cdr (alternative_cons_);
          
+         if (do_repcommands)
+           add_repeat_command (gh_list (ly_symbol2scm ("volta"), SCM_BOOL_F, SCM_UNDEFINED));
+
+         
+         
          /*
            we've done the main body as well, but didn't go over the other
            increment.  */
          /*
            we've done the main body as well, but didn't go over the other
            increment.  */
-         if (mus->volta_fold_b_)
+         if (repmus->volta_fold_b_)
            done_count_ ++;
        }
            done_count_ ++;
        }
+
+      /*
+       We still have alternatives left, so
+
+       if we're volta: traverse them
+
+       if we're full unfold: go back to main body.
+       */
       
       
-      if (done_count_ < mus->repeats_i_ && gh_pair_p (alternative_cons_))
+      if (done_count_ < repmus->repeats_i_ && gh_pair_p (alternative_cons_))
        {
        {
-         if (mus->volta_fold_b_)
+         if (do_repcommands)
+           {
+             String repstr = to_str (done_count_ + 1);
+             add_repeat_command (gh_list (ly_symbol2scm ("volta"),
+                                          gh_str02scm (repstr.ch_C()), SCM_UNDEFINED));
+             add_repeat_command (ly_symbol2scm ("end-repeat"));
+           }
+
+         
+         if (repmus->volta_fold_b_)
            current_iter_p_ = get_iterator_p (unsmob_music (gh_car (alternative_cons_)));
          else
            {
            current_iter_p_ = get_iterator_p (unsmob_music (gh_car (alternative_cons_)));
          else
            {
-             current_iter_p_ = get_iterator_p (mus->body ());
+             current_iter_p_ = get_iterator_p (repmus->body ());
              do_main_b_ = true;
            }
        }
              do_main_b_ = true;
            }
        }
@@ -107,7 +151,7 @@ Unfolded_repeat_iterator::ok () const
 Moment
 Unfolded_repeat_iterator::pending_moment () const
 {
 Moment
 Unfolded_repeat_iterator::pending_moment () const
 {
-  return done_mom_ + current_iter_p_->pending_moment ();
+  return here_mom_ + current_iter_p_->pending_moment ();
 }
 
 void
 }
 
 void
@@ -134,34 +178,95 @@ Unfolded_repeat_iterator::construct_children ()
     }
 }
 
     }
 }
 
+void
+Unfolded_repeat_iterator::add_repeat_command (SCM what)
+{
+  SCM reps = ly_symbol2scm ("repeatCommands");
+  SCM current_reps = report_to_l ()->get_property(reps);
+
+  Translator_group * where = report_to_l ()->where_defined (reps);
+  if (where
+      && current_reps == SCM_EOL || gh_pair_p (current_reps))
+    {
+      current_reps = gh_cons (what, current_reps);
+      where->set_property (reps, current_reps);
+    }
+}
+
 void
 Unfolded_repeat_iterator::process (Moment m) 
 {
   if (!m)
     {
 void
 Unfolded_repeat_iterator::process (Moment m) 
 {
   if (!m)
     {
-      Music_iterator *yeah = try_music (music_l_);
-      if (yeah)
-       set_translator (yeah->report_to_l ());
-      else
-       music_l_->origin ()->warning ( _("no one to print a volta bracket"));
+      if (dynamic_cast<Repeated_music*> (music_l_)->volta_fold_b_)
+       add_repeat_command (ly_symbol2scm ("start-repeat"));
     }
   while (1)
     {
       while (!current_iter_p_->ok ())
        {
     }
   while (1)
     {
       while (!current_iter_p_->ok ())
        {
-         next_element();
+         next_element(true);
 
          if (!current_iter_p_)
            return;
        }
       
 
          if (!current_iter_p_)
            return;
        }
       
-      if (m - done_mom_ >= current_iter_p_->pending_moment ())
-       current_iter_p_->process (m - done_mom_);
+      if (m - here_mom_ >= current_iter_p_->pending_moment ())
+       current_iter_p_->process (m - here_mom_);
       else
        return;
     }
 }
 
       else
        return;
     }
 }
 
+void
+Unfolded_repeat_iterator::skip (Moment until)
+{
+  while (current_iter_p_)
+    {
+      Moment l =current_iter_p_->music_length_mom ();
+      if (l >= until - here_mom_)
+       current_iter_p_->skip (until - here_mom_);
+
+      if (current_iter_p_->ok ())
+       return ; 
+
+      next_element (false);
+    }
+}
+
+SCM
+Unfolded_repeat_iterator::get_music (Moment until)const
+{
+  SCM s = SCM_EOL;
+  if (until <  pending_moment ())
+    return s;
+
+
+  Unfolded_repeat_iterator * me
+    = dynamic_cast<Unfolded_repeat_iterator*> (this->clone ());
+  
+  while (me->ok ())
+    {
+      SCM nm = me->current_iter_p_->get_music (until -
+                                              me->here_mom_);
+      
+      s = gh_append2 (nm, s);
+      
+      Moment m = 0;
+      for (SCM i = nm; gh_pair_p(i); i = gh_cdr (i))
+       m = m >? unsmob_music (gh_car (i))->length_mom ();
+
+      if (m > Moment (0))
+       break ;
+      else
+       me->next_element (false);
+    }
+
+  delete me;
+  
+  return s;
+}
+
 
 Music_iterator* 
 Unfolded_repeat_iterator::try_music_in_children (Music  * m) const
 
 Music_iterator* 
 Unfolded_repeat_iterator::try_music_in_children (Music  * m) const
diff --git a/lily/volta-engraver.cc b/lily/volta-engraver.cc
new file mode 100644 (file)
index 0000000..4f5baf6
--- /dev/null
@@ -0,0 +1,160 @@
+/*   
+  volta-engraver.cc --  implement Volta_engraver
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#include "engraver.hh"
+#include "translator-group.hh"
+#include "volta-spanner.hh"
+#include "item.hh"
+#include "note-column.hh"
+#include "bar.hh"
+#include "side-position-interface.hh"
+
+/*
+  Create Volta spanners, by reading repeatCommands  property, usually
+  set by Unfolded_repeat_iterator.
+ */
+class Volta_engraver : public Engraver
+{
+public:
+  Volta_engraver();
+  VIRTUAL_COPY_CONS(Translator);
+protected:
+
+  virtual void acknowledge_element (Score_element_info);
+  virtual void do_removal_processing ();
+  virtual void do_pre_move_processing ();
+  virtual void do_process_music ();
+
+  Moment started_mom_;
+  Spanner * volta_span_p_;
+  Spanner* end_volta_span_p_;
+};
+
+ADD_THIS_TRANSLATOR(Volta_engraver);
+
+Volta_engraver::Volta_engraver ()
+{
+  volta_span_p_ = 0;
+  end_volta_span_p_ = 0;
+}
+
+void
+Volta_engraver::do_process_music ()
+{
+  SCM cs = get_property ("repeatCommands");
+
+  SCM str = SCM_EOL; 
+  bool end = false;
+  while (gh_pair_p (cs))
+    {
+      SCM c = gh_car (cs);
+
+      if (gh_pair_p (c) && gh_car (c) == ly_symbol2scm ("volta"))
+       {
+         if (gh_cadr (c) ==  SCM_BOOL_F)
+           end = true;
+         else
+           str = gh_cadr (c);
+       }
+      
+      cs = gh_cdr (cs);
+    }
+
+  SCM l (get_property ("voltaSpannerDuration"));
+  Moment now = now_mom ();
+  
+  bool early_stop = volta_span_p_ &&    unsmob_moment (l)
+    &&*unsmob_moment (l) <= now - started_mom_;
+
+  if (end || early_stop)
+    {
+      end_volta_span_p_ = volta_span_p_;
+      volta_span_p_ =0;
+
+      /*
+       maybe do typeset_element () directly?
+      */
+
+      if (!gh_string_p (str))
+       end_volta_span_p_->set_elt_property ("last-volta", SCM_BOOL_T);
+    }
+
+  if (gh_string_p (str))
+    {
+      started_mom_ = now;
+      if (volta_span_p_)
+       {
+         warning (_ ("Already have a volta spanner. Stopping that one prematurely."));
+
+         if (end_volta_span_p_)
+           {
+             warning (_("Also have a stopped spanner. Giving up."));
+
+             return ;
+
+           }
+
+                    
+         end_volta_span_p_ = volta_span_p_;
+         volta_span_p_ = 0;
+       }
+
+      volta_span_p_ = new Spanner (get_property ("basicVoltaSpannerProperties"));
+      Volta_spanner::set_interface (volta_span_p_);
+      announce_element (volta_span_p_,0);
+      volta_span_p_->set_elt_property ("text", str);
+    }
+}
+
+void
+Volta_engraver::acknowledge_element (Score_element_info i)
+{
+  if (Item* item = dynamic_cast<Item*> (i.elem_l_))
+    {
+      if (Note_column::has_interface (item))
+       {
+         if (volta_span_p_)
+           Volta_spanner::add_column (volta_span_p_,item);
+         if (end_volta_span_p_)
+           Volta_spanner::add_column (end_volta_span_p_,item);      
+       }
+      if (Bar::has_interface (item))
+       {
+         if (volta_span_p_)
+           Volta_spanner::add_bar (volta_span_p_, item);
+         if (end_volta_span_p_)
+           Volta_spanner::add_bar(end_volta_span_p_ , item);
+       }
+    }
+}
+
+void
+Volta_engraver::do_removal_processing ()
+{
+  if (volta_span_p_)
+    {
+      typeset_element(volta_span_p_);
+    }
+  if (end_volta_span_p_)
+    {
+      typeset_element (end_volta_span_p_);
+    }
+}
+
+void 
+Volta_engraver::do_pre_move_processing ()
+{
+  if (end_volta_span_p_)
+    {
+      Side_position::add_staff_support (end_volta_span_p_);
+      
+      typeset_element (end_volta_span_p_ );
+      end_volta_span_p_ =0;
+    }
+}
index 00a0a29caf082d78a566c72c69eb456dd43112f2..b3fa68374f2d846177210525e84a5bcbf1610630 100644 (file)
@@ -16,7 +16,8 @@ StaffContext=\translator {
 % with empty ones.
 
 
 % with empty ones.
 
 
-       \consists "Repeat_engraver";
+%      \consists "Repeat_engraver";
+       \consists "Volta_engraver";
        \consists "Separating_line_group_engraver";     
 
 
        \consists "Separating_line_group_engraver";     
 
 
@@ -78,7 +79,8 @@ RhythmicStaffContext=\translator{
        basicVoltaSpannerProperties \push #'padding =  #5  % urg, in \pt
        basicStaffSymbolProperties \push #'line-count = #1      
 
        basicVoltaSpannerProperties \push #'padding =  #5  % urg, in \pt
        basicStaffSymbolProperties \push #'line-count = #1      
 
-       \consists "Repeat_engraver";
+%      \consists "Repeat_engraver";
+       \consists "Volta_engraver";
        \consists "Bar_engraver";
        \consists "Time_signature_engraver";
        \consists "Staff_symbol_engraver";
        \consists "Bar_engraver";
        \consists "Time_signature_engraver";
        \consists "Staff_symbol_engraver";
@@ -331,13 +333,13 @@ ScoreContext = \translator {
        \name Score;
        
 
        \name Score;
        
 
+       \consists "Repeat_acknowledge_engraver";
        \consists "Timing_engraver";
        \consists "Output_property_engraver";   
        \consists "System_start_delimiter_engraver";
        \consists "Mark_engraver";      
        \consists "Break_align_engraver";
        \consists "Spacing_engraver";
        \consists "Timing_engraver";
        \consists "Output_property_engraver";   
        \consists "System_start_delimiter_engraver";
        \consists "Mark_engraver";      
        \consists "Break_align_engraver";
        \consists "Spacing_engraver";
-
        \consists "Vertical_align_engraver";
 
        \consists "Lyric_phrasing_engraver";
        \consists "Vertical_align_engraver";
 
        \consists "Lyric_phrasing_engraver";
index 9a5a262012fa0841ac26c18fa72ee93820ef6c58..d29cfaac075e1dd2e28f8750d640dcb8883e6c63 100644 (file)
@@ -10,7 +10,7 @@
 
 % contributed by Paolo Zuliani <zuliap@easynet.it>
 
 
 % contributed by Paolo Zuliani <zuliap@easynet.it>
 
-\notenames {
+\notenames #'
        (dobb . ( -1 0 -2 ))
        (dob . ( -1 0 -1 ))
        (do . ( -1 0 0 ))
        (dobb . ( -1 0 -2 ))
        (dob . ( -1 0 -1 ))
        (do . ( -1 0 0 ))
@@ -46,6 +46,6 @@
        (si . ( -1 6 0 ))
        (sid . ( -1 6 1 ))
        (sidd . ( -1 6 2 ))
        (si . ( -1 6 0 ))
        (sid . ( -1 6 1 ))
        (sidd . ( -1 6 2 ))
-}
+)
 
 
-\version "1.3.59";
+\version "1.3.90";
index 8153a09bd7add68fc20b3037f4af23eaf3cf3996..dc8c4919e418930e72a108fe4cd9f83603d66a08 100644 (file)
@@ -2,8 +2,8 @@
  common dutch names for notes. es means flat, is means sharp
 %}
 
  common dutch names for notes. es means flat, is means sharp
 %}
 
-\notenames
-     #'((ceses . (-1 0 -2 ))
+\notenames #'(
+       (ceses . (-1 0 -2 ))
        (ces . ( -1 0 -1 ))
        (c . ( -1 0 0 ))
        (cis . ( -1 0 1 ))
        (ces . ( -1 0 -1 ))
        (c . ( -1 0 0 ))
        (cis . ( -1 0 1 ))
index 640a60346463ea9ed703ae84e87ff5a3755e5a49..5e89fd3f35b4e9de43e11c47362951e632b86768 100644 (file)
@@ -10,6 +10,9 @@ TODO:
 
 %}
 
 
 %}
 
+
+papersizename = \papersize ;
+
 paperfile = \papersize + ".ly";
 % paperfile = "a4.ly";
 \include \paperfile;
 paperfile = \papersize + ".ly";
 % paperfile = "a4.ly";
 \include \paperfile;
index 04f3612c8b4d3a38cf425a96c4f64588cdcac17f..8c6f52170da60c9051842bb8923821848871cfec 100644 (file)
@@ -1,7 +1,7 @@
 Name: lilypond
 Version: @TOPLEVEL_VERSION@
 Release: 1
 Name: lilypond
 Version: @TOPLEVEL_VERSION@
 Release: 1
-Copyright: GPL
+License: GPL
 Group: Applications/Publishing
 Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-@TOPLEVEL_VERSION@.tar.gz
 Summary: A program for printing sheet music.
 Group: Applications/Publishing
 Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-@TOPLEVEL_VERSION@.tar.gz
 Summary: A program for printing sheet music.
@@ -29,17 +29,24 @@ The documentation of LilyPond, both in HTML and PostScript.
 
 %build
 
 
 %build
 
-%{configure} --disable-checking --disable-debugging --enable-printing --prefix=%{_prefix} --disable-optimise --enable-shared
+#
 
 
-make all
+# DO NOT use % { configure } , it hardcodes all paths, runs libtool,
+# so we can't do make prefix=/tmp/ install.
+
+# In fact, do not take out the spaces between % and { , because RPM will gladly
+# do a substitution anyway.
 
 
-ln -s %{_prefix}/share/texmf/fonts/tfm/public/cm/ tfm
+./configure --disable-checking --disable-debugging --enable-printing --prefix=%{_prefix} --disable-optimise --enable-shared
+
+make all
 
 # urg
 # %build documentation
 # line 42: second %build
 # ok, now make sure that lilypond package will succeed,
 # even if documentation fails to build
 
 # urg
 # %build documentation
 # line 42: second %build
 # ok, now make sure that lilypond package will succeed,
 # even if documentation fails to build
+
 make -C Documentation  || true
 make htmldoc || true
 
 make -C Documentation  || true
 make htmldoc || true
 
@@ -90,23 +97,30 @@ fi
 
 %ifnos cygwin
 %{_prefix}/bin/abc2ly
 
 %ifnos cygwin
 %{_prefix}/bin/abc2ly
-%{_prefix}/bin/etf2ly
-%{_prefix}/bin/musedata2ly
-%{_prefix}/bin/pmx2ly
+%{_prefix}/bin/as2text
 %{_prefix}/bin/convert-mudela
 %{_prefix}/bin/convert-mudela
-%{_prefix}/bin/mudela-book
-%{_prefix}/bin/ly2dvi
+%{_prefix}/bin/etf2ly
 %{_prefix}/bin/lilypond
 %{_prefix}/bin/lilypond
+%{_prefix}/bin/ly2dvi
 %{_prefix}/bin/midi2ly
 %{_prefix}/bin/midi2ly
+%{_prefix}/bin/mudela-book
+%{_prefix}/bin/musedata2ly
+%{_prefix}/bin/pmx2ly
 %else
 %{_prefix}/bin
 %endif
 
 %else
 %{_prefix}/bin
 %endif
 
-%{_prefix}/man/man1/midi2ly.1
-%{_prefix}/man/man1/lilypond.1
-%{_prefix}/man/man1/mudela-book.1
-%{_prefix}/man/man1/ly2dvi.1
-%{_prefix}/man/man1/convert-mudela.1
+%{_prefix}/man/man1/abc2ly.1.gz
+%{_prefix}/man/man1/as2text.1.gz
+%{_prefix}/man/man1/convert-mudela.1.gz
+%{_prefix}/man/man1/etf2ly.1.gz
+%{_prefix}/man/man1/lilypond.1.gz
+%{_prefix}/man/man1/ly2dvi.1.gz
+%{_prefix}/man/man1/midi2ly.1.gz
+%{_prefix}/man/man1/mudela-book.1.gz
+%{_prefix}/man/man1/musedata2ly.1.gz
+%{_prefix}/man/man1/pmx2ly.1.gz
+
 %{_prefix}/share/lilypond/
 %{_prefix}/share/locale/*/LC_MESSAGES/lilypond.mo
 # urg?
 %{_prefix}/share/lilypond/
 %{_prefix}/share/locale/*/LC_MESSAGES/lilypond.mo
 # urg?
index f9f7f8f3312c8d9d959266114c86724549e18dc3..ab443a8d2bc2ae1cba13536f28546983da59eb05 100644 (file)
@@ -1,15 +1,15 @@
 Begin3
 Title: LilyPond
 Begin3
 Title: LilyPond
-Version: 1.3.91
-Entered-date: 28SEP00
+Version: 1.3.92
+Entered-date: 01OCT00
 Description: 
 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
 Description: 
 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.3.91.tar.gz 
+       1000k lilypond-1.3.92.tar.gz 
 Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
 Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
-       1000k lilypond-1.3.91.tar.gz 
+       1000k lilypond-1.3.92.tar.gz 
 Copying-policy: GPL
 End
 Copying-policy: GPL
 End
index 6595aa752d03cd283fa9da183e25f7deae7f010c..317cbcf18d60d76552989fe882ea8b5dd03ecc02 100644 (file)
@@ -1,9 +1,9 @@
 Name: lilypond
 Name: lilypond
-Version: 1.3.91
+Version: 1.3.92
 Release: 1
 Release: 1
-Copyright: GPL
+License: GPL
 Group: Applications/Publishing
 Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.91.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.92.tar.gz
 Summary: A program for printing sheet music.
 URL: http://www.cs.uu.nl/~hanwen/lilypond
 # Icon: lilypond-icon.gif
 Summary: A program for printing sheet music.
 URL: http://www.cs.uu.nl/~hanwen/lilypond
 # Icon: lilypond-icon.gif
@@ -29,17 +29,24 @@ The documentation of LilyPond, both in HTML and PostScript.
 
 %build
 
 
 %build
 
-%{configure} --disable-checking --disable-debugging --enable-printing --prefix=%{_prefix} --disable-optimise --enable-shared
+#
 
 
-make all
+# DO NOT use % { configure } , it hardcodes all paths, runs libtool,
+# so we can't do make prefix=/tmp/ install.
+
+# In fact, do not take out the spaces between % and { , because RPM will gladly
+# do a substitution anyway.
 
 
-ln -s %{_prefix}/share/texmf/fonts/tfm/public/cm/ tfm
+./configure --disable-checking --disable-debugging --enable-printing --prefix=%{_prefix} --disable-optimise --enable-shared
+
+make all
 
 # urg
 # %build documentation
 # line 42: second %build
 # ok, now make sure that lilypond package will succeed,
 # even if documentation fails to build
 
 # urg
 # %build documentation
 # line 42: second %build
 # ok, now make sure that lilypond package will succeed,
 # even if documentation fails to build
+
 make -C Documentation  || true
 make htmldoc || true
 
 make -C Documentation  || true
 make htmldoc || true
 
@@ -90,23 +97,30 @@ fi
 
 %ifnos cygwin
 %{_prefix}/bin/abc2ly
 
 %ifnos cygwin
 %{_prefix}/bin/abc2ly
-%{_prefix}/bin/etf2ly
-%{_prefix}/bin/musedata2ly
-%{_prefix}/bin/pmx2ly
+%{_prefix}/bin/as2text
 %{_prefix}/bin/convert-mudela
 %{_prefix}/bin/convert-mudela
-%{_prefix}/bin/mudela-book
-%{_prefix}/bin/ly2dvi
+%{_prefix}/bin/etf2ly
 %{_prefix}/bin/lilypond
 %{_prefix}/bin/lilypond
+%{_prefix}/bin/ly2dvi
 %{_prefix}/bin/midi2ly
 %{_prefix}/bin/midi2ly
+%{_prefix}/bin/mudela-book
+%{_prefix}/bin/musedata2ly
+%{_prefix}/bin/pmx2ly
 %else
 %{_prefix}/bin
 %endif
 
 %else
 %{_prefix}/bin
 %endif
 
-%{_prefix}/man/man1/midi2ly.1
-%{_prefix}/man/man1/lilypond.1
-%{_prefix}/man/man1/mudela-book.1
-%{_prefix}/man/man1/ly2dvi.1
-%{_prefix}/man/man1/convert-mudela.1
+%{_prefix}/man/man1/abc2ly.1.gz
+%{_prefix}/man/man1/as2text.1.gz
+%{_prefix}/man/man1/convert-mudela.1.gz
+%{_prefix}/man/man1/etf2ly.1.gz
+%{_prefix}/man/man1/lilypond.1.gz
+%{_prefix}/man/man1/ly2dvi.1.gz
+%{_prefix}/man/man1/midi2ly.1.gz
+%{_prefix}/man/man1/mudela-book.1.gz
+%{_prefix}/man/man1/musedata2ly.1.gz
+%{_prefix}/man/man1/pmx2ly.1.gz
+
 %{_prefix}/share/lilypond/
 %{_prefix}/share/locale/*/LC_MESSAGES/lilypond.mo
 # urg?
 %{_prefix}/share/lilypond/
 %{_prefix}/share/locale/*/LC_MESSAGES/lilypond.mo
 # urg?
index 389a87c28fc4f6d4e9f71ed9cbcd14a374922dca..59d033d477b14745cdac75e5bfb0e1e38e6fd4d6 100644 (file)
@@ -14,7 +14,7 @@ SUBDIRS = scripts buildscripts  flower lily mf midi2ly po debian \
 #
 
 SCRIPTS = configure aclocal.m4
 #
 
 SCRIPTS = configure aclocal.m4
-README_FILES =  DEDICATION COPYING NEWS TODO CHANGES ROADMAP
+README_FILES =  DEDICATION COPYING NEWS CHANGES ROADMAP
 README_TXT_FILES = AUTHORS.txt README.txt INSTALL.txt 
 IN_FILES := $(wildcard *.in)
 EXTRA_DIST_FILES = dstreamrc lilypond-mode.el vimrc VERSION $(README_FILES)  $(SCRIPTS) $(IN_FILES) 
 README_TXT_FILES = AUTHORS.txt README.txt INSTALL.txt 
 IN_FILES := $(wildcard *.in)
 EXTRA_DIST_FILES = dstreamrc lilypond-mode.el vimrc VERSION $(README_FILES)  $(SCRIPTS) $(IN_FILES) 
index 5a6f293e3367e9c4f921f53e8b8f091211125779..d585c5c702aa63559cac876f2221ece98a4b9317 100644 (file)
@@ -7,7 +7,6 @@ NAME = midi2ly
 MODULE_NAME = midi2ly
 
 SUBDIRS = include
 MODULE_NAME = midi2ly
 
 SUBDIRS = include
-EXTRA_DIST_FILES += TODO
 MODULE_LIBS=$(depth)/flower
 HELP2MAN_EXECS = midi2ly
 STEPMAKE_TEMPLATES=c++ executable po help2man
 MODULE_LIBS=$(depth)/flower
 HELP2MAN_EXECS = midi2ly
 STEPMAKE_TEMPLATES=c++ executable po help2man
diff --git a/midi2ly/TODO b/midi2ly/TODO
deleted file mode 100644 (file)
index 57f0488..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-# midi2ly/TODO
-
-Most of the items are marked in the code as well, with full explanation. 
-grep for TODO and ugh/ugr
-
-
-IMPORTANT
-
-       * if multiple channels per track: output each to separate voice
-
-       * get rid of (last few?) midi-specifics in mudela-*
-
-       * find / remove trend (tempo) of mudela columns
-
-       * get rid of Duration_* statics
-
-       * junk one in list vs. array
-
-       * add midi2ly example output (.midi.ly and .gif) to website
-
-       * important? lily is important, go work on lily!
-
-       * faq about midi2ly midi t1. ?
-
-PROJECTS
-
-       * write something interesting in midi2ly manual page
-
-       * check/use type 0 / 1 / 2 of midi file
-
-       * create Indentable_stream (see Tex_stream) as base for Lily_stream
-
-       * use dynamic info
-
-       * use aftertouch info (to guess slurs/ties, scripts (staccato?))
-
-       * lyric events
-
-       * parse all midi events
-
-       * handle time based midi files
-
-       * use dstream feature from lily
-
-       * midi esp.: use I32 iso int where 32 bits are needed (or assumed...)
-
-       * read unsigned words as U16 (not as I16)
-
-       * check use of integral and unsigned in lexer
-       
-       * get rid of ugly statics in Duration_convert
-
-       * change option double-dots to max-dots
-
-       * set Key, Meter, ... command line options
-
-BUGS
-
-       * output of 0 duration c'0
-
-       * array memleaks(?): use Link_array / create Pointer_array? 
-
-       * fix "#undef MEVENT_LIST" source tree: Array<Midi_event*> 
-
-       * split notes that cross bar limit
-
-FUTURE
-
-       * guess plets (i.e.: only use plet-duration *2/3 if there's a 
-         whole plet)
-
-       * merge midi-events with lily's midi-items?
-
-       * guess beams
-
-       * guess / follow tempo changes
-
-       * check out NIFF / analogies?
-
-       * steal good ideas of other gpl midi parsers
-
-       * lily: add mudela info into midi as specials
-         midi2ly: use special info
-
index 809e99cace03d8b1583c9603956461cf83ef68e3..816a4e5a448ca48f378234f58310da80bd02b85f 100644 (file)
@@ -1,7 +1,7 @@
 # bin/Makefile
 
 depth = ..
 # bin/Makefile
 
 depth = ..
-SEXECUTABLES=convert-mudela mudela-book ly2dvi abc2ly as2text
+SEXECUTABLES=convert-mudela mudela-book ly2dvi abc2ly as2text etf2ly musedata2ly pmx2ly
 STEPMAKE_TEMPLATES=script help2man
 HELP2MAN_EXECS = $(SEXECUTABLES)
 
 STEPMAKE_TEMPLATES=script help2man
 HELP2MAN_EXECS = $(SEXECUTABLES)
 
index 4d142ff7e557ce7d7aaa6d690a875c9fa442d538..d469cc1775c1d1c9e4ea0e5321ee9983d7944885 100644 (file)
@@ -355,14 +355,13 @@ class Measure:
        def calculate (self):
                fs = []
 
        def calculate (self):
                fs = []
 
-               
                if len (self.finale) < 2:
                        fs = self.finale[0]
                        fs = map (string.atoi, list (fs))
                        self.clef = fs[1]
                        self.frames = [fs[0]]
                else:
                if len (self.finale) < 2:
                        fs = self.finale[0]
                        fs = map (string.atoi, list (fs))
                        self.clef = fs[1]
                        self.frames = [fs[0]]
                else:
-                       fs = self.finale[0:2]
+                       fs = self.finale[0] + self.finale[1]
                        
                        fs = map (string.atoi, list (fs))
                        self.clef = fs[0]
                        
                        fs = map (string.atoi, list (fs))
                        self.clef = fs[0]