]> git.donarmstrong.com Git - lilypond.git/commitdiff
Merge branch 'lilypond/translation' into staging
authorFrancisco Vila <francisco.vila@hispalinux.es>
Mon, 26 Mar 2012 10:58:50 +0000 (12:58 +0200)
committerFrancisco Vila <francisco.vila@hispalinux.es>
Mon, 26 Mar 2012 10:58:50 +0000 (12:58 +0200)
50 files changed:
Documentation/contributor/administration.itexi
Documentation/contributor/build-notes.itexi
Documentation/included/authors.itexi
Documentation/included/compile.itexi
Documentation/notation/notation-appendices.itely
Documentation/notation/spacing.itely
Documentation/web/news-front.itexi
GNUmakefile.in
ROADMAP
VERSION
input/regression/accidental-broken-tie-spacing.ly
input/regression/autobeam-tuplet-recheck.ly [new file with mode: 0644]
input/regression/beam-shortened-lengths.ly
input/regression/collision-seconds.ly
input/regression/dot-column-engraver.ly [new file with mode: 0644]
input/regression/event-listener-output.ly
input/regression/graphviz.ly
input/regression/lilypond-book/include/example.ly [new file with mode: 0644]
input/regression/lilypond-book/include/myvar.ily [new file with mode: 0644]
input/regression/lilypond-book/tex-include-file.lytex
input/regression/lilypond-book/tex-include-options.lytex
input/regression/lilypond-book/texinfo-include-file.tely [new file with mode: 0644]
input/regression/lyrics-spanbar.ly [new file with mode: 0644]
input/regression/tuplet-number-slur-script.ly [new file with mode: 0644]
lily/beaming-pattern.cc
lily/grob-property.cc
lily/include/stem.hh
lily/item.cc
lily/note-collision.cc
lily/pure-from-neighbor-engraver.cc
lily/stem.cc
lily/tuplet-bracket.cc
ly/articulate.ly
ly/engraver-init.ly
ly/event-listener.ly
ly/graphviz-init.ly
ly/init.ly
make/midi-rules.make
scm/define-grobs.scm
scm/graphviz.scm
scm/lily.scm
scm/music-functions.scm
scm/output-lib.scm
scm/paper.scm
scripts/build/bib2texi.py
scripts/build/genicon.py
scripts/build/mf-to-table.py
scripts/build/mf2pt1.pl
scripts/lilypond-book.py
stepmake/aclocal.m4

index 5e664cb433bd1c0c113d840d3e05ecb605cbd705..a9b32decab0bcbb220e902a0e8fc6f1fbe0e5622 100644 (file)
@@ -116,7 +116,7 @@ they've had some initial review on the Frog list, pesters the
 @w{@code{-devel}} community into actually reviewing said patches, and
 finally pushes the patches once they're accepted.  This person is
 @emph{not} responsible for training new programmers, because that
-would be far too much work -- he job is @qq{only} to guide
+would be far too much work -- his/her job is @qq{only} to guide
 completed patches through our process.
 
 Currently: Carl
@@ -150,11 +150,11 @@ changes to the regtests.
 
 @subheading Installing patchy
 
-To install patchy, you should run do the following:
+To install patchy, you should do the following:
 
 @enumerate
 @item
-Create a new user on your box to to run patchy; this is a security
+Create a new user on your box to run patchy; this is a security
 step for your own protection.  It is recommended that this should
 not be an administrator.  New users are created from System;
 Administration; Users and Groups.
@@ -214,7 +214,7 @@ python lilypond-patchy-staging.py
 @end example
 Not much appears to happen except you can see a lot of CPU gets
 used if you open System Monitor. There's not much point running
-@code{lilypond-patchy-staging.py} unless there something in
+@code{lilypond-patchy-staging.py} unless there is something in
 staging to be merged to master, however, if there's nothing in
 staging then the script won't waste resources by compiling
 anything.
@@ -241,7 +241,7 @@ pushing to staging (see @ref{Pushing to staging}).
 @node Administrative mailing list
 @section Administrative mailing list
 
-An mailing list for administrative issues is maintained at
+A mailing list for administrative issues is maintained at
 @code{lilypond-hackers@@gnu.org}.
 
 This list is intended to be used for discussions that should be kept
@@ -265,7 +265,7 @@ GOP has two goals:
 
 @itemize
 @item
-Clarify the various development tasks by writing down the polices
+Clarify the various development tasks by writing down the policies
 and techniques and/or simplifying the tasks directly.
 
 @item
@@ -331,7 +331,7 @@ work on the really hard stuff... like rewriting the grace note
 code.
 
 Having 1 more normal user answering emails on lilypond-user won't
-have a dramatic trick-up affect all by himself, of course. But if
+have a dramatic @q{trickle-up} effect all by itself, of course. But if
 we had 8 users volunteering to answer emails, 6 users starting to
 write documentation, and 2 users editing LSR... well, that would
 free up a lot of current bug-fixing-capable contributors to focus
@@ -344,7 +344,7 @@ many new helpers will provide a great moral boost!
 
 Although GOP is a short-term project, the main goal is to train
 more people to handle ongoing jobs. The more people doing these
-jobs, the ligher the work will be, and the more we can get done
+jobs, the lighter the work will be, and the more we can get done
 with lilypond!
 
 Also, it would be nice if we had at least one "replacement" /
index bf779982290e370c48f89f3c5ecb92731b12ef02..a1e258cc91a369eb8b65d06c70a8e2efe411f3d6 100644 (file)
@@ -117,9 +117,11 @@ include $(configure-srcdir)/GNUmakefile.in
 
 The variable @code{depth} is used throughout the make system to
 track how far down the directory structure the make is.  The first
-include sets lots of variables but doesn't "do" anything.  The
-second runs the file @file{GNUmakefile.in} from the top level
-source directory.
+include sets lots of variables but doesn't "do" anything.  Default
+values for these variables are automatically detected at the
+./configure step, which creates the file @file{config.make}.
+The second include runs the file @file{GNUmakefile.in} from
+the top level source directory.
 
 This sets another load of variables, and then includes (i.e.
 immediately runs) @file{stepmake.make} from the @file{make}
@@ -957,6 +959,7 @@ described to some extent at
 
 The file @file{lily-bib.bst} also has fairly extensive commenting.
 
+
 @node Website build
 @section Website build
 
index 041f843900dc7c9fd2f25b64e5ae975323b33693..e2ab80640e3d81119e65ec9ec397868675e75b3b 100644 (file)
@@ -164,15 +164,20 @@ Core developer, Schemer extraordinaire
 
 @c use commas not colons
 
+Aleksandr Andreev,
 Sven Axelsson,
+Peter Chubb,
 Karin Hoethker,
 Mark Hohl,
 Justin Ohmie,
+Benkő Pál,
 Julien Rioux,
 Patrick Schmidt,
 Adam Spiers,
 Heikki Taurainen,
-Piers Titus van der Torren
+Piers Titus van der Torren,
+Jan-Peter Voigt,
+Janek Warchol
 
 @c no comma for last entry
 
@@ -207,9 +212,11 @@ Stefan Weil
 @macro bugsquadCurrent
 
 Colin Campbell,
+Eluze,
 Phil Holmes,
-Derek Klinge,
-Dmytro O. Redchuk
+Marek Klein,
+Ralph Palmer,
+James Lowe
 
 @c no comma for last entry
 
@@ -234,6 +241,7 @@ Phil Holmes
 
 @c use commas not colons
 
+Jean-Charles Malahieude,
 Till Paala,
 Yoshiki Sawada
 
@@ -382,9 +390,11 @@ Rune Zedeler
 
 @c use commas not colons
 James E. Bailey,
+Derek Klinge,
 Urs Liska,
 Kieren MacMillan,
-Ralph Palmer
+Ralph Palmer,
+Dmytro O. Redchuk
 
 @c no comma for last entry
 @end macro
index f4ed097da593411c2e20e41b1193735345a83616..c3aa45de1cffeaaae70ba9c589b04c9e68eec87c 100644 (file)
@@ -605,7 +605,6 @@ Edit/compile cycle:
 make [-j@var{X}]                  @emph{## needed if editing outside}
                             @emph{##   Documentation/, but useful anyway}
                             @emph{##   for finding Texinfo errors.}
-touch Documentation/*te??   @emph{## bug workaround}
 make [-j@var{X} CPU_COUNT=@var{X}] doc  @emph{## usually faster than initial build.}
 @end example
 
@@ -655,6 +654,17 @@ on their own with:
 make LANGS='' doc
 @end example
 
+@noindent Similarly, it is possible to compile a subset of the
+translated documentation by specifying their language codes on the
+command line.  For example, the French and German translations are
+compiled with:
+
+@example
+make LANGS='de fr' doc
+@end example
+
+@noindent Note that this will also compile the English version.
+
 Compilation of documentation in Info format with images can be
 done separately by issuing:
 
@@ -705,6 +715,18 @@ However, this will rebuild all of the manuals
 indiscriminately---it is more efficient to @command{touch} only
 the affected files.
 
+@noindent
+Another typical issue when switching branches between master and
+lilypond/translation is the appearance/disappearance of translated
+versions of some manuals.  If you see such a warning from make:
+
+@example
+No rule to make target `X', needed by `Y'
+@end example
+
+@noindent
+Your best bet is to delete the file Y.dep and to try again.
+
 @node Building a single document
 @unnumberedsubsubsec Building a single document
 It's possible to build a single document.  For example, to rebuild
index 1c00f6fb5bd8f4f12769fda7ad04f5b23fd5d55a..30756c9d2fc00e682e4b0047b7e534fd04aae366 100644 (file)
@@ -18,6 +18,7 @@
 * Common chord modifiers::
 * Predefined string tunings::
 * Predefined fretboard diagrams::
+* Predefined paper sizes::
 * MIDI instruments::
 * List of colors::
 * The Feta font::
@@ -441,6 +442,259 @@ The chart below shows the predefined fretboard diagrams for mandolin.
 
 @lilypondfile{display-predefined-mandolin-fretboards.ly}
 
+
+@node Predefined paper sizes
+@appendixsec Predefined paper sizes
+
+Paper sizes are defined in @file{scm/paper.scm}
+
+@noindent
+@strong{The @qq{ISO 216} A Series}
+@table @code
+@item "a10"
+(26 x 37 mm)
+@item "a9"
+(37 x 52 mm)
+@item "a8"
+(52 x 74 mm)
+@item "a7"
+(74 x 105 mm)
+@item "a6"
+(105 x 148 mm)
+@item "a5"
+(148 x 210 mm)
+@item "a4"
+(210 x 297 mm)
+@item "a3"
+(297 x 420 mm)
+@item "a2"
+(420 x 594 mm)
+@item "a1"
+(594 x 841 mm)
+@item "a0"
+(841 x 1189 mm)
+@end table
+
+@noindent
+@strong{The @qq{ISO 216} B Series}
+@table @code
+@item "b10"
+(31 x 44 mm)
+@item "b9"
+(44 x 62 mm)
+@item "b8"
+(62 x 88 mm)
+@item "b7"
+(88 x 125 mm)
+@item "b6"
+(125 x 176 mm)
+@item "b5"
+(176 x 250 mm)
+@item "b4"
+(250 x 353 mm)
+@item "b3"
+(353 x 500 mm)
+@item "b2"
+(500 x 707 mm)
+@item "b1"
+(707 x 1000 mm)
+@item "b0"
+(1000 x 1414 mm)
+@end table
+
+@noindent
+@strong{Two extended sizes as defined in @qq{DIN 476}}
+@table @code
+@item "4a0"
+(1682 x 2378 mm)
+@item "2a0"
+(1189 x 1682 mm)
+@end table
+
+@noindent
+@strong{@qq{ISO 269} standard C series}
+@table @code
+@item "c10"
+(28 x 40 mm)
+@item "c9"
+(40 x 57 mm)
+@item "c8"
+(57 x 81 mm)
+@item "c7"
+(81 x 114 mm)
+@item "c6"
+(114 x 162 mm)
+@item "c5"
+(162 x 229 mm)
+@item "c4"
+(229 x 324 mm)
+@item "c3"
+(324 x 458 mm)
+@item "c2"
+(458 x 648 mm)
+@item "c1"
+(648 x 917 mm)
+@item "c0"
+(917 x 1297 mm)
+@end table
+
+@noindent
+@strong{North American paper sizes}
+@table @code
+@item "junior-legal"
+(8.0 x 5.0 in)
+@item "legal"
+(8.5 x 14.0 in)
+@item "ledger"
+(17.0 x 11.0 in)
+@item "letter"
+(8.5 x 11.0 in)
+@item "tabloid"
+(11.0 x 17.0 in)
+@item "11x17"
+(11.0 x 17.0 in)
+@item "17x11"
+(17.0 x 11.0 in)
+@end table
+
+@noindent
+@strong{Government-letter by IEEE Printer Working Group, for children's
+writing}
+@table @code
+@item "government-letter"
+(8 x 10.5 in)
+@item "government-legal"
+(8.5 x 13.0 in)
+@item "philippine-legal"
+(8.5 x 13.0 in)
+@end table
+
+@noindent
+@strong{ANSI sizes}
+@table @code
+@item "ansi a"
+(8.5 x 11.0 in)
+@item "ansi b"
+(17.0 x 11.0 in)
+@item "ansi c"
+(17.0 x 22.0 in)
+@item "ansi d"
+(22.0 x 34.0 in)
+@item "ansi e"
+(34.0 x 44.0 in)
+@item "engineering f"
+(28.0 x 40.0 in)
+@end table
+
+@noindent
+@strong{North American Architectural sizes}
+@table @code
+@item "arch a"
+(9.0 x 12.0 in)
+@item "arch b"
+(12.0 x 18.0 in)
+@item "arch c"
+(18.0 x 24.0 in)
+@item "arch d"
+(24.0 x 36.0 in)
+@item "arch e"
+(36.0 x 48.0 in)
+@item "arch e1"
+(30.0 x 42.0 in)
+@end table
+
+@noindent
+@strong{Antique sizes still used in the United Kingdom}
+@table @code
+@item "statement"
+(5.5 x 8.5 in)
+@item "half letter"
+(5.5 x 8.5 in)
+@item "quarto"
+(8.0 x 10.0 in)
+@item "octavo"
+(6.75 x 10.5 in)
+@item "executive"
+(7.25 x 10.5 in)
+@item "monarch"
+(7.25 x 10.5 in)
+@item "foolscap"
+(8.27 x 13.0 in)
+@item "folio"
+(8.27 x 13.0 in)
+@item "super-b"
+(13.0 x 19.0 in)
+@item "post"
+(15.5 x 19.5 in)
+@item "crown"
+(15.0 x 20.0 in)
+@item "large post"
+(16.5 x 21.0 in)
+@item "demy"
+(17.5 x 22.5 in)
+@item "medium"
+(18.0 x 23.0 in)
+@item "broadsheet"
+(18.0 x 24.0 in)
+@item "royal"
+(20.0 x 25.0 in)
+@item "elephant"
+(23.0 x 28.0 in)
+@item "double demy"
+(22.5 x 35.0 in)
+@item "quad demy"
+(35.0 x 45.0 in)
+@item "atlas"
+(26.0 x 34.0 in)
+@item "imperial"
+(22.0 x 30.0 in)
+@item "antiquarian"
+(31.0 x 53.0 in)
+@end table
+
+@noindent
+@strong{PA4 based sizes}
+@table @code
+@item "pa0"
+(840 x 1120 mm)
+@item "pa1"
+(560 x 840 mm)
+@item "pa2"
+(420 x 560 mm)
+@item "pa3"
+(280 x 420 mm)
+@item "pa4"
+(210 x 280 mm)
+@item "pa5"
+(140 x 210 mm)
+@item "pa6"
+(105 x 140 mm)
+@item "pa7"
+(70 x 105 mm)
+@item "pa8"
+(52 x 70 mm)
+@item "pa9"
+(35 x 52 mm)
+@item "pa10"
+(26 x 35 mm)
+@end table
+
+@noindent
+@strong{Used in Southeast Asia and Australia}
+@table @code
+@item "f4"
+(210 x 330 mm)
+@end table
+
+@noindent
+@strong{Used for very small @code{@@lilypond} examples in the
+documentation based on a8 landscape.}
+@table @code
+@item "a8landscape"
+(74 x 52 mm)
+@end table
+
+
 @node MIDI instruments
 @appendixsec MIDI instruments
 
index 64af60f58eef0a2f525a195300b8e7b7416c4beb..68208d201092204f0a9173f20d3467816fcdea77 100644 (file)
@@ -191,71 +191,81 @@ Installed Files:
 @funindex \paper
 
 @menu
-* Setting paper size::
+* Setting the paper size::
 * Automatic scaling to paper size::
 @end menu
 
 
-@node Setting paper size
-@unnumberedsubsubsec Setting paper size
+@node Setting the paper size
+@unnumberedsubsubsec Setting the paper size
 
-Two functions are available for changing the paper size:
-@code{set-default-paper-size} and @code{set-paper-size}.
-@code{set-default-paper-size} must be placed in the toplevel
-scope, and @code{set-paper-size} must be placed in a @code{\paper}
-block:
+@q{A4} is the default value when no explicit paper size is set. However,
+there are two functions that can be used to change it
+@code{set-default-paper-size},
 
 @example
-#(set-default-paper-size "a4")
+#(set-default-paper-size "quarto")
 @end example
 
+which must always be placed at the toplevel scope. and
+@code{set-paper-size},
+
 @example
 \paper @{
-  #(set-paper-size "a4")
+  #(set-paper-size "tabloid")
 @}
 @end example
 
-@noindent
-In the toplevel scope, the @code{set-default-paper-size} function
-can safely be called anywhere before the first @code{\paper}
-block.  Within a @code{\paper} block, the safest place to call
-@code{set-paper-size} is at the top, above the list of variable
-declarations.  The reasons for this are discussed in
-@ref{Automatic scaling to paper size}.
+which must always be placed in a @code{\paper} block.
 
-@code{set-default-paper-size} sets the size of all pages, whereas
-@code{set-paper-size} only sets the size of the pages that the
-@code{\paper} block applies to.  For example, if the @code{\paper}
-block is at the top of the file, then it will apply the paper size
-to all pages.  If the @code{\paper} block is inside a
+If the @code{set-default-paper-size} function is used in the toplevel
+scope, it must come before the any @code{\paper} block.
+@code{set-default-paper-size} sets the paper size for all pages,
+whereas @code{set-paper-size} only sets the paper size for the pages
+that the @code{\paper} block applies to.  For example, if the
+@code{\paper} block is at the top of the file, then it will apply the
+paper size to all pages.  If the @code{\paper} block is inside a
 @code{\book}, then the paper size will only apply to that book.
 
-Common paper sizes are available, including @code{a4},
-@code{letter}, @code{legal}, and @code{11x17} (also known as
-tabloid).  Many more paper sizes are supported by default.  For
-details, see @file{scm/paper.scm}, and search for the
-definition of @code{paper-alist}.
+When the @code{set-paper-size} function is used, it must be
+placed @emph{before} any other functions used within the same
+@code{\paper} block.  See @ref{Automatic scaling to paper size}.
 
-@c TODO add a new appendix for paper sizes (auto-generated) -pm
+Paper sizes are defined in @file{scm/paper.scm}, and while it is
+possible to add custom sizes, they will be overwritten on subsequent
+software updates.
 
-@warning{The default paper size is @code{a4}.}
+@c An appendix entry exists for paper sizes but is not auto-generated
 
-Extra sizes may be added by editing the definition of
-@code{paper-alist} in the initialization file
-@file{scm/paper.scm}, however they will be overridden on a
-subsequent install.
+The following command can be used in the file to add a custom paper size
+which can then be used with @code{set-default-paper-size} or
+@code{set-paper-size} as appropriate,
 
-@cindex orientation
-@cindex landscape
+@example
+#(set! paper-alist (cons '("my size" . (cons (* 15 in) (* 3 in))) paper-alist))
 
-If the symbol @code{'landscape} is supplied as an argument to
-@code{set-default-paper-size}, pages will be rotated by 90
-degrees, and wider line widths will be set accordingly.
+\paper @{
+  #(set-paper-size "my size")
+@}
+@end example
+
+The units @code{in} (inches), @code{cm} (centimeters) and @code{mm}
+(millimeters) can all be used.
+
+@cindex paper size, orientation
+@cindex page, orientation
+@cindex paper size, landscape
+
+If the symbol @code{'landscape} is added to the paper size function,
+pages will be rotated by 90 degrees, and wider line widths will be set
+accordingly.
 
 @example
 #(set-default-paper-size "a6" 'landscape)
 @end example
 
+The music output will @emph{not} be rotated, just the paper size.
+
 @seealso
 Notation Reference:
 @ref{Automatic scaling to paper size}.
@@ -277,7 +287,7 @@ that the automatic scaling is not triggered by setting the
 @code{paper-width} can influence other values (this is separate
 from scaling and is discussed below).  The
 @code{set-default-paper-size} and @code{set-paper-size} functions
-are described in @ref{Setting paper size}.
+are described in @ref{Setting the paper size}.
 
 The vertical dimensions affected by automatic scaling are
 @code{top-margin} and @code{bottom-margin} (see
index fe047a5df59964cbf5827842eea52b58f90dbd8e..ed54e0c5d1faa8a660e59f1346ac36c7f245902b 100644 (file)
@@ -9,6 +9,20 @@
 @c used for news about the upcoming release; see CG 10.2
 
 
+@newsItem
+@subsubheading LilyPond 2.15.34 released!  @emph{Mar 19, 2012}
+
+We are happy to announce the release of LilyPond 2.15.34.  This
+release contains the usual number of bugfixes.
+
+It is strongly recommended that normal users do @strong{not} use
+this release, and instead use the stable 2.14 version.  Please
+note that due to a few Critical bugs, this is not the next release
+candidate.
+
+@newsEnd
+
+
 @newsItem
 @subsubheading LilyPond 2.15.33 released!  @emph{Mar 08, 2012}
 
index 0ad3c6e30b409ecd6647e2ff91392399cf196d39..8cce2c8f72171d4dbc3221777e58b6e36e49afb9 100644 (file)
@@ -284,9 +284,32 @@ test:
        $(MAKE) -C input/regression/abc2ly out=test local-test
        $(MAKE) -C input/regression/lilypond-book out=test local-test
 
-test-baseline:
+ifndef BASELINE_COMMIT
+BASELINE_COMMIT:=HEAD
+endif
+
+ifdef LILYPOND_BASELINES
+BASELINE_ARCHIVE:=$(LILYPOND_BASELINES)/baseline-$(shell git rev-list -1 $(BASELINE_COMMIT)).tar.gz
+
+test-baseline: $(BASELINE_ARCHIVE)
+       tar xzf $(BASELINE_ARCHIVE)
+       $(MAKE) test-snippets-clean
+
+$(BASELINE_ARCHIVE):
+       $(MAKE) test-baseline-create
+       tar czf $(BASELINE_ARCHIVE) input/regression/out-test-baseline \
+               input/regression/midi/out-test-baseline \
+               input/regression/musicxml/out-test-baseline \
+               input/regression/abc2ly/out-test-baseline \
+               input/regression/lilypond-book/out-test-baseline
+else
+test-baseline: test-baseline-create
+       $(MAKE) test-snippets-clean
+endif
+
+test-baseline-create:
        @if test -d .git ; then \
-               $(if $(shell git diff), echo "commit before base lining" && false,true) ; \
+               $(if $(shell git diff $(BASELINE_COMMIT)), echo "commit before base lining" && false,true) ; \
        fi
        $(MAKE)
        $(MAKE) test
@@ -295,13 +318,11 @@ test-baseline:
        $(MAKE) out=test -C input/regression/musicxml local-test-baseline
        $(MAKE) out=test -C input/regression/abc2ly local-test-baseline
        $(MAKE) out=test -C input/regression/lilypond-book local-test-baseline
-       $(MAKE) test-snippets-clean
-
 
 local-check: test
        rm -rf $(RESULT_DIR)
        mkdir -p $(RESULT_DIR)
-       $(buildscript-dir)/output-distance --create-images --output-dir $(RESULT_DIR) \
+       $(buildscript-dir)/output-distance --local-datadir --create-images --output-dir $(RESULT_DIR) \
                input/regression/out-test-baseline input/regression/out-test \
                input/regression/midi/out-test-baseline input/regression/midi/out-test 
        @find input ly -name '*.ly' -print |grep -v 'out.*/' | xargs grep '\\version' -L | grep -v "standard input" |sed 's/^/**** Missing version: /g'
diff --git a/ROADMAP b/ROADMAP
index 8b66091810a62b4c49cdc1ce0cfbeff5e877be81..99ad6b7fb6afe707b9079195a50a8a4f1fbc0f0a 100644 (file)
--- a/ROADMAP
+++ b/ROADMAP
@@ -26,7 +26,6 @@ LilyPond's source files.
 |   |-- notation/        Notation Reference
 |   |-- usage/           Usage
 |   |-- web/             The website
-|   |   `-- ly-examples/ .ly files for the "Examples" page
 |   |
 |   |
 |   |   TRANSLATED MANUALS:
@@ -36,6 +35,7 @@ LilyPond's source files.
 |   |          * individual chapters for each manual
 |   |       2) a texidocs/ directory for snippet translations
 |   |
+|   |-- cs/              Czech
 |   |-- de/              German
 |   |-- es/              Spanish
 |   |-- fr/              French
@@ -43,6 +43,7 @@ LilyPond's source files.
 |   |-- it/              Italian
 |   |-- ja/              Japanese
 |   |-- nl/              Dutch
+|   |-- zh/              Chinese
 |   |
 |   |
 |   |   MISCELLANEOUS DOC STUFF:
@@ -50,6 +51,7 @@ LilyPond's source files.
 |   |-- css/             CSS files for HTML docs
 |   |-- included/        .ly files used in the manuals
 |   |-- logo/            Web logo and "note" icon
+|   |-- ly-examples/     .ly files for the "Examples" webpage
 |   |-- misc/            Old announcements, ChangeLogs and NEWS
 |   |-- pictures/        Images used (eps/jpg/png/svg)
 |   |   `-- pdf/         (pdf)
@@ -95,6 +97,8 @@ LilyPond's source files.
 |-- input/
 |   `-- regression/      .ly regression tests
 |       |-- abc2ly/      .abc regression tests
+|       |-- lilypond-book/  lilypond-book regression tests
+|       |-- midi/        midi2ly regression tests
 |       `-- musicxml/    .xml and .itexi regression tests
 |
 |
diff --git a/VERSION b/VERSION
index 84d4cc3a272a72bc81f114e7a6859ae2f37d3c82..5644dcd169f43af477b8ce556cdca89972319e20 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1,7 +1,7 @@
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=2
 MINOR_VERSION=15
-PATCH_LEVEL=34
+PATCH_LEVEL=35
 MY_PATCH_LEVEL=
 VERSION_STABLE=2.14.2
-VERSION_DEVEL=2.15.33
+VERSION_DEVEL=2.15.34
index b9eccd8ced4bbb2374869848c5de4dbd6ac18780..2284562fa3277b4ebd48c60fad61dd3476955092 100644 (file)
@@ -1,11 +1,15 @@
 \version "2.14.0"
+\paper { ragged-right = ##t }
 
 \header {
   texidoc = "When a tie is broken, the spacing engine must consider the
-accidental after the line break, to prevent a collision from occurring."
+accidental after the line break.  The second and third lines should have
+the same note spacing."
 }
 
-{ \key g \major gis''1~ \break gis''4
-\repeat unfold 43 {d4 \noBreak} }
+{ \key bes \major r1 \break
+  eses''4 r2 eses''4~ \break
+  eses''4 r2 f''4
+}
 
 
diff --git a/input/regression/autobeam-tuplet-recheck.ly b/input/regression/autobeam-tuplet-recheck.ly
new file mode 100644 (file)
index 0000000..024d467
--- /dev/null
@@ -0,0 +1,16 @@
+\version "2.15.34"
+
+\header {
+
+  texidoc = "Autobeam rechecking works properly with tuplets.
+In the example, the first beat should be beamed completely together."
+
+}
+
+\relative c' {
+  \time 2/4
+  c16 c
+  \times 2/3 { c8 c16 }
+  \times 2/3 { c8 c16 }
+  c16 c
+}
index a79917d3231f6a11460085c498dc19e8269b4ec7..24cee7905fb04763768743d763d621af84c40c99 100644 (file)
@@ -1,4 +1,3 @@
-
 \version "2.14.0"
 
 \header{
@@ -8,8 +7,6 @@
 
 
 \relative c'{
-  \override Beam #'skip-quanting = ##t
   \stemUp
   f'4  f8[ f]  f16[ f]  f32[ f]  f64[ f]  f128[ f] 
 }
-
index 70b0e052e046330b18097dd294d8f0ae4bb2a075..ea9a72735508fc9bf701ee0c52af4fa71e8844b3 100644 (file)
@@ -1,10 +1,16 @@
-\version "2.14.0"
+\version "2.13.34"
 
 \header {
-  texidoc = "Seconds do not confuse the collision algorithm too much. The best
-way to format this would be to merge the two Ds, but we will be happy for now
-if the upstem D does not collide with the downstem C."
+  texidoc = "Seconds do not confuse the collision algorithm.
+The first pair of chords in each measure should merge, mesh,
+or come relatively close, but the second in each measure needs
+more space to make clear which notes belong to which voice."
 }
 
-
-<< d' \\ <c' d'> >>
+\relative f << {
+  <a' b>2 <a b d e> <a e' f> <a e' f> <a b c> <f g a>
+  \bar "||" <f g c> <g a c> <f g c d> <f g c d>
+} \\ {
+  <g a> <a b> <g a e'> <g a c e> <f g a> <a b c>
+  <g a e'> <g a e'> <g c d> <g a b>
+} >>
diff --git a/input/regression/dot-column-engraver.ly b/input/regression/dot-column-engraver.ly
new file mode 100644 (file)
index 0000000..8ea30b9
--- /dev/null
@@ -0,0 +1,22 @@
+\version "2.15.34"
+
+\header {
+  texidoc = "Dot Columns are engraved in the Staff by default,
+enabling dots to move vertically to make room for dots from another voice.
+If Dot_column_engraver is moved to Voice, separate dot columns are engraved,
+and these dots avoid notes in other voices."
+}
+
+music = \relative c'' { \time 3/4 << {
+  <d f g>4. c c b g f a <a b> a <a' b>
+} \\ \times 1/2 {
+  <f, g b>2. a-- <a b> <g a>-. a2. a-- a a b <a b> \bar "|."
+} >> }
+
+\score{ \music }
+\markup "move Dot_column_engraver to Voice :"
+\score{ \music
+\layout {
+  \context {\Staff \remove Dot_column_engraver}
+  \context {\Voice \consists Dot_column_engraver}
+}}
index 38c096093605cd4bf9ac0d97b6f809158211b5b9..b49524fa794a59ced9a685a12b1e1d11bb9f1f71 100644 (file)
@@ -38,7 +38,7 @@ vlnone = \new Staff {
   a4\f d fis8-. a-. r4
   d16(\downbow cis b a) g4 \breathe e8\p( g) fis4 |
 
-  e4\< g8 fis g4-_\mp\>
+  e4\< \glissando g8 fis g4-_\mp\>
     \st "III"
     b8-_\startTextSpan a-_\stopTextSpan
     b4\p\<( d8 cis) d4(-. fis8-.^"II" e-.^"II")
index 710752d78ddd54105735bd070fbf43c485e2890e..f1fbcab90b5951d09fad310d7102ee6ad7ef1a1e 100644 (file)
@@ -9,9 +9,6 @@
 #(whitelist-grob 'NoteHead)
 #(whitelist-grob 'Stem)
 #(whitelist-grob 'Flag)
-#(whitelist-grob "NoteHead")
-#(whitelist-grob "Stem")
-#(whitelist-grob "Flag")
 
 #(for-each whitelist-symbol '(stencil style duration-log
                              stem-attachment end-position staff-position
diff --git a/input/regression/lilypond-book/include/example.ly b/input/regression/lilypond-book/include/example.ly
new file mode 100644 (file)
index 0000000..ccb2f8d
--- /dev/null
@@ -0,0 +1,4 @@
+\version "2.14.0"
+\score {
+  \relative c'' { d c b c }
+}
diff --git a/input/regression/lilypond-book/include/myvar.ily b/input/regression/lilypond-book/include/myvar.ily
new file mode 100644 (file)
index 0000000..48c9439
--- /dev/null
@@ -0,0 +1 @@
+myVar = { a b c a }
index 1045df472972769ddb09fd302c91352451b0ac87..bcad93601b0e8f39325bb93f6f03cb61dfd5a399 100644 (file)
@@ -1,5 +1,17 @@
 \documentclass{article}
 \begin{document}
 Including a LilyPond file without any options:
+
 \lilypondfile{include2.ly}
+
+From a subdirectory:
+
+\lilypondfile{include/example.ly}
+
+Within a lilypond block:
+
+\begin{lilypond}
+  \include "include/myvar.ily"
+  \relative c'' { \myVar }
+\end{lilypond}
 \end{document}
index 99934bf049567a4adb88854b47868e45c813f6d7..251fa087d80ebe334ec150d2cce2011e58da4a7d 100644 (file)
@@ -1,5 +1,17 @@
 \documentclass{article}
 \begin{document}
 Including a LilyPond file with options (quote and noindent):
+
 \lilypondfile[quote,noindent]{include2.ly}
+
+From a subdirectory:
+
+\lilypondfile[quote,noindent]{include/example.ly}
+
+Within a lilypond block:
+
+\begin{lilypond}[quote,noindent]
+  \include "include/myvar.ily"
+  \relative c'' { \myVar }
+\end{lilypond}
 \end{document}
diff --git a/input/regression/lilypond-book/texinfo-include-file.tely b/input/regression/lilypond-book/texinfo-include-file.tely
new file mode 100644 (file)
index 0000000..610eb23
--- /dev/null
@@ -0,0 +1,23 @@
+\input texinfo @c -*- coding: utf-8; mode: texinfo; -*-
+@setfilename texinfo-include-file.info
+@settitle Include lilypond files in texinfo
+
+@node Top
+@top Include lilypond files in texinfo
+
+Lilypond files included in texinfo without any options:
+
+@lilypondfile{include2.ly}
+
+From a subdirectory:
+
+@lilypondfile{include/example.ly}
+
+Within a lilypond block:
+
+@lilypond
+  \include "include/myvar.ily"
+  \relative c'' { \myVar }
+@end lilypond
+
+@bye
diff --git a/input/regression/lyrics-spanbar.ly b/input/regression/lyrics-spanbar.ly
new file mode 100644 (file)
index 0000000..d8cf300
--- /dev/null
@@ -0,0 +1,18 @@
+\version "2.15.35"
+
+\header {
+  texidoc = "Empty measures do not confuse @code{SpanBarStub}.
+These lyrics should remain clear of the span bars.
+"
+}
+
+\new StaffGroup <<
+  \new Staff { \repeat unfold 8 { R1 e'1 } }
+  \addlyrics {
+    Worked twice...
+    and then
+    I continued...
+    working... correctly.
+  }
+  \new Staff { R1*16 }
+>>
diff --git a/input/regression/tuplet-number-slur-script.ly b/input/regression/tuplet-number-slur-script.ly
new file mode 100644 (file)
index 0000000..6ccab60
--- /dev/null
@@ -0,0 +1,14 @@
+\version "2.15.35"
+
+\header {
+  texidoc = "Tuplet number position is correct when slurs and scripts
+are present.
+"
+}
+
+\relative c'
+{
+  R1 |
+  \break
+  \times 2/3 { e8(-> e e) }
+}
index f1408497cd3f0dafc5794faf8b838904caf38571..8f27c23ef57955f027151c4fd8e8b3d93a8fc9bc 100644 (file)
@@ -43,7 +43,7 @@ Beam_rhythmic_element::Beam_rhythmic_element ()
   tuplet_start_ = false;
 }
 
-Beam_rhythmic_element::Beam_rhythmic_element (Moment m, int i, bool inv, 
+Beam_rhythmic_element::Beam_rhythmic_element (Moment m, int i, bool inv,
   Rational factor, bool tuplet_start)
 {
   start_moment_ = m;
@@ -352,11 +352,12 @@ Beaming_pattern::start_moment (int i) const
 Moment
 Beaming_pattern::end_moment (int i) const
 {
-  Duration *dur = new Duration (2 + max (beamlet_count (i, LEFT),
-                                         beamlet_count (i, RIGHT)),
-                                0);
+  Duration dur (2 + max (beamlet_count (i, LEFT),
+                         beamlet_count (i, RIGHT)),
+                0);
 
-  return infos_.at (i).start_moment_ + dur->get_length ();
+  return infos_.at (i).start_moment_
+    + infos_.at(i).factor_ * dur.get_length ();
 }
 
 bool
index 153627274d03e274abe1cdf0dc8ce00808e51a84..22c5fe2e7198e644d9001d8144587043671dbcbc 100644 (file)
@@ -36,8 +36,8 @@ print_property_callback_stack ()
 }
 #endif
 
-static SCM modification_callback = SCM_EOL;
-static SCM cache_callback = SCM_EOL;
+static Protected_scm modification_callback = SCM_EOL;
+static Protected_scm cache_callback = SCM_EOL;
 
 /*
 FIXME: this should use ly:set-option interface instead.
index b1c1324ea82f1a80313f626ff56a5c39b616f0b9..de1b7d6c9a7b3ee8047737cddb8cdb2e06ff580b 100644 (file)
@@ -28,7 +28,7 @@
 class Stem
 {
 public:
-  static vector<int> note_head_positions (Grob *);
+  static vector<int> note_head_positions (Grob *, bool filter = false);
   static int duration_log (Grob *);
   static void set_beaming (Grob *, int, Direction d);
   static int get_beaming (Grob *, Direction d);
index 6ea5643a5445e7d791a119479e73d54a5fe7aead..0c3169a7766f31860ef77b978ad7829c017f58b1 100644 (file)
@@ -241,6 +241,10 @@ Item::pure_height (Grob *g, int start, int end)
 {
   if (cached_pure_height_valid_)
     return cached_pure_height_ + pure_relative_y_coordinate (g, start, end);
+  /* Note: cached_pure_height_ does not notice if start changes, implicitly
+     assuming that Items' pure_heights do not depend on 'start' or 'end'.
+     Accidental_interface::pure_height(), however, does depend on 'start'.
+  */
 
   cache_pure_height (Grob::pure_height (this, start, end));
   return cached_pure_height_ + pure_relative_y_coordinate (g, start, end);
index 3d14a3649bef67db281fdf53475171e59561aa5f..6a2abb671467febbd81a4aafa88ec5765e859ac6 100644 (file)
@@ -56,13 +56,35 @@ check_meshing_chords (Grob *me,
   Grob *head_up = Note_column::first_head (clash_up);
   Grob *head_down = Note_column::first_head (clash_down);
 
-  vector<int> ups = Stem::note_head_positions (Note_column::get_stem (clash_up));
-  vector<int> dps = Stem::note_head_positions (Note_column::get_stem (clash_down));
+  /* Staff-positions of all noteheads on each stem */
+  vector<int> ups = Stem::note_head_positions (stems[UP]);
+  vector<int> dps = Stem::note_head_positions (stems[DOWN]);
 
   /* Too far apart to collide. */
   if (ups[0] > dps.back () + 1)
     return;
 
+  /* If the chords just 'touch' their extreme noteheads,
+     then we can align their stems.
+  */
+  bool touch = false;
+  if (ups[0] >= dps.back ()
+      && (dps.size () < 2 || ups[0] >= dps[dps.size () - 2] + 2)
+      && (ups.size () < 2 || ups[1] >= dps.back () + 2))
+    touch = true;
+
+  /* Filter out the 'o's in this configuration, since they're no
+   * part in the collision.
+   *
+   *  |
+   * x|o
+   * x|o
+   * x
+   *
+   */
+  ups = Stem::note_head_positions (stems[UP], true);
+  dps = Stem::note_head_positions (stems[DOWN], true);
+
   /* Merge heads if the notes lie the same line, or if the "stem-up-note" is
      above the "stem-down-note". */
   bool merge_possible = (ups[0] >= dps[0]) && (ups.back () >= dps.back ());
@@ -118,16 +140,6 @@ check_meshing_chords (Grob *me,
    *
    */
 
-  /* TODO: filter out the 'o's in this configuration, since they're no
-   * part in the collision.
-   *
-   *  |
-   * x|o
-   * x|o
-   * x
-   *
-   */
-
   bool close_half_collide = false;
   bool distant_half_collide = false;
   bool full_collide = false;
@@ -163,16 +175,6 @@ check_meshing_chords (Grob *me,
   full_collide = full_collide || (close_half_collide
                                   && distant_half_collide);
 
-  /* If the only collision is in the extreme noteheads,
-     then their stems can line up and the chords just 'touch'.
-     A half collision with the next note along the chord prevents touching.
-  */
-  bool touch = false;
-  if (ups[0] >= dps.back ()
-      && (dps.size () < 2 || ups[0] >= dps[dps.size () - 2] + 2)
-      && (ups.size () < 2 || ups[1] >= dps.back () + 2))
-    touch = true;
-
   /* Determine which chord goes on the left, and which goes right.
      Up-stem usually goes on the right, but if chords just 'touch' we can put
      both stems on a common vertical line.  In the presense of collisions,
@@ -525,12 +527,12 @@ Note_collision_interface::automatic_shift (Grob *me,
   while ((flip (&d)) != UP);
 
   /*
-    do horizontal shifts of each direction
-
-    |
-    x||
-    x||
-    x|
+   * do horizontal shifts of each direction
+   *
+    |
+   * x||
+    x||
+   *   x|
   */
 
   do
index 3dc87664f83ecffe7341263ae97302a761be768f..a6e7b5f32fe4539867f3ddbabe136357b8ba9335 100644 (file)
@@ -97,9 +97,9 @@ Pure_from_neighbor_engraver::finalize ()
   int pos[2] = { -1, 0};
   for (vsize i = 0; i < pure_relevants_.size (); i++)
     {
-      if (pos[1] < (int) need_pure_heights_from_neighbors.size ()
-          && (pure_relevants_[i]->spanned_rank_interval ()[LEFT]
-              > need_pure_heights_from_neighbors[pos[1]][0]->spanned_rank_interval ()[LEFT]))
+      while (pos[1] < (int) need_pure_heights_from_neighbors.size ()
+             && (pure_relevants_[i]->spanned_rank_interval ()[LEFT]
+                 > need_pure_heights_from_neighbors[pos[1]][0]->spanned_rank_interval ()[LEFT]))
         {
           pos[0] = pos[1];
           pos[1]++;
index 8c0e128487b4f48027bb7f23e8810b19aa229c56..f662f3cf1dec75637680e3c85f9bcd9fd31a158c 100644 (file)
@@ -236,18 +236,23 @@ Stem::extremal_heads (Grob *me)
   return exthead;
 }
 
-/* The positions, in ascending order.  */
+/* The staff positions, in ascending order.
+ * If FILTER, include the main column of noteheads only */
 vector<int>
-Stem::note_head_positions (Grob *me)
+Stem::note_head_positions (Grob *me, bool filter)
 {
   vector<int> ps;
   extract_grob_set (me, "note-heads", heads);
+  Grob *xref = common_refpoint_of_array (heads, me, X_AXIS);
 
   for (vsize i = heads.size (); i--;)
     {
       Grob *n = heads[i];
-      int p = Staff_symbol_referencer::get_rounded_position (n);
+      if (filter
+          && n->relative_coordinate (xref, X_AXIS) != 0.0)
+        continue;
 
+      int p = Staff_symbol_referencer::get_rounded_position (n);
       ps.push_back (p);
     }
 
index 40e0c728c5ef2c353de391bd5da025386bce7007..3cf7190bb1ce2722741c1711858f96ec5fc18007 100644 (file)
@@ -669,6 +669,14 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy)
           if (scm_is_number (scripts[i]->get_property ("outside-staff-priority")))
             continue;
 
+          // assume that if a script is avoiding slurs, it should not get placed
+          // under a tuplet bracket
+          SCM avoid = scripts[i]->get_property ("avoid-slur");
+          if (unsmob_grob (scripts[i]->get_object ("slur"))
+              && (avoid == ly_symbol2scm ("outside")
+                  || avoid == ly_symbol2scm ("around")))
+            continue;
+
           Interval script_x (scripts[i]->extent (commonx, X_AXIS));
           Interval script_y (scripts[i]->extent (commony, Y_AXIS));
 
index 3cd98f4436da19cf8d096a8fb9dfc30e7318770c..59424e515216b95776e038dadf653566ab25b3cb 100644 (file)
         ((string= articname "mordent")
          (loop (cons 1 1) newelements tail (cons 'mordent actions)))
         ((string= articname "prall")
-         (loop (cons 1 1) newelements tail (cons 'trill actions)))
+         (loop (cons 1 1) newelements tail (cons 'prall actions)))
         ((string= articname "trill")
          (loop (cons 1 1) newelements tail (cons 'trill actions)))
         ((string= articname "turn")
        ((trill)
         (ac:trill music))
 
+       ((prall)
+       ; A pralltriller symbol can either mean an inverted mordent
+       ; or a half-shake -- a short, two twiddle trill.
+       ; We implement as a half-shake.
+       (let*
+        ((totallength (ly:music-length music))
+         (newlen (ly:moment-sub totallength (ly:make-moment 3 32)))
+         (newdur (ly:make-duration
+                  0 0
+                  (ly:moment-main-numerator newlen)
+                  (ly:moment-main-denominator newlen)))
+         (gracedur (ly:make-duration 5 0 1 1))
+         (gracenote (ly:music-deep-copy music))
+         (abovenote (ly:music-deep-copy music))
+         (mainnote (ly:music-deep-copy music))
+         (prall (make-sequential-music (list gracenote abovenote)))
+       )
+         (music-map (lambda (n)
+          (if (eq? 'NoteEvent (ly:music-property n 'name))
+            (set! (ly:music-property n 'duration) gracedur))
+                     n)
+          abovenote)
+         (music-map (lambda (n)
+          (if (eq? 'NoteEvent (ly:music-property n 'name))
+            (set! (ly:music-property n 'duration) gracedur))
+                     n)
+          gracenote)
+         (music-map (lambda (n)
+          (if (eq? 'NoteEvent (ly:music-property n 'name))
+            (set! (ly:music-property n 'duration) newdur))
+                     n)
+          mainnote)
+
+         (map (lambda (y) (ac:up y))
+          (filter
+           (lambda (z) (eq? 'NoteEvent (ly:music-property z 'name)))
+           (ly:music-property abovenote 'elements)))
+         (make-sequential-music (list abovenote gracenote abovenote mainnote))))
+
        ((mordent)
        (let*
-        ((dur (ly:music-property
+        ((totaldur (ly:music-property
                (car (ly:music-property music 'elements)) 'duration))
-         (factor (ly:duration-factor dur))
+         (dur (ly:duration-length totaldur))
+         (newlen (ly:moment-sub dur (ly:make-moment 2 32)))
+         (newdur (ly:make-duration
+               0 0
+                  (ly:moment-main-numerator newlen)
+                  (ly:moment-main-denominator newlen)))
          (gracenote (ly:music-deep-copy music))
-         (mainnote (ly:music-deep-copy music))
          (belownote (ly:music-deep-copy music))
+         (mainnote (ly:music-deep-copy music))
          (mordent (make-sequential-music (list gracenote belownote)))
-)
+       )
         (begin
          (music-map (lambda (n)
           (if (eq? 'NoteEvent (ly:music-property n 'name))
-           (set! (ly:music-property n 'duration)(ly:make-duration 3 0 1 1)))
+           (set! (ly:music-property n 'duration)
+            (ly:make-duration 5 0 1 1)))
                      n)
           mordent)
+         (music-map (lambda (n)
+          (if (eq? 'NoteEvent (ly:music-property n 'name))
+            (set! (ly:music-property n 'duration) newdur))
+                     n)
+          mainnote)
          (map (lambda (y) (ac:down y))
           (filter
            (lambda (z) (eq? 'NoteEvent (ly:music-property z 'name)))
            (ly:music-property belownote 'elements)))
-         (make-sequential-music (list (make-grace-music mordent) mainnote)))))
+         (make-sequential-music (list mordent mainnote)))))
        ((turn)
        (let*
         ((dur (ly:music-property
index 87505e27ccdcf33665edc4ef4eb58ba4e94a85e2..dbc8dbea56b086840fd47b5ea01284d17139c174 100644 (file)
@@ -61,6 +61,7 @@
 
   \consists "Font_size_engraver"
   \consists "Separating_line_group_engraver"
+  \consists "Dot_column_engraver"
   \consists "Staff_collecting_engraver"
 
  %% perhaps move to Voice context?
@@ -226,7 +227,6 @@ multiple voices on the same staff."
   \consists "Breathing_sign_engraver"
   \consists "Note_heads_engraver"
   \consists "Dots_engraver"
-  \consists "Dot_column_engraver"
   \consists "Rest_engraver"
   \consists "Tweak_engraver"
   \consists "Footnote_engraver"
index 72a3e2407d78d34ede21317c54b2c3410c2141cf..899d0825a3c9531a188a2079c355b24587edf253 100644 (file)
@@ -151,6 +151,10 @@ as an engraver for convenience."
    (print-line engraver
                "breathe"))
 
+#(define (format-glissando engraver event)
+   (print-line engraver
+               "gliss"))
+
 #(define (format-tie engraver event)
    (print-line engraver
                "tie"))
@@ -218,6 +222,7 @@ as an engraver for convenience."
               (crescendo-event . format-cresc)
               (decrescendo-event . format-decresc)
               (text-span-event . format-textspan)
+              (glissando-event . format-glissando)
               (tie-event . format-tie)))
   }
 }
index df797e4c0a179cdcc4ab958934476ba479197e08..6eb1b8b1df65f2a9b87b516d6d40c8b5f50743a3 100644 (file)
@@ -19,8 +19,8 @@
 #(define (whitelist-symbol sym)
   (set! sym-whitelist (cons sym sym-whitelist)))
 
-#(define (whitelist-grob str)
-  (set! grob-whitelist (cons str grob-whitelist)))
+#(define (whitelist-grob sym)
+  (set! grob-whitelist (cons sym grob-whitelist)))
 
 #(define graph (make-empty-graph (ly:parser-output-name parser)))
 
index 6546ed422aa676bffd633bacf013b9c8e7086e9b..684ea14e454731243e8febedfaf292ca3182e304 100644 (file)
@@ -6,8 +6,41 @@
 
 \version "2.15.18"
 
-\include "declarations-init.ly"
+#(if (not (pair? lilypond-declarations))
+     (ly:parser-include-string parser
+                              "\\include \"declarations-init.ly\""))
 
+%% We need to save the variables of the current module along with
+%% their values: functions defined in the module might refer to the
+%% variables
+
+#(if lilypond-declarations
+     (if (pair? lilypond-declarations)
+        (begin
+          (for-each
+           (lambda (p)
+             (let ((var (cadr p))
+                   (val (cddr p)))
+               (variable-set! var
+                              (if (ly:output-def? val)
+                                  (ly:output-def-clone val)
+                                  val))
+               (module-add! (current-module) (car p) var)))
+           lilypond-declarations)
+          (note-names-language parser default-language))
+        (module-for-each
+         (lambda (s v)
+           (let ((val (variable-ref v)))
+             (if (not (ly:lily-parser? val))
+                 (set! lilypond-declarations
+                       (cons
+                        (cons*
+                         s v
+                         (if (ly:output-def? val)
+                             (ly:output-def-clone val)
+                             val))
+                        lilypond-declarations)))))
+         (current-module))))
 
 #(ly:set-option 'old-relative #f)
 #(define toplevel-scores (list))
 #(define expect-error #f)
 #(define output-empty-score-list #f)
 #(define output-suffix #f)
+#(hash-clear! default-fret-table)
+#(hash-clear! chord-shape-table)
+#(hash-clear! musicQuotes)
+
 #(use-modules (scm clip-region))
+#(use-modules (srfi srfi-1))
 
 $(if (ly:get-option 'include-settings)
   (ly:parser-include-string parser
index 18dcc17246829927afa44ed886a5899b84602fc9..51bf3f298f0f4f1a25689fcbbc520399871e04a3 100644 (file)
@@ -9,7 +9,7 @@ $(outdir)/%.midi: %.ly $(LILYPOND_BINARY)
        cp $< $(outdir)
 
 $(outdir)/%-midi.ly: $(outdir)/%.midi $(MIDI2LY)
-       (echo '\header {'; for f in $(HEADER_FIELDS); do echo -n $$f'="'; cat $(outdir)/$*.$$f; echo '"'; done; echo '}') > $(outdir)/$*.header
+       (echo '\header {'; for f in $(HEADER_FIELDS); do printf $$f'="'; cat $(outdir)/$*.$$f; echo '"'; done; echo '}') > $(outdir)/$*.header
        $(PYTHON) $(MIDI2LY) $(shell cat $(outdir)/$*.options) --quiet --include-header=$(outdir)/$*.header -o $(outdir) $<
 
 $(outdir)/%.diff: %.ly $(outdir)/%-midi.ly
index 44130334346af5416004a06ac39d5a5d7afce624..666abc54cf7f59fce1b0838aa7d09ca7f458d78e 100644 (file)
     (SpanBarStub
      . (
         (X-extent . ,grob::x-parent-width)
-       (Y-extent . ,(ly:make-unpure-pure-container #f ly:axis-group-interface::pure-height))
+       (extra-spacing-height . ,pure-from-neighbor-interface::extra-spacing-height)
+       (Y-extent . #f)
        (meta . ((class . Item)
                 (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
                                      (pure-relevant-grobs . ,ly:pure-from-neighbor-interface::calc-pure-relevant-grobs)))
index 55124d0463fb4a1e75c0ba6ae4564bec54d6911c..247d30c4a7fc1bba8ede9e56965ed57de2532f6c 100644 (file)
 
 (define (add-cluster graph node-id cluster-name)
   (let* ((cs (clusters graph))
-        (cluster (assq cluster-name cs))
+        (cluster (assoc cluster-name cs))
         (already-in-cluster (if cluster
                                 (cdr cluster)
                                 '())))
-    (set-clusters! graph (assq-set! cs
+    (set-clusters! graph (assoc-set! cs
                                    cluster-name
                                    (cons node-id already-in-cluster)))))
 
 (define (add-node graph label . cluster-name)
   (let* ((ns (nodes graph))
          (id (length ns)))
-    (set-nodes! graph (assq-set! ns id label))
+    (set-nodes! graph (assv-set! ns id label))
     (if (and (not (null? cluster-name))
             (string? (car cluster-name)))
        (add-cluster graph id (car cluster-name)))
index 0c20c148b20a5ec56066379eaee887eeab20bf8b..64c403b0749432e55df286cae181876a3a1cebde 100644 (file)
@@ -845,6 +845,8 @@ PIDs or the number of the process."
         (dump-profile "lily-run-total" '(0 0) (profile-measurements)))
     failed))
 
+(define-public lilypond-declarations '())
+
 (define (lilypond-file handler file-name)
   (catch 'ly-file-failed
          (lambda () (ly:parse-file file-name))
index 84424584105f1cfd882b07cf55e3e069b29cb706..84055ed9addd552432c11ecba6afec558ef5a98f 100644 (file)
@@ -1640,21 +1640,41 @@ and only recurse if this returns @code{#f}."
                    (map loop arts)))
          music))))
 
+(define-public (for-some-music stop? music)
+  "Walk through @var{music}, process all elements calling @var{stop?}
+and only recurse if this returns @code{#f}."
+  (let loop ((music music))
+    (if (not (stop? music))
+       (let ((elt (ly:music-property music 'element)))
+         (if (ly:music? elt)
+             (loop elt))
+         (for-each loop (ly:music-property music 'elements))
+         (for-each loop (ly:music-property music 'articulations))))))
+
+(define-public (fold-some-music pred? proc init music)
+  "This works recursively on music like @code{fold} does on a list,
+calling @samp{(@var{pred?} music)} on every music element.  If
+@code{#f} is returned for an element, it is processed recursively
+with the same initial value of @samp{previous}, otherwise
+@samp{(@var{proc} music previous)} replaces @samp{previous}
+and no recursion happens.
+The top @var{music} is processed using @var{init} for @samp{previous}."
+  (let loop ((music music) (previous init))
+    (if (pred? music)
+       (proc music previous)
+       (fold loop
+             (fold loop
+                   (let ((elt (ly:music-property music 'element)))
+                     (if (null? elt)
+                         previous
+                         (loop elt previous)))
+                   (ly:music-property music 'elements))
+             (ly:music-property music 'articulations)))))
+
 (define-public (extract-music music pred?)
   "Return a flat list of all music matching @var{pred?} inside of
 @var{music}, not recursing into matches themselves."
-  (reverse!
-   (let loop ((music music) (res '()))
-     (if (pred? music)
-        (cons music res)
-        (fold loop
-              (fold loop
-                    (let ((elt (ly:music-property music 'element)))
-                      (if (null? elt)
-                          res
-                          (loop elt res)))
-                    (ly:music-property music 'elements))
-              (ly:music-property music 'articulations))))))
+  (reverse! (fold-some-music pred? cons '() music)))
 
 (define-public (extract-named-music music music-name)
   "Return a flat list of all music named @var{music-name} (either a
index 17bbea995b1f7c7bf03005b4ffffea2d6c9fd221..bb8f4ddf50d96c80bdece61ebb473d1d36604396 100644 (file)
@@ -434,7 +434,7 @@ and duration-log @var{log}."
       (cons -0.1 0.1)))
 
 (define-public (pure-from-neighbor-interface::extra-spacing-height grob)
-  (let* ((height (ly:grob::stencil-height grob))
+  (let* ((height (ly:grob-pure-height grob grob 0 10000000))
          (from-neighbors (interval-union
                             height
                             (ly:axis-group-interface::pure-height
index bd88e11c79126e588119a9207b68aec3f796c523..e076d692a301dc0098d44fa5f8d9df556b8118d5 100644 (file)
   ;; don't use decimals.
   ;; ISO 216 has a tolerance of +- 2mm
 
+  ;; TODO Autogenerate the following list so it appears under the
+  ;; 'Predefined paper sizes' node in notation-appendices.itely
+  ;; currently the list below has been copied and formatted manually.
+  ;; Therefore, please add any new entries to the *itely file as well.
+
   '(("a10" . (cons (* 26 mm) (* 37 mm)))
     ("a9" . (cons (* 37 mm) (* 52 mm)))
     ("a8" . (cons (* 52 mm) (* 74 mm)))
index ab8a6b902be6752e2a0aedb1298c3baf3428d340..c71976dec123f64b50457d055ffa45dd6f5aa14a 100644 (file)
@@ -69,15 +69,21 @@ cmd = "TEXMFOUTPUT=%s bibtex %s %s" % (tmpdir, quiet_flag, tmpfile)
 
 if (show_output):
     sys.stdout.write ("Running bibtex on %s\n" % files)
+    sys.stdout.write (cmd)
 #And invoke it
 stat = os.system (cmd)
 if stat <> 0:
-    sys.exit(1)
+    sys.stderr.write ("Bibtex exited with nonzero exit status!")
+    sys.exit (1)
 
 #TODO: do tex -> itexi on output
-# Following lines copy tmpfile.bbl to the desired output file
+# Following lines copy tmpfile.bbl to the desired output file
 bbl = open (tmpfile + '.bbl').read ()
 
+if bbl.strip () == '':
+    sys.stderr.write ("Bibtex generated an empty file!")
+    sys.exit (1)
+
 open (output, 'w').write  (bbl)
 
 def cleanup (tmpfile):
index 543735240fea9542c7931c4a99dd978e85b8fa63..b96730b7690261b1d0c063dadd1c8874b4da4ee7 100644 (file)
@@ -15,7 +15,7 @@ os.chdir(dir)
 def system (c):
     print c
     if os.system (c):
-        raise 'barf'
+        raise Exception('The command exited with nonzero exit status!')
 
 outputs = []
 for sz in [48,32,16] :
index 44f0edc33aa3e4ae26c5da88a5a7849aa27f99e2..f191d0aa8fcc3a0941e01f8c4f829d5cd90a8e8f 100644 (file)
@@ -27,7 +27,7 @@ import time
 
 def read_log_file (fn):
     str = open (fn).read ()
-    str = re.sub ('\n', '', str)
+    str = re.sub ('[\n\r]', '', str)
     str = re.sub ('[\t ]+', ' ', str)
 
     deps = []
@@ -61,14 +61,20 @@ def parse_logfile (fn):
         }
     group = ''
 
-    for l in autolines:
+    for i, l in enumerate(autolines):
         tags = l.split ('@:')
         if tags[0] == 'group':
             group = tags[1]
         elif tags[0] == 'puorg':
             group = ''
         elif tags[0] == 'char':
-            name = tags[9]
+            try:
+                name = tags[9]
+            except IndexError:
+                print 'Error in mf-to-table while processing file', fn
+                print 'Index 9 >', len(tags)-1, 'on line', i
+                print l
+                raise
 
             if group:
                 name = group + '.' + name
index 3a39a126d4f89bfd13575152b6f253a98593d318..befe8bc3e20721ec38b5fae30d8cc41d03c362e9 100644 (file)
@@ -427,7 +427,7 @@ ENDHEADER
 sub get_bboxes ($)
 {
     execute_command 1, ("mpost", "-mem=mf2pt1", "-progname=mpost",
-                        "\\mode:=localfont; mag:=$mag; bpppix $bpppix; input $mffile");
+                        "\\mode:=localfont; mag:=$mag; bpppix $bpppix; nonstopmode; input $mffile");
     opendir (CURDIR, ".") || die "${progname}: $! ($filedir)\n";
     @charfiles = sort
                    { ($a=~ /\.(\d+)$/)[0] <=> ($b=~ /\.(\d+)$/)[0] }
index 8847419fe0dc46e698e06873f7494e4bf0bae6f2..a78fdfc02e1733992778931f15d6de1d952cacaf 100644 (file)
@@ -96,13 +96,12 @@ def exit (i):
     else:
         sys.exit (i)
 
-def identify ():
-    ly.encoded_write (sys.stdout, '%s (GNU LilyPond) %s\n' % (ly.program_name, ly.program_version))
-
 progress = ly.progress
 warning = ly.warning
 error = ly.error
 
+def identify ():
+    progress('%s (GNU LilyPond) %s' % (ly.program_name, ly.program_version))
 
 def warranty ():
     identify ()
@@ -609,6 +608,22 @@ def do_file (input_filename, included=False):
         progress (_ ("Removing `%s'") % output_filename)
         raise BookSnippet.CompileError
 
+def inverse_relpath (path, relpath):
+    """Given two paths, the second relative to the first,
+    return the first path relative to the second."""
+    if os.path.isabs (relpath):
+        return os.path.abspath (path)
+    relparts = ['']
+    parts = os.path.normpath (path).split (os.path.sep)
+    for part in os.path.normpath (relpath).split (os.path.sep):
+        if part == '..':
+            relparts.append (parts[-1])
+            parts.pop ()
+        else:
+            relparts.append ('..')
+            parts.append (part)
+    return os.path.sep.join (relparts[::-1])
+
 def do_options ():
     global global_options
 
@@ -618,6 +633,10 @@ def do_options ():
     global_options.information = {'program_version': ly.program_version, 'program_name': ly.program_name }
     global_options.original_dir = original_dir
 
+    if global_options.output_dir:
+        global_options.output_dir = os.path.expanduser (global_options.output_dir)
+        global_options.include_path.insert (0, inverse_relpath (original_dir, global_options.output_dir))
+
     # Load the python packages (containing e.g. custom formatter classes)
     # passed on the command line
     nr = 0
index f7f457926aa209d4eda0e567a38740fa5b00a03d..490e2066ef047f55d3ff9fbed12612096620f8c9 100644 (file)
@@ -417,9 +417,22 @@ EOF
            exit 2
        fi
 
+       abssrcdir="`cd $srcdir; pwd`"
+       absbuilddir="`pwd`"
        for d in 2 3 4 ; do
            for mf in `cd $srcdir ; find . -maxdepth $d -mindepth $d -name GNUmakefile`; do
-               mkdir -p $(dirname $mf)
+               case "$abssrcdir" in
+                   "$absbuilddir"/*)
+# source is below build directory, always copy
+                       ;;
+                   *)
+                       case "$abssrcdir/${mf#./}" in
+                           "$absbuilddir"/*)
+# find descended into build directory, don't copy
+                               continue
+                       esac
+               esac
+               mkdir -p ${mf%/*}
                cat <<EOF | $PYTHON -  > $mf
 print 'depth=' + ('../' * ( $d-1 ) )
 print 'include \$(depth)/config\$(if \$(conf),-\$(conf),).make'
@@ -428,7 +441,18 @@ print 'MODULE_INCLUDES += \$(src-dir)/\$(outbase)'
 EOF
            done
            for mf in `cd $srcdir ; find . -maxdepth $d -mindepth $d -name '*.make' | grep -v config.make `; do
-               mkdir -p $(dirname $mf)
+               case "$abssrcdir" in
+                   "$absbuilddir"/*)
+# source is below build directory, always copy
+                       ;;
+                   *)
+                       case "$abssrcdir/${mf#./}" in
+                           "$absbuilddir"/*)
+# find descended into build directory, don't copy
+                               continue
+                       esac
+               esac
+               mkdir -p ${mf%/*}
                cat <<EOF | $PYTHON -  > $mf
 print 'include \$(depth)/config\$(if \$(conf),-\$(conf),).make'
 print 'include \$(configure-srcdir)/$mf'