]> git.donarmstrong.com Git - lilypond.git/commitdiff
Merge branch 'master' into translation
authorJean-Charles Malahieude <lilyfan@orange.fr>
Tue, 8 Sep 2015 18:14:11 +0000 (20:14 +0200)
committerJean-Charles Malahieude <lilyfan@orange.fr>
Tue, 8 Sep 2015 18:14:11 +0000 (20:14 +0200)
247 files changed:
Documentation/changes.tely
Documentation/common-macros.itexi
Documentation/de/notation/ancient.itely
Documentation/de/notation/input.itely
Documentation/es/notation/ancient.itely
Documentation/es/notation/input.itely
Documentation/fr/notation/ancient.itely
Documentation/fr/notation/input.itely
Documentation/ja/notation/input.itely
Documentation/notation/ancient.itely
Documentation/notation/changing-defaults.itely
Documentation/notation/input.itely
Documentation/notation/spacing.itely
Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly
Documentation/snippets/new/utf-8.ly [new file with mode: 0644]
Documentation/web/download.itexi
Documentation/web/news-front.itexi
Documentation/web/news.itexi
GNUmakefile.in
VERSION
aclocal.m4
config.make.in
configure.ac
flower/file-path.cc
flower/include/compare.hh
flower/include/direction.hh
flower/include/offset.hh
flower/include/rational.hh
flower/include/std-string.hh
flower/std-string.cc
flower/test-std.cc
flower/test-string.cc
input/regression/dynamics-broken-hairpin.ly
input/regression/inherit-acceptability.ly [new file with mode: 0644]
input/regression/kievan-notation.ly
input/regression/markup-map.ly [new file with mode: 0644]
input/regression/midi/sequence-name-scoping.ly [new file with mode: 0644]
input/regression/midi/sequence-name.ly [new file with mode: 0644]
input/regression/one-staff.ly [new file with mode: 0644]
input/regression/typography-demo.ly
input/regression/utf-8-mixed-text.ly
input/regression/utf-8.ly
lily/accidental-placement.cc
lily/align-interface.cc
lily/axis-group-interface.cc
lily/balloon.cc
lily/beam-collision-engraver.cc
lily/beam-quanting.cc
lily/beam.cc
lily/beaming-pattern.cc
lily/book.cc
lily/break-alignment-interface.cc
lily/change-iterator.cc
lily/clef-modifier.cc
lily/cluster-engraver.cc
lily/cluster.cc
lily/collision-engraver.cc
lily/control-track-performer.cc
lily/dot-column.cc
lily/dynamic-align-engraver.cc
lily/dynamic-engraver.cc
lily/enclosing-bracket.cc
lily/figured-bass-continuation.cc
lily/flag.cc
lily/font-config.cc
lily/function-documentation.cc
lily/grid-line-span-engraver.cc
lily/grob-pq-engraver.cc
lily/grob-scheme.cc
lily/grob.cc
lily/hairpin.cc
lily/include/accidental-interface.hh
lily/include/accidental-placement.hh
lily/include/align-interface.hh
lily/include/arpeggio.hh
lily/include/audio-staff.hh
lily/include/axis-group-interface.hh
lily/include/bar-line.hh
lily/include/beam.hh
lily/include/break-align-interface.hh
lily/include/breathing-sign.hh
lily/include/chord-name.hh
lily/include/clef.hh
lily/include/cluster.hh
lily/include/custos.hh
lily/include/dot-column.hh
lily/include/dots.hh
lily/include/fingering-column.hh
lily/include/font-interface.hh
lily/include/gregorian-ligature.hh
lily/include/grid-line-interface.hh
lily/include/grob-interface.hh
lily/include/grob.hh
lily/include/hairpin.hh
lily/include/hara-kiri-group-spanner.hh
lily/include/horizontal-bracket.hh
lily/include/item.hh
lily/include/kievan-ligature.hh
lily/include/lily-proto.hh
lily/include/line-interface.hh
lily/include/lookup.hh
lily/include/lyric-extender.hh
lily/include/lyric-hyphen.hh
lily/include/measure-grouping-spanner.hh
lily/include/melody-spanner.hh
lily/include/mensural-ligature.hh
lily/include/multi-measure-rest.hh
lily/include/note-collision.hh
lily/include/note-column.hh
lily/include/note-head.hh
lily/include/note-spacing.hh
lily/include/paper-column.hh
lily/include/percent-repeat-item.hh
lily/include/performance.hh
lily/include/pure-from-neighbor-interface.hh
lily/include/rest-collision.hh
lily/include/rest.hh
lily/include/rhythmic-head.hh
lily/include/script-column.hh
lily/include/script-interface.hh
lily/include/self-alignment-interface.hh
lily/include/semi-tie-column.hh
lily/include/semi-tie.hh
lily/include/separation-item.hh
lily/include/side-position-interface.hh
lily/include/slur.hh
lily/include/spaceable-grob.hh
lily/include/spacing-interface.hh
lily/include/spacing-spanner.hh
lily/include/spanner.hh
lily/include/staff-grouper-interface.hh
lily/include/staff-spacing.hh
lily/include/staff-symbol-referencer.hh
lily/include/staff-symbol.hh
lily/include/stem-tremolo.hh
lily/include/stem.hh
lily/include/system-start-delimiter.hh
lily/include/system.hh
lily/include/text-interface.hh
lily/include/tie-column.hh
lily/include/tie.hh
lily/include/tuplet-bracket.hh
lily/include/tuplet-number.hh
lily/include/vaticana-ligature.hh
lily/include/volta-bracket.hh
lily/instrument-name-engraver.cc
lily/item.cc
lily/key-signature-interface.cc
lily/ledger-line-engraver.cc
lily/ledger-line-spanner.cc
lily/line-interface-scheme.cc [new file with mode: 0644]
lily/line-interface.cc
lily/line-spanner.cc
lily/lookup.cc
lily/lyric-engraver.cc
lily/note-collision.cc
lily/note-column.cc
lily/note-spacing.cc
lily/ottava-bracket.cc
lily/page-layout-problem.cc
lily/paper-column-engraver.cc
lily/paper-column.cc
lily/performance-scheme.cc
lily/performance.cc
lily/piano-pedal-align-engraver.cc
lily/piano-pedal-bracket.cc
lily/pitched-trill-engraver.cc
lily/pure-from-neighbor-engraver.cc
lily/relocate.cc
lily/rest-collision-engraver.cc
lily/rest-collision.cc
lily/script-column.cc
lily/script-interface.cc
lily/script-row-engraver.cc
lily/self-alignment-interface.cc
lily/semi-tie.cc
lily/separating-line-group-engraver.cc
lily/separation-item.cc
lily/side-position-interface.cc
lily/slur-configuration.cc
lily/slur-scoring.cc
lily/slur.cc
lily/spacing-determine-loose-columns.cc
lily/spacing-interface.cc
lily/spacing-loose-columns.cc
lily/spacing-spanner.cc
lily/span-arpeggio-engraver.cc
lily/span-bar-engraver.cc
lily/span-bar-stub-engraver.cc
lily/staff-performer.cc
lily/staff-spacing.cc
lily/staff-symbol-referencer.cc
lily/stem-engraver.cc
lily/stem-tremolo.cc
lily/stem.cc
lily/stencil-integral.cc
lily/system-start-delimiter-engraver.cc
lily/system.cc
lily/tie-column.cc
lily/tie-formatting-problem.cc
lily/tie.cc
lily/tuplet-bracket.cc
lily/tuplet-number.cc
lily/vertical-align-engraver.cc
ly/Welcome-to-LilyPond-MacOS.ly
ly/Welcome_to_LilyPond.ly
ly/articulate.ly
ly/context-mods-init.ly
ly/engraver-init.ly
ly/music-functions-init.ly
ly/performer-init.ly
ly/titling-init.ly
mf/00-lilypond-fonts.conf.in [new file with mode: 0644]
mf/99-lilypond-fonts.conf.in [new file with mode: 0644]
mf/GNUmakefile
mf/lilypond-fonts.conf.in [deleted file]
po/fr.po
po/it.po
po/lilypond.pot
python/convertrules.py
scm/define-grob-properties.scm
scm/define-markup-commands.scm
scm/define-music-display-methods.scm
scm/flag-styles.scm
scm/font.scm
scm/framework-ps.scm
scm/fret-diagrams.scm
scm/harp-pedals.scm
scm/lily-library.scm
scm/markup-macros.scm
scm/midi.scm
scm/music-functions.scm
scm/stencil.scm
scripts/auxiliar/pfx2ttf-mono.fontforge [deleted file]
scripts/auxiliar/pfx2ttf.fontforge [deleted file]
scripts/build/lys-to-tely.py
scripts/lilypond-book.py
tex/GNUmakefile
tex/lilypond.map.in [deleted file]
tex/texinfo.tex
tex/txi-de.tex
tex/txi-en.tex
tex/txi-es.tex
tex/txi-fr.tex
tex/txi-hu.tex
tex/txi-it.tex
tex/txi-nl.tex

index 6182a59323b5d69f0d0dfa5ed2d2b9ba283e1ab0..ca142c3286fc8bbe11b116ac05ddbdbd52e8da45 100644 (file)
@@ -61,6 +61,19 @@ which scares away people.
 
 @end ignore
 
+@item
+When outputting MIDI, LilyPond will now store the @code{title}
+defined in a score's @code{\header} block (or, if there is no
+such definition on the @code{\score} level, the first such
+definition found in a @code{\header} block of the score's
+enclosing @code{\bookpart}, @code{\book}, or top-level scope)
+as the name of the MIDI sequence in the MIDI file.  Optionally,
+the name of the MIDI sequence can be overridden using the new
+@code{midititle} @code{\header} field independently of
+@code{title} (for example, in case @code{title} contains markup
+code which does not render as plain text in a satisfactory way
+automatically).
+
 @item
 Music (and scheme and void) functions and markup commands that
 just supply the final parameters to a chain of overrides, music
index f3dac48c9189431e6ee92208a4d88d236177971d..6d47ad9cf3a21f04a7435ee6d4d828db2ddf871f 100644 (file)
 @set txicodequoteundirected
 @set txicodequotebacktick
 
-@c Trick to use with proper font mappings the same NCSB fonts as
-@c LilyPond instead of those provided by TeX distribution
-@tex
-\ifpdf
-  \pdfmapfile{=lilypond.map}
-\fi
-@end tex
-
 @include cyrillic.itexi
 
 @c   ***** Displaying text *****
index 9dcaa499739f15bd5e22a9cc41cf495b6ec56126..4d777e2b92f3f7db9442544538bb1e7f0ac9efe5 100644 (file)
@@ -2536,6 +2536,14 @@ die benötigten Kontexteigenschaften und Grob-Eigenschaften mit den
 richtigen Werten, sodass man sofort den Choral notieren kann:
 
 @lilypond[quote,ragged-right,verbatim]
+% Font settings for Cyrillic
+\paper {
+  #(define fonts
+    (set-global-fonts
+     #:roman "Linux Libertine O,serif"
+   ))
+}
+
 \score {
   <<
     \new KievanVoice = "melody" \transpose c c' {
index ec997b60ac87c6c8aea51771c63bf6f02fa42a66..5879d98eb894c2c6ec9a1e13e5407122f072a0b4 100644 (file)
@@ -2202,6 +2202,17 @@ Heir ein Beispiel mit Kyrilliza, hebräischem und portugiesischem Text:
 
 @lilypond[quote]
 %c No verbatim here as the code does not display correctly in PDF
+% Font settings for Cyrillic and Hebrew
+% Linux Libertine fonts contain Cyrillic and Hebrew glyphs.
+\paper {
+  #(define fonts
+    (set-global-fonts
+     #:roman "Linux Libertine O,serif"
+     #:sans "Linux Biolinum O,sans-serif"
+     #:typewriter "Linux Libertine Mono O,monospace"
+   ))
+}
+
 % Cyrillic
 bulgarian = \lyricmode {
   Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон.
index fcb7635fa9f405a07cc7de06c0dcdf1cc648e6c5..072f9933eefc858fc876556fe061f9dd44113ada 100644 (file)
@@ -2472,6 +2472,14 @@ sus valores adecuados, de manera que pueda ponerse manos a la obra
 inmediatamente con la introducción del propio canto:
 
 @lilypond[quote,ragged-right,verbatim]
+% Font settings for Cyrillic
+\paper {
+  #(define fonts
+    (set-global-fonts
+     #:roman "Linux Libertine O,serif"
+   ))
+}
+
 \score {
   <<
     \new KievanVoice = "melody" \relative c' {
@@ -2655,6 +2663,14 @@ El ejemplo siguiente muestra el uso de las ligaduras del canto
 kievano:
 
 @lilypond[quote,ragged-right,verbatim]
+% Font settings for Cyrillic
+\paper {
+  #(define fonts
+    (set-global-fonts
+     #:roman "Linux Libertine O,serif"
+   ))
+}
+
 \score {
   <<
     \new KievanVoice = "melody" \relative c' {
index 4df2aae7b659027c7f0c2649b858c902090387cf..abe7941049cf98ee6c6d29d2447c5a29c778f096 100644 (file)
@@ -2475,6 +2475,17 @@ He aquí un ejemplo que muestra texto cirílico, hebreo y portugués:
 
 @lilypond[quote]
 %c No verbatim here as the code does not display correctly in PDF
+% Font settings for Cyrillic and Hebrew
+% Linux Libertine fonts contain Cyrillic and Hebrew glyphs.
+\paper {
+  #(define fonts
+    (set-global-fonts
+     #:roman "Linux Libertine O,serif"
+     #:sans "Linux Biolinum O,sans-serif"
+     #:typewriter "Linux Libertine Mono O,monospace"
+   ))
+}
+
 % Cyrillic
 bulgarian = \lyricmode {
   Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон.
index 041a749b0c626332aff5065d3fc50b4e82766314..2976478858904fd12a7cb0bcc23f07c448b58665 100644 (file)
@@ -2463,6 +2463,14 @@ valeurs adéquates, de telle sorte que vous pouvez tout de suite vous
 lancer dans la saisie de votre chant, comme ci-dessous :
 
 @lilypond[quote,ragged-right,verbatim]
+% Font settings for Cyrillic
+\paper {
+  #(define fonts
+    (set-global-fonts
+     #:roman "Linux Libertine O,serif"
+   ))
+}
+
 \score {
   <<
     \new KievanVoice = "melody" \relative c' {
@@ -2641,6 +2649,14 @@ propriété @code{padding} de @code{KievanLigature}.
 Voici comment générer des ligatures en notation kiévienne :
 
 @lilypond[quote,ragged-right,verbatim]
+% Font settings for Cyrillic
+\paper {
+  #(define fonts
+    (set-global-fonts
+     #:roman "Linux Libertine O,serif"
+   ))
+}
+
 \score {
   <<
     \new KievanVoice = "melody" \relative c' {
index 2a31e40d2f97a6369c3e91fa89f15a91bbae720a..ac2b8ca0f3a86a9d626bd9a518e575dfb5b8a48b 100644 (file)
@@ -2518,6 +2518,17 @@ portugais.
 
 @lilypond[quote]
 %c No verbatim here as the code does not display correctly in PDF
+% Font settings for Cyrillic and Hebrew
+% Linux Libertine fonts contain Cyrillic and Hebrew glyphs.
+\paper {
+  #(define fonts
+    (set-global-fonts
+     #:roman "Linux Libertine O,serif"
+     #:sans "Linux Biolinum O,sans-serif"
+     #:typewriter "Linux Libertine Mono O,monospace"
+   ))
+}
+
 % Cyrillic
 bulgarian = \lyricmode {
   Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон.
index bf219e016a45b67803dd5617c687fd118f0be58b..dfd4584bdd9f80e7ca1d6e10e065fa6ee9ec8a34 100644 (file)
@@ -2216,6 +2216,17 @@ FT_Get_Glyph_Name () error: invalid argument
 @c KEEP LY
 @lilypond[quote]
 %c No verbatim here as the code does not display correctly in PDF
+% Font settings for Cyrillic and Hebrew
+% Linux Libertine fonts contain Cyrillic and Hebrew glyphs.
+\paper {
+  #(define fonts
+    (set-global-fonts
+     #:roman "Linux Libertine O,serif"
+     #:sans "Linux Biolinum O,sans-serif"
+     #:typewriter "Linux Libertine Mono O,monospace"
+   ))
+}
+
 % キリル文字
 bulgarian = \lyricmode {
   Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон.
index 685c3329f5727bb5b8196c9a64bccec6dd9d23d2..9f2f25690e3daebb38dc9a69a4bd9275893a77e1 100644 (file)
@@ -2408,6 +2408,14 @@ all relevant context properties and grob properties to proper
 values, so you can immediately go ahead entering the chant:
 
 @lilypond[quote,ragged-right,verbatim]
+% Font settings for Cyrillic
+\paper {
+  #(define fonts
+    (set-global-fonts
+     #:roman "Linux Libertine O,serif"
+   ))
+}
+
 \score {
   <<
     \new KievanVoice = "melody" \relative c' {
@@ -2578,6 +2586,14 @@ by setting the @code{padding} property of the @code{KievanLigature}.
 The following example demonstrates the use of Kievan ligatures:
 
 @lilypond[quote,ragged-right,verbatim]
+% Font settings for Cyrillic
+\paper {
+  #(define fonts
+    (set-global-fonts
+     #:roman "Linux Libertine O,serif"
+   ))
+}
+
 \score {
   <<
     \new KievanVoice = "melody" \relative c' {
index 4c000c565d1720044dad9a7abc9cba82be099a2e..efcf8549b3d35ac6e152a64874eed1cabfbf00f7 100644 (file)
@@ -536,14 +536,19 @@ have to be referenced, for example, when changing staves with
 @code{\lyricsto} commands, or when adding further musical events to
 an earlier context.
 
-There is an exception to this general rule: just one of the
-@code{Voice} contexts in a @code{Staff} context or in a
-@code{<<@dots{}>>} construct will always persist to the end of the
-enclosing @code{Staff} context or @code{<<@dots{}>>} construct, even
-though there may be periods when it has nothing to do.  The context
-to persist in this way will be the first one encountered in the
-first enclosed @code{@{@dots{}@}} construct, ignoring any in enclosed
-@code{<<@dots{}>>} constructs.
+There is an exception to this general rule: inside of an
+@code{@{@dots{}@}} construct (sequential music), the construct's
+notion of the ``current context'' will descend whenever an element
+of the sequence ends in a subcontext of the previous current
+context.  This avoids spurious creation of implicit contexts in a
+number of situations but means that the first context descended
+into will be kept alive until the end of the expression.
+
+In contrast, the contexts of a @code{<<@dots{}>>} construct's
+(simultaneous music) expression are not carried forth, so
+enclosing a context creating command in an extra pair of
+@code{<<@dots{}>>} will keep the context from persisting through
+all of the enclosing @code{@{@dots{}@}} sequence.
 
 Any context can be kept alive by ensuring it has something to do at
 every musical moment.  @code{Staff} contexts are kept alive by
@@ -1274,11 +1279,39 @@ contexts.  Therefore, we modify the @code{Staff} definition with the
 @}
 @end example
 
+@funindex \inherit-acceptability
+Often when reusing an existing context definition, the resulting
+context can be used anywhere where the original context would have
+been useful.
+
+@example
+\layout @{
+  @dots{}
+  \inherit-acceptability @var{to} @var{from}
+@}
+@end example
+
+@noindent
+will arrange to have contexts of type @var{to} accepted by all
+contexts also accepting @var{from}.  For example, using
+
+@example
+\layout @{
+  @dots{}
+  \inherit-acceptability "ImproVoice" "Voice"
+@}
+@end example
+
+@noindent
+will add an @code{\accepts} for @code{ImproVoice} to both
+@code{Staff} and @code{RhythmicStaff} definitions.
+
 @funindex \denies
 The opposite of @code{\accepts} is @code{\denies},
 which is sometimes needed when reusing existing context definitions.
 
-Putting both into a @code{\layout} block, like
+Arranging the required pieces into a @code{\layout} block leaves
+us with
 
 @example
 \layout @{
@@ -1286,10 +1319,7 @@ Putting both into a @code{\layout} block, like
     \name ImproVoice
     @dots{}
   @}
-  \context @{
-    \Staff
-    \accepts "ImproVoice"
-  @}
+  \inherit-acceptability "ImproVoice" "Voice"
 @}
 @end example
 
index 2d946437fb47113c69d9f59cc44a499a2bb94bf3..a5b04b4b2414171179a2ab7b155a8c894a6ab906 100644 (file)
@@ -2374,6 +2374,17 @@ text:
 
 @lilypond[quote]
 %c No verbatim here as the code does not display correctly in PDF
+% Font settings for Cyrillic and Hebrew
+% Linux Libertine fonts contain Cyrillic and Hebrew glyphs.
+\paper {
+  #(define fonts
+    (set-global-fonts
+     #:roman "Linux Libertine O,serif"
+     #:sans "Linux Biolinum O,sans-serif"
+     #:typewriter "Linux Libertine Mono O,monospace"
+   ))
+}
+
 % Cyrillic
 bulgarian = \lyricmode {
   Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон.
index d88fa8b27e30c7066f0bf4c11f892c2f960f46e1..e954e9b9a675f1021fdf6d1898157a24a50eeafc 100644 (file)
@@ -3484,11 +3484,11 @@ assignment will force a layout with 2 pages.
 
 @item
 Avoid (or reduce) objects that increase the vertical size of a
-system.  For example, volta repeats (or alternate repeats) require
-extra space.  If these repeats are spread over two systems, they
-will take up more space than one system with the volta repeats and
-another system without.  For example, dynamics that @q{stick out} of
-a system can be moved closer to the staff:
+system.  For example, volta brackets for alternative repeat endings
+require extra space.  If these endings are spread over two systems,
+they take up more space than if they were on the same system.
+As another example, dynamics that @q{stick out} of a system
+can be moved closer to the staff:
 
 @lilypond[verbatim,quote]
 \relative e' {
index 9f92c6f2abfefcaa19e2548d85f898bfbabe51f3..1e9e48026139d28cc6b1082d0a45a66e9e4907a2 100644 (file)
@@ -4,7 +4,7 @@
 %% and then run scripts/auxiliar/makelsr.py
 %%
 %% This file is in the public domain.
-\version "2.19.7"
+\version "2.18.0"
 
 \header {
   lsrtags = "contexts-and-engravers"
@@ -294,23 +294,23 @@ position of middle C and key signature from @var{translator}'s context."
      (let ((ambitus #f))
        ;; when music is processed: make the ambitus object, if not already built
        (make-engraver
-       ((process-music translator)
-        (if (not ambitus)
-            (set! ambitus (make-ambitus translator))))
-       ;; set the ambitus clef and key signature state
-       ((stop-translation-timestep translator)
-        (if ambitus
-            (initialize-ambitus-state ambitus translator)))
-       ;; when a note-head grob is built, update the ambitus notes
-       (acknowledgers
+    ((process-music translator)
+     (if (not ambitus)
+         (set! ambitus (make-ambitus translator))))
+    ;; set the ambitus clef and key signature state
+    ((stop-translation-timestep translator)
+     (if ambitus
+         (initialize-ambitus-state ambitus translator)))
+    ;; when a note-head grob is built, update the ambitus notes
+    (acknowledgers
           ((note-head-interface engraver grob source-engraver)
-          (if ambitus
-              (update-ambitus-notes ambitus grob))))
-       ;; finally, typeset the ambitus according to its upper and lower notes
-       ;; (if any).
-       ((finalize translator)
-        (if ambitus
-            (typeset-ambitus ambitus translator)))))))
+       (if ambitus
+           (update-ambitus-notes ambitus grob))))
+    ;; finally, typeset the ambitus according to its upper and lower notes
+    ;; (if any).
+    ((finalize translator)
+     (if ambitus
+         (typeset-ambitus ambitus translator)))))))
 
 %%%
 %%% Example
diff --git a/Documentation/snippets/new/utf-8.ly b/Documentation/snippets/new/utf-8.ly
new file mode 100644 (file)
index 0000000..7dcb13e
--- /dev/null
@@ -0,0 +1,78 @@
+\version "2.19.12"
+
+\header {
+  lsrtags = "text"
+
+  texidoc = "
+Various scripts may be used for texts (like titles and lyrics) by
+entering them in UTF-8 encoding, and using a Pango based backend.
+Depending on the fonts installed, this fragment will render Bulgarian
+(Cyrillic), Hebrew, Japanese and Portuguese.
+
+"
+  doctitle = "UTF-8"
+} % begin verbatim
+
+% end verbatim - this comment is a hack to prevent texinfo.tex
+% from choking on non-European UTF-8 subsets
+
+%% Edit this file using a Unicode aware editor, such as GVIM, GEDIT, Emacs
+
+%{
+
+You may have to install additional fonts.
+
+Red Hat Fedora
+
+       linux-libertine-fonts (Latin, Cyrillic, Hebrew)
+       ipa-mincho-fonts ipa-gothic-fonts (Japanese)
+
+Debian GNU/Linux, Ubuntu
+
+       fonts-linuxlibertine (Latin, Cyrillic, Hebrew)
+       fonts-ipafont (Japanese)
+
+%}
+
+% Font settings for Cyrillic and Hebrew
+% Linux Libertine fonts contain Cyrillic and Hebrew glyphs.
+\paper {
+  #(define fonts
+    (set-global-fonts
+     #:roman "Linux Libertine O,serif"
+     #:sans "Linux Biolinum O,sans-serif"
+     #:typewriter "Linux Libertine Mono O,monospace"
+   ))
+}
+
+% Cyrillic font
+bulgarian = \lyricmode {
+  Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон.
+}
+
+hebrew = \lyricmode {
+  זה כיף סתם לשמוע איך תנצח קרפד עץ טוב בגן.
+}
+
+japanese = \lyricmode {
+  いろはにほへど ちりぬるを
+  わがよたれぞ  つねならむ
+  うゐのおくや  まけふこえて
+  あさきゆめみじ ゑひもせず
+}
+
+% "a legal song to you"
+portuguese = \lyricmode {
+  à vo -- cê uma can -- ção legal
+}
+
+\relative c' {
+  c2 d
+  e2 f
+  g2 f
+  e1
+}
+\addlyrics { \bulgarian }
+\addlyrics { \hebrew }
+\addlyrics { \japanese }
+\addlyrics { \portuguese }
index e4d872637e3b90ec137aa77e63acd57f20bda068..589b8fdaf2757fe2c80ae27538a96205eaa14498 100644 (file)
@@ -484,7 +484,8 @@ which contains LilyPond executable files like this:
 [@var{pre-set paths}];@var{DIR}\LilyPond\usr\bin
 @end example
 
-@warning{@var{DIR} will generally be @code{C:@bs{}Program Files}.}
+@warning{@var{DIR} will generally be @code{C:@bs{}Program Files (x86)}
+for 64 bit or @code{C:@bs{}Program Files} for 32 bit systems.}
 
 @noindent
 and click @qq{OK} button to close the window.
index 793c80377e61d846ad0ed8c1d7fbea6c5a9dd43b..42893bedd62f8019ac16e749de4a031d0331c1d7 100644 (file)
@@ -9,10 +9,10 @@
 @c used for news about the upcoming release; see CG 10.2
 
 @newsItem
-@subheading LilyPond 2.19.24 released  @emph{July 26, 2015}
+@subheading LilyPond 2.19.26 released  @emph{August 27, 2015}
 
 We are happy to announce the release of LilyPond
-2.19.24.  This release includes a number of enhancements, and contains some
+2.19.26.  This release includes a number of enhancements, and contains some
 work in progress.  You will have access to the very latest features, but
 some may be incomplete, and you may encounter bugs and crashes.  If you
 require a stable version of Lilypond, we recommend using the 2.18
index 134c359434353bab4c03691f025c3f318f0331b6..300b4c076af7836688a9671e9119cb05eb94be3a 100644 (file)
@@ -26,6 +26,30 @@ NOTE:
   * don't duplicate entries from news-front.itexi
 @end ignore
 
+@newsItem
+@subheading LilyPond 2.19.25 released  @emph{August 9, 2015}
+
+We are happy to announce the release of LilyPond
+2.19.25.  This release includes a number of enhancements, and contains some
+work in progress.  You will have access to the very latest features, but
+some may be incomplete, and you may encounter bugs and crashes.  If you
+require a stable version of Lilypond, we recommend using the 2.18
+version.
+
+@newsEnd
+
+@newsItem
+@subheading LilyPond 2.19.24 released  @emph{July 26, 2015}
+
+We are happy to announce the release of LilyPond
+2.19.24.  This release includes a number of enhancements, and contains some
+work in progress.  You will have access to the very latest features, but
+some may be incomplete, and you may encounter bugs and crashes.  If you
+require a stable version of Lilypond, we recommend using the 2.18
+version.
+
+@newsEnd
+
 @newsItem
 @subheading LilyPond 2.19.23 released  @emph{July 12, 2015}
 
index 749f27aaee8cceffbef85586a33e274083d1654b..abc7ecaf6aba1eea6416582c9a590ec2690296b1 100644 (file)
@@ -253,14 +253,18 @@ $(tree-share-prefix)/mf-link-tree: $(tree-share-prefix)/lilypond-force
        -rm -f $(tree-share-prefix)/fonts/otf/* &&  \
        rm -f $(tree-share-prefix)/fonts/svg/* &&  \
        rm -f $(tree-share-prefix)/fonts/fonts.conf &&  \
-       rm -f $(tree-share-prefix)/fonts/lilypond-fonts.conf &&  \
+       rm -f $(tree-share-prefix)/fonts/00-lilypond-fonts.conf &&  \
+       rm -f $(tree-share-prefix)/fonts/99-lilypond-fonts.conf &&  \
        rm -f $(tree-share-prefix)/fonts/tfm/* &&  \
        rm -f $(tree-share-prefix)/fonts/type1/* &&  \
                cd $(tree-share-prefix)/fonts/otf && \
-               ln -s ../../../../../../mf/$(outconfbase)/*.otf .
+               ln -s ../../../../../../mf/$(outconfbase)/*.otf . && \
+               $(foreach i,$(addprefix $(TEXGYRE_DIR)/,$(TEXGYRE_FILES)), \
+                       ln -s $i . && ) true
        -cd $(tree-share-prefix)/fonts && \
                ln -s ../../../../../mf/$(outconfbase)/fonts.conf . && \
-               ln -s ../../../../../mf/$(outconfbase)/lilypond-fonts.conf .
+               ln -s ../../../../../mf/$(outconfbase)/00-lilypond-fonts.conf . && \
+               ln -s ../../../../../mf/$(outconfbase)/99-lilypond-fonts.conf .
        -cd $(tree-share-prefix)/fonts/svg && \
                ln -s ../../../../../../mf/$(outconfbase)/*.svg .
        -cd $(tree-share-prefix)/fonts/svg && \
diff --git a/VERSION b/VERSION
index e9f208740c8d4f25c3b2cf34f42bd731ef29bd62..e233654b9d6d559a590caf5299b048fffd876b21 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1,7 +1,7 @@
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=2
 MINOR_VERSION=19
-PATCH_LEVEL=25
+PATCH_LEVEL=27
 MY_PATCH_LEVEL=
 VERSION_STABLE=2.18.2
-VERSION_DEVEL=2.19.24
+VERSION_DEVEL=2.19.26
index 48d0b77b748d6dd9b3462eb79bfbc20293c53792..0037c58ca807c403a206647415ed64ef8c00bf05 100644 (file)
@@ -42,7 +42,8 @@ AC_DEFUN(STEPMAKE_GET_VERSION, [
 
     if test -z "$_ver"; then
         ## If empty, try date [fontforge]
-        eval _ver=\"\`("$1" --version || "$1" -V) 2>&1 | grep '[0-9]\{6,8\}' \
+        eval _ver=\"\`("$1" --version || "$1" -V) 2>&1 \
+           | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \
            | head -n 1 \
            | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\"
     fi
index d5bf2b87b8a7d820cc6f98587e1c48e267e07b75..e915a0b3cd7032904e0ef5444f7a315c4c047662 100644 (file)
@@ -90,11 +90,8 @@ lilypond_omfdir = $(local_package_omfdir)
 webdir = $(lilypond_docdir)/html
 vimdir = $(lilypond_datadir)/vim
 
-
-NCSB_SOURCE_FILES = @NCSB_SOURCE_FILES@
-NCSB_DIR = @NCSB_DIR@
-HELV_SOURCE_FILES = @HELV_SOURCE_FILES@
-COUR_SOURCE_FILES = @COUR_SOURCE_FILES@
+TEXGYRE_DIR = @TEXGYRE_DIR@
+TEXGYRE_FILES = @TEXGYRE_FILES@
 
 ################################################################
 ## PROGRAMS
index a403e35c18e41aabd9aa5a094721be0c28fc57a4..ca151e70f3f4fdfca196a9bb671ba177e1024da8 100644 (file)
@@ -32,11 +32,11 @@ AC_ARG_ENABLE(guile2,
                    [highly experimental GUILE 2 support.  Default: off])],
     [GUILEv2=$enableval])
 
-AC_ARG_WITH(fonts-dir,
-    [AS_HELP_STRING([--with-fonts-dir=DIR],
-                   [location of URW++ fonts.])],
-    [NCSB_DIR=$withval],
-    [NCSB_DIR=""])
+AC_ARG_WITH(texgyre-dir,
+    [AS_HELP_STRING([--with-texgyre-dir=DIR],
+                   [location of TeX Gyre fonts.])],
+    [TEXGYRE_DIR=$withval],
+    [TEXGYRE_DIR=""])
 
 reloc_b=no
 AC_ARG_ENABLE(relocation,
@@ -61,104 +61,44 @@ AC_SUBST(LINK_GXX_STATICALLY)
 STEPMAKE_COMPILE
 
 AC_CHECK_PROG(FCLIST, fc-list, fc-list)
-AC_MSG_CHECKING([for Century Schoolbook L PFB files])
-AC_SUBST(NCSB_SOURCE_FILES)
-AC_SUBST(NCSB_DIR)
-if test "$NCSB_DIR" = ""; then
+AC_MSG_CHECKING([for TeX Gyre fonts OTF files])
+AC_SUBST(TEXGYRE_DIR)
+AC_SUBST(TEXGYRE_FILES)
+if test "$TEXGYRE_DIR" = ""; then
   if test "$FCLIST" != ""; then
-    NCSB_FILE=`$FCLIST "Century Schoolbook L:foundry=urw:fontformat=Type 1:lang=ru" file \
-              | head -n 1`
-    if test "$NCSB_FILE" != ""; then
-      NCSB_FILE=`echo $NCSB_FILE | sed 's/\(:.*\)$//g'`
-      NCSB_FILE=`$PYTHON "$srcdir/scripts/auxiliar/readlink.py" $NCSB_FILE`
-      NCSB_DIR=`AS_DIRNAME($NCSB_FILE)`
+    TEXGYRE_FILE=`$FCLIST "TeX Gyre Schola:fontformat=CFF" file | head -n 1`
+    if test "$TEXGYRE_FILE" != ""; then
+      TEXGYRE_FILE=`echo $TEXGYRE_FILE | sed 's/\(:.*\)$//g'`
+      TEXGYRE_FILE=`$PYTHON "$srcdir/scripts/auxiliar/readlink.py" $TEXGYRE_FILE`
+      TEXGYRE_DIR=`AS_DIRNAME($TEXGYRE_FILE)`
     fi
   fi
 fi
-if test "$NCSB_DIR" != "" ;  then
-  for f in c059013l.pfb c059016l.pfb c059033l.pfb c059036l.pfb; do
-    if test ! -f "$NCSB_DIR/$f"; then
-      MISSING_NCSB_SOURCE_FILES="$f $MISSING_NCSB_SOURCE_FILES"
+if test "$TEXGYRE_DIR" != "" ;  then
+  for f in texgyreschola-regular.otf texgyreschola-italic.otf \
+           texgyreschola-bold.otf texgyreschola-bolditalic.otf \
+           texgyreheros-regular.otf texgyreheros-italic.otf \
+           texgyreheros-bold.otf texgyreheros-bolditalic.otf \
+           texgyrecursor-regular.otf texgyrecursor-italic.otf \
+           texgyrecursor-bold.otf texgyrecursor-bolditalic.otf; do
+    if test ! -f "$TEXGYRE_DIR/$f"; then
+      MISSING_TEXGYRE_FILES="$MISSING_TEXGYRE_FILES $f"
     else
-      if test "`grep Cyrillic "$NCSB_DIR/$f"`" = ""; then
-        INCOMPLETE_NCSB_SOURCE_FILES="$f $INCOMPLETE_NCSB_SOURCE_FILES"
-      else
-        NCSB_SOURCE_FILES="$NCSB_DIR/$f $NCSB_SOURCE_FILES"
-      fi
+      TEXGYRE_FILES="$TEXGYRE_FILES $f"
     fi
   done
 fi
-if test "$NCSB_DIR" = "" -o "$MISSING_NCSB_SOURCE_FILES" != "$INCOMPLETE_NCSB_SOURCE_FILES"; then
+if test "$TEXGYRE_DIR" = "" -o "$MISSING_TEXGYRE_FILES" != ""; then
   AC_MSG_RESULT(no)
-  STEPMAKE_ADD_ENTRY(REQUIRED,International Century Schoolbook L fonts)
-  if test "$NCSB_DIR" = ""; then
+  STEPMAKE_ADD_ENTRY(REQUIRED,TeX Gyre fonts OTF)
+  if test "$TEXGYRE_DIR" = ""; then
     if test "$FCLIST" = ""; then
-      STEPMAKE_ADD_ENTRY(REQUIRED,'(install the fc-list utility from FontConfig, or use --with-fonts-dir)')
+      STEPMAKE_ADD_ENTRY(REQUIRED,'(install the fc-list utility from FontConfig, or use --with-texgyre-dir)')
     else
-      STEPMAKE_ADD_ENTRY(REQUIRED,'(make sure the fc-list utility can see them, or use --with-fonts-dir)')
+      STEPMAKE_ADD_ENTRY(REQUIRED,"(make sure the fc-list utility can see them, e.g. 'sudo apt-get install fonts-texgyre', or use --with-texgyre-dir)")
     fi
-  fi
-  if test "$MISSING_NCSB_SOURCE_FILES" != ""; then
-    STEPMAKE_ADD_ENTRY(REQUIRED,'(these files are missing: $MISSING_NCSB_SOURCE_FILES)')
-  fi
-  if test "$INCOMPLETE_NCSB_SOURCE_FILES" != ""; then
-    STEPMAKE_ADD_ENTRY(REQUIRED,'(these files do not contain Cyrillic characters: $INCOMPLETE_NCSB_SOURCE_FILES)')
-  fi
-else
-  AC_MSG_RESULT(yes)
-fi
-
-AC_MSG_CHECKING([for Nimbus Sans L (Helvetica) PFB files])
-AC_SUBST(HELV_SOURCE_FILES)
-if test "$NCSB_DIR" != "" ;  then
-  for f in n019003l.pfb n019004l.pfb n019023l.pfb n019024l.pfb; do
-    if test ! -f "$NCSB_DIR/$f"; then
-      MISSING_HELV_SOURCE_FILES="$f $MISSING_HELV_SOURCE_FILES"
-    else
-      if test "`grep Cyrillic "$NCSB_DIR/$f"`" = ""; then
-        INCOMPLETE_HELV_SOURCE_FILES="$f $INCOMPLETE_HELV_SOURCE_FILES"
-      else
-        HELV_SOURCE_FILES="$NCSB_DIR/$f $HELV_SOURCE_FILES"
-      fi
-    fi
-  done
-fi
-if test "$NCSB_DIR" = "" -o "$MISSING_HELV_SOURCE_FILES" != "$INCOMPLETE_HELV_SOURCE_FILES"; then
-  AC_MSG_RESULT(no)
-  STEPMAKE_ADD_ENTRY(REQUIRED,International Nimbus Sans L fonts)
-  if test "$MISSING_HELV_SOURCE_FILES" != ""; then
-    STEPMAKE_ADD_ENTRY(REQUIRED,'(these files are missing: $MISSING_HELV_SOURCE_FILES)')
-  fi
-  if test "$INCOMPLETE_HELV_SOURCE_FILES" != ""; then
-    STEPMAKE_ADD_ENTRY(REQUIRED,'(these files do not contain Cyrillic characters: $INCOMPLETE_HELV_SOURCE_FILES)')
-  fi
-else
-  AC_MSG_RESULT(yes)
-fi
-
-AC_MSG_CHECKING([for Nimbus Mono L (Courier) PFB files])
-AC_SUBST(COUR_SOURCE_FILES)
-if test "$NCSB_DIR" != "" ;  then
-  for f in n022003l.pfb n022004l.pfb n022023l.pfb n022024l.pfb; do
-    if test ! -f "$NCSB_DIR/$f"; then
-      MISSING_COUR_SOURCE_FILES="$f $MISSING_COUR_SOURCE_FILES"
-    else
-      if test "`grep Cyrillic "$NCSB_DIR/$f"`" = ""; then
-        INCOMPLETE_COUR_SOURCE_FILES="$f $INCOMPLETE_COUR_SOURCE_FILES"
-      else
-        COUR_SOURCE_FILES="$NCSB_DIR/$f $COUR_SOURCE_FILES"
-      fi
-    fi
-  done
-fi
-if test "$NCSB_DIR" = "" -o "$MISSING_COUR_SOURCE_FILES" != "$INCOMPLETE_COUR_SOURCE_FILES"; then
-  AC_MSG_RESULT(no)
-  STEPMAKE_ADD_ENTRY(REQUIRED,International Nimbus Mono L fonts)
-  if test "$MISSING_COUR_SOURCE_FILES" != ""; then
-    STEPMAKE_ADD_ENTRY(REQUIRED,'(these files are missing: $MISSING_COUR_SOURCE_FILES)')
-  fi
-  if test "$INCOMPLETE_COUR_SOURCE_FILES" != ""; then
-    STEPMAKE_ADD_ENTRY(REQUIRED,'(these files do not contain Cyrillic characters: $INCOMPLETE_COUR_SOURCE_FILES)')
+  else
+    STEPMAKE_ADD_ENTRY(REQUIRED,'(these files are missing: $MISSING_TEXGYRE_FILES)')
   fi
 else
   AC_MSG_RESULT(yes)
index 09e9c4a2fae2d5b2e6119d2072b0f4ad7a4ecf33..65cd517e5a07247fc798277631be1857601679e0 100644 (file)
 #define PATHSEP ':'
 #endif
 
+#include <algorithm>
+
 vector<string>
 File_path::directories () const
 {
   return dirs_;
 }
 
-#include <algorithm>
 void
 File_path::parse_path (const string &p)
 {
index 0b398aa18c86e441166e9c4439cbefdefd9907dc..0ec1173951590cae858e21b6c3fb2a4859bf4ded 100644 (file)
     prefix ONE_OPERATOR (type, function, !=)                            \
     prefix ONE_OPERATOR (type, function, <)                             \
     prefix ONE_OPERATOR (type, function, <=)                            \
-    /* namespace std { */                                               \
-    prefix inline type max (type t1, type t2) { return (t1 > t2) ? t1 : t2; } \
-    prefix inline type min (type t1, type t2) { return (t1 < t2) ? t1 : t2; } \
-  /* } */                                                               \
   /* stupid fix to allow ; */                                           \
   prefix bool operator < (type t1, type t2)
 
index f3b31e3811a7c5245c294cbd72322b9dc3cd184d..0d36c0f7c7cca5ff25fb0a41f6917f52e1d01a83 100644 (file)
@@ -20,6 +20,7 @@
 #ifndef DIRECTION_HH
 #define DIRECTION_HH
 
+#include <algorithm>
 #include "axis.hh"
 
 enum Direction
@@ -49,26 +50,9 @@ enum Direction
 };
 
 inline Direction
-other_dir (Direction const d)
+operator - (Direction d)
 {
-  return (Direction) (-d);
-}
-
-inline Direction
-operator - (Direction const d)
-{
-  return other_dir (d);
-}
-
-// to be deleted soon (after coping with issues 2491 and 2493
-inline Direction
-flip (Direction *i)
-{
-  if (*i == (Direction)1)
-    *i = (Direction) - 1;
-  else if (*i == (Direction) - 1)
-    *i = (Direction)1;
-  return *i;
+  return Direction (- static_cast<int> (d)); // cast avoids recursion
 }
 
 #define UP_and_DOWN(d) \
@@ -92,6 +76,4 @@ template<class T> T minmax (Direction d, T a, T b)
     return min (a, b);
 }
 
-// String direction_string (Direction, Axis);
-
 #endif // DIRECTION_HH
index cddec1fc00c7cb9acd4c85c7e52c572a3d1dc68c..8f395398b75e2768d31f476737142502c3a7eedd 100644 (file)
@@ -169,5 +169,13 @@ dot_product (Offset o1, Offset o2)
   return o1[X_AXIS] * o2[X_AXIS] + o1[Y_AXIS] * o2[Y_AXIS];
 }
 
+inline
+Real
+cross_product (Offset o1, Offset o2)
+{
+  return o1[X_AXIS] * o2[Y_AXIS] - o1[Y_AXIS] * o2[X_AXIS];
+}
+
+
 #endif /* OFFSET_HH */
 
index 253e09f4cc4214c44f03e16aa4e842d4056691be..f829e531eccb6ef2d431d9ffe290b0f745c3731d 100644 (file)
@@ -20,6 +20,7 @@
 #ifndef RATIONAL_HH
 #define RATIONAL_HH
 
+#include "compare.hh"
 #include "flower-proto.hh"
 #include "std-string.hh"
 #include <limits.h>
index 651f3403a11f590cb1035a4fdec62e7e1b4a9ce6..0a34d0504958c7fbe4ef8b05dae11b313d226321 100644 (file)
@@ -20,7 +20,6 @@
 #ifndef STD_STRING_HH
 #define STD_STRING_HH
 
-#include "compare.hh"
 #include "flower-proto.hh"
 
 #if 0
@@ -55,8 +54,4 @@ string &replace_all (string *str, string const &find, string const &replace);
 string &replace_all (string *str, char find, char replace);
 char *string_copy (const string &s);
 
-int string_compare (string const &, string const &);
-
-INSTANTIATE_COMPARE (string const &, string_compare);
-
 #endif /* STD_STRING_HH */
index 347f0f3688a449fe1d219cd6a4040804cf4ee9dc..593a286d84e291313a3266c4f0d874549268bc56 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "std-string.hh"
 #include "string-convert.hh"
+#include "std-vector.hh"
 
 string
 to_string (const string &s)
@@ -116,14 +117,6 @@ string_copy (const string &s)
   return dest;
 }
 
-int
-string_compare (string const &a, string const &b)
-{
-  return a.compare (b);
-}
-
-#include "std-vector.hh"
-
 vector<string>
 string_split (string str, char c)
 {
index 8fce64abe12041f321c402940421a7ee5a9bf08a..4add05a625a863cbb581c4743ded5281e6fcdfa4 100644 (file)
@@ -1,9 +1,3 @@
-#define STD_VECTOR 1
-
-#if !STD_VECTOR
-#define Array flower_vector
-#endif
-
 #define HAVE_BOOST_LAMBDA 1
 #include "std-vector.hh"
 
@@ -12,10 +6,6 @@
 #define YAFFUT_MAIN
 #include "yaffut.hh"
 
-#if !STD_VECTOR
-#define vector flower_vector
-#endif
-
 using namespace std;
 
 template<typename T>
@@ -27,17 +17,6 @@ print (vector<T> v)
   cout << endl;
 }
 
-#if !STD_VECTOR
-template<typename T>
-void
-print (Link_array<T> v)
-{
-  for (vsize i = 0; i < v.size (); i++)
-    cout << "v[" << i << "] = " << *v[i] << endl;
-  cout << endl;
-}
-#endif
-
 FUNC (vector_erase)
 {
   vector<int> v;
@@ -118,11 +97,7 @@ FUNC (vector_insert)
 
 FUNC (parray_concat)
 {
-#if !STD_VECTOR
-  Link_array<int> u, v;
-#else
   vector<int *> u, v;
-#endif
   int a[5] = { 0, 1, 2, 3, 4 };
   u.push_back (&a[0]);
   u.push_back (&a[1]);
index 5ed243fb084d9812694446c6d00af2f3babdabe9..1967d43751caf4a7b5bdabf03dd5f802174185e1 100644 (file)
@@ -1,5 +1,3 @@
-#define STD_VECTOR 1
-
 #define HAVE_BOOST_LAMBDA 1
 #include "std-vector.hh"
 
@@ -7,10 +5,6 @@
 
 #include "yaffut.hh"
 
-#if !STD_VECTOR
-#define vector flower_vector
-#endif
-
 using namespace std;
 
 FUNC (string_split_join)
index b412a7ea9428904e23192da6139f3610cede1919..39d200cfcb9352ea095e3ddeb86f0ed0dd25391b 100644 (file)
@@ -1,7 +1,7 @@
-
 \version "2.19.21"
-\header{
-texidoc = "Broken crescendi should be open on one side."
+
+\header {
+  texidoc = "When a hairpin is broken, the broken parts should be open at the ‘breaking point’."
 }
 
 \layout {
@@ -9,7 +9,11 @@ texidoc = "Broken crescendi should be open on one side."
 }
 
 
-\relative { 
-  c''1 \< \break c1\!  \> \break c1\!
+\relative {
+   c''1 \< \break
+   c
+   c\> \break
+   c
+   c\!
 }
 
diff --git a/input/regression/inherit-acceptability.ly b/input/regression/inherit-acceptability.ly
new file mode 100644 (file)
index 0000000..caa31ed
--- /dev/null
@@ -0,0 +1,22 @@
+\version "2.19.26"
+
+\header {
+  texidoc = "@code{\\inherit-acceptability} allows for one context def to be accepted
+wherever an existing one is."
+}
+
+\new StaffGroup
+<<
+  \new Staff { \time 3/4 c'2. }
+  \new TimeLess { \time 3/4 c'2. }
+>>
+
+\layout {
+  ragged-right = ##t
+  \context {
+    \Staff
+    \name "TimeLess"
+    \remove "Time_signature_engraver"
+  }
+  \inherit-acceptability "TimeLess" "Staff"
+}
index fe780320448f7c2a2ab2bf50482d7bcb20816cd6..127d3a647b1bbe4922989aa7069810ba6b6dde69 100644 (file)
@@ -1,10 +1,21 @@
-\version "2.17.4"
+\version "2.19.21"
 
 \header {
   texidoc = "LilyPond typesets Kievan notation.
 "
 }
 
+% Font settings for Cyrillic
+% Linux Libertine fonts contain Cyrillic glyphs.
+\paper {
+  #(define fonts
+    (set-global-fonts
+     #:roman "Linux Libertine O,serif"
+     #:sans "Linux Biolinum O,sans-serif"
+     #:typewriter "Linux Libertine Mono O,monospace"
+   ))
+}
+
 \score {
   <<
     \new KievanVoice = "melody" \transpose c c' {
diff --git a/input/regression/markup-map.ly b/input/regression/markup-map.ly
new file mode 100644 (file)
index 0000000..dfa6984
--- /dev/null
@@ -0,0 +1,19 @@
+\version "2.19.26"
+
+\header {
+  texidoc = "@code{\\markupMap} can be used for applying a markup function
+to music properties throughout a music expressions, like the @code{text} of
+all contained lyric events."
+}
+
+\layout { ragged-right = ##t }
+
+\new Voice
+\markupMap TextScriptEvent.text
+           #italic-markup
+{ g'2^"See" c''^"this?" }
+\addlyrics {
+  \markupMap text
+             \markup \fontsize #5 \with-color #red \rotate #30 \etc
+  { Oh yes! }
+}
diff --git a/input/regression/midi/sequence-name-scoping.ly b/input/regression/midi/sequence-name-scoping.ly
new file mode 100644 (file)
index 0000000..239d55c
--- /dev/null
@@ -0,0 +1,82 @@
+\version "2.19.25"
+
+\header {
+  texidoc="If a score has a @code{\header} block which defines a title,
+  this title should override any title defined in a @code{\header} block
+  of the score's enclosing @code{\bookpart} or @code{\book} (or a title
+  defined in a top-level @code{\header} block) when naming the MIDI
+  sequence generated from the score.  Otherwise, if the score has no title
+  defined, the MIDI sequence generated from the score should get named
+  using the title defined in the @code{\header} block of the nearest
+  enclosing @code{\bookpart}, @code{\book}, or top-level scope that
+  contains a title definition."
+  title = "Top-level title"
+}
+
+music = \new Staff { c1 }
+
+% Book with a title defined in a \header block, and book parts
+\book {
+  \header { title = "Book" }
+
+  % score without a \header block outside of any book part -- the MIDI
+  % sequence should get the title of the book as its name
+  \score {
+    \music
+    \layout { }
+    \midi { }
+  }
+
+  % score with a \header and a title outside of any book part -- the MIDI
+  % sequence should be named with the title from this \header block
+  \score {
+    \music
+    \header { title = "Score in a \book" }
+    \layout { }
+    \midi { }
+  }
+
+  % Book part with a \header block and a title
+  \bookpart {
+    \header { title = "Book part" }
+
+    % score without a \header block -- the MIDI sequence should get its name
+    % from the title of the enclosing book part
+    \score {
+      \music
+      \layout { }
+      \midi { }
+    }
+
+    % score with a \header (and a title) of its own -- the MIDI sequence
+    % should get its name from the title in this \header block
+    \score {
+      \music
+      \header { title = "Score in a book part (w/ a title) of a book" }
+      \layout { }
+      \midi { }
+    }
+  }
+
+  % Book part without a \header block
+  \bookpart {
+
+    % score without a \header block -- the MIDI sequence should be named
+    % using the title from the enclosing book
+    \score {
+      \music
+      \layout { }
+      \midi { }
+    }
+
+    % score with a \header block and title -- the MIDI sequence should get
+    % its name from the title in this \header block
+    \score {
+      \music
+      \header { title = "Score in a book part (w/o a title) of a book" }
+      \layout { }
+      \midi { }
+    }
+  }
+
+}
diff --git a/input/regression/midi/sequence-name.ly b/input/regression/midi/sequence-name.ly
new file mode 100644 (file)
index 0000000..f10590d
--- /dev/null
@@ -0,0 +1,63 @@
+\version "2.19.25"
+
+\header {
+  texidoc="The MIDI sequence generated from a score should get its name
+  from the title defined in the score's @code{\header} block (if any).
+  The title used for layout can be overridden for MIDI output by
+  specifying a separate @code{midititle} in the @code{\header} block.
+  If the score does not define a title of its own, and has no enclosing
+  @code{\bookpart}, @code{\book}, or top-level scope with a @code{\header}
+  block that defines a title, either, the MIDI sequence should get the
+  default name."
+}
+
+music = \new Staff { c1 }
+
+% Book without a \header block
+\book {
+
+  % score with a \header block including a title -- the MIDI sequence
+  % should get its name from this \header block
+  \score {
+    \music
+    \header { title = "Title shared between layout and MIDI" }
+    \layout { }
+    \midi { }
+  }
+
+  % score with no title, but a midititle defined in a \header block --
+  % the MIDI sequence should be named using the midititle in this \header
+  % block
+  \score {
+    \music
+    \header { midititle = "No title for layout, but a title for MIDI" }
+    \layout { }
+    \midi { }
+  }
+
+  % score with a title and a midititle defined in a \header block -- the
+  % MIDI sequence should get the midititle in this \header block as its
+  % name
+  \score {
+    \music
+    \header {
+      title = "Title for layout"
+      midititle = "Title for MIDI"
+    }
+    \layout { }
+    \midi { }
+  }
+
+  % Book part with no \header block
+  \bookpart {
+
+    % score without a \header -- the MIDI sequence should get the default
+    % name
+    \score {
+      \music
+      \layout { }
+      \midi { }
+    }
+  }
+
+}
diff --git a/input/regression/one-staff.ly b/input/regression/one-staff.ly
new file mode 100644 (file)
index 0000000..45ed449
--- /dev/null
@@ -0,0 +1,25 @@
+\version "2.19.26"
+
+\header {
+  texidoc = "@code{OneStaff} contexts can be used for letting several
+contexts use the same vertical position.  This example shows chords being
+placed in a staff and immediately following it."
+}
+
+\layout {
+  ragged-right = ##t
+}
+
+\new OneStaff
+{
+  << % First element in <<>> so that it is not kept alive spuriously
+    \new Staff
+    {
+      c'4 d' e' f'
+      \chords \with { \override ChordName.Y-offset = -1 }
+      { d1:m7 b1:min7.5- }
+    }
+  >>
+  \chords \with { \override ChordName.Y-offset = -1 }
+  { d1:m7 b1:min7.5- }
+}
index c4cdb0b8427af96862604bcc544a4351dea13961..c915c7fe52663c261f887c70b481cd2270ea53b0 100644 (file)
@@ -22,6 +22,15 @@ ignoreMelismaOff = \unset ignoreMelismata
   line-width = #(* mm 140)
   system-system-spacing.basic-distance = #10.3
   ragged-bottom = ##t 
+
+  % Font settings for Cyrillic and Hebrew
+  % Linux Libertine fonts contain Cyrillic and Hebrew glyphs.
+  #(define fonts
+    (set-global-fonts
+     #:roman "Linux Libertine O,serif"
+     #:sans "Linux Biolinum O,sans-serif"
+     #:typewriter "Linux Libertine Mono O,monospace"
+   ))
 }
 
 modernAccidentals = {
index 7f93917c2f4c9036f926c35e34fda0a4922526ef..b0fba2c5d25a1a0ced08eb5d0b1a09a19084cab8 100644 (file)
@@ -7,4 +7,15 @@
 
 \version "2.16.0"
 
+% Font settings for Cyrillic
+% Linux Libertine fonts contain Cyrillic glyphs.
+\paper {
+  #(define fonts
+    (set-global-fonts
+     #:roman "Linux Libertine O,serif"
+     #:sans "Linux Biolinum O,sans-serif"
+     #:typewriter "Linux Libertine Mono O,monospace"
+   ))
+}
+
 \markup { "Здравствуйте Hallo" }
index bfcc8cb3099dceaab880db5786b6569194e99dea..b5fefcf9231c8c9ef200c0d3f05358613d1a6884 100644 (file)
@@ -8,14 +8,14 @@ You may have to install additional fonts.
 
 Red Hat Fedora
 
-    taipeifonts fonts-xorg-truetype ttfonts-ja fonts-arabic \
-        ttfonts-zh_CN fonts-ja fonts-hebrew
+       linux-libertine-fonts (Latin, Cyrillic, Hebrew)
+       ipa-mincho-fonts ipa-gothic-fonts (Japanese)
 
-Debian GNU/Linux
+Debian GNU/Linux, Ubuntu
+
+       fonts-linuxlibertine (Latin, Cyrillic, Hebrew)
+       fonts-ipafont (Japanese)
 
-   apt-get install emacs-intl-fonts xfonts-intl-.* \
-       ttf-kochi-gothic ttf-kochi-mincho \
-       xfonts-bolkhov-75dpi xfonts-cronyx-100dpi xfonts-cronyx-75dpi
 %}
 
 \header {
@@ -29,6 +29,17 @@ will render Bulgarian (Cyrillic), Hebrew, Japanese and Portuguese.
 
 }
 
+% Font settings for Cyrillic and Hebrew
+% Linux Libertine fonts contain Cyrillic and Hebrew glyphs.
+\paper {
+  #(define fonts
+    (set-global-fonts
+     #:roman "Linux Libertine O,serif"
+     #:sans "Linux Biolinum O,sans-serif"
+     #:typewriter "Linux Libertine Mono O,monospace"
+   ))
+}
+
 % Cyrillic font
 bulgarian = \lyricmode {
   Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон.
index 3555435bea769a125e38f79d8c420458f40a58bb..f8a0967954c8e106a8a218daa41052ff37cfc29a 100644 (file)
@@ -313,7 +313,7 @@ extract_heads_and_stems (vector<Accidental_placement_entry *> const &apes)
           Grob *head = acc->get_parent (Y_AXIS);
           Grob *col = head->get_parent (X_AXIS);
 
-          if (Note_column::has_interface (col))
+          if (has_interface<Note_column> (col))
             note_cols.push_back (col);
           else
             ret.push_back (head);
@@ -327,7 +327,7 @@ extract_heads_and_stems (vector<Accidental_placement_entry *> const &apes)
   for (vsize i = note_cols.size (); i--;)
     {
       Grob *c = note_cols[i]->get_parent (X_AXIS);
-      if (Note_collision_interface::has_interface (c))
+      if (has_interface<Note_collision_interface> (c))
         {
           extract_grob_set (c, "elements", columns);
           concat (note_cols, columns);
@@ -371,7 +371,7 @@ build_heads_skyline (vector<Grob *> const &heads_and_stems,
   vector<Box> head_extents;
   for (vsize i = heads_and_stems.size (); i--;)
     head_extents.push_back (Box (heads_and_stems[i]->extent (common[X_AXIS], X_AXIS),
-                                 heads_and_stems[i]->pure_height (common[Y_AXIS], 0, INT_MAX)));
+                                 heads_and_stems[i]->pure_y_extent (common[Y_AXIS], 0, INT_MAX)));
 
   return Skyline (head_extents, Y_AXIS, LEFT);
 }
index 32eb1edace843ffd3373afce761c67492d931244..80a9dd3c081f043713b8d8debe07482aeffe02e3 100644 (file)
@@ -93,7 +93,7 @@ get_skylines (Grob *g,
   else
     {
       assert (a == Y_AXIS);
-      Interval extent = g->pure_height (g, start, end);
+      Interval extent = g->pure_y_extent (g, start, end);
 
       // This is a hack to get better accuracy on the pure-height of VerticalAlignment.
       // It's quite common for a treble clef to be the highest element of one system
@@ -106,7 +106,7 @@ get_skylines (Grob *g,
       // of the system. This way, the tall treble clefs are only compared with the treble
       // clefs of the other staff and they will be ignored if the staff above is, for example,
       // lyrics.
-      if (Axis_group_interface::has_interface (g))
+      if (has_interface<Axis_group_interface> (g))
         {
           extent = Axis_group_interface::rest_of_line_pure_height (g, start, end);
           Interval begin_of_line_extent = Axis_group_interface::begin_of_line_pure_height (g, start);
index 59d1d6ba24a1f54297b1fe2f9a4505d9ca634e36..c9c56858a17a071bb38a7038820bee6812b8c4f3 100644 (file)
@@ -101,7 +101,7 @@ Axis_group_interface::relative_maybe_bound_group_extent (vector<Grob *> const &e
       Grob *se = elts[i];
       if (!to_boolean (se->get_property ("cross-staff")))
         {
-          Interval dims = (bound && has_interface (se)
+          Interval dims = (bound && has_interface<Axis_group_interface> (se)
                            ? generic_bound_extent (se, common, a)
                            : se->extent (common, a));
           if (!dims.is_empty ())
@@ -284,7 +284,7 @@ Axis_group_interface::adjacent_pure_heights (SCM smob)
 
           if (g->pure_is_visible (start, visibility_end))
             {
-              Interval dims = g->pure_height (common, start, end);
+              Interval dims = g->pure_y_extent (common, start, end);
               if (!dims.is_empty ())
                 {
                   if (rank_span[LEFT] <= start)
@@ -330,7 +330,7 @@ Axis_group_interface::relative_pure_height (Grob *me, int start, int end)
      reasonably safe to assume that if our parent is a VerticalAlignment,
      we can assume additivity and cache things nicely. */
   Grob *p = me->get_parent (Y_AXIS);
-  if (p && Align_interface::has_interface (p))
+  if (has_interface<Align_interface> (p))
     return Axis_group_interface::sum_partial_pure_heights (me, start, end);
 
   Grob *common = unsmob<Grob> (me->get_object ("pure-Y-common"));
@@ -344,9 +344,9 @@ Axis_group_interface::relative_pure_height (Grob *me, int start, int end)
       if (rank_span[LEFT] <= end && rank_span[RIGHT] >= start
           && g->pure_is_visible (start, end)
           && !(to_boolean (g->get_property ("cross-staff"))
-               && Stem::has_interface (g)))
+               && has_interface<Stem> (g)))
         {
-          Interval dims = g->pure_height (common, start, end);
+          Interval dims = g->pure_y_extent (common, start, end);
           if (!dims.is_empty ())
             r.unite (dims);
         }
@@ -443,7 +443,7 @@ Axis_group_interface::generic_group_extent (Grob *me, Axis a)
   /* trigger the callback to do skyline-spacing on the children */
   if (a == Y_AXIS)
     for (vsize i = 0; i < elts.size (); i++)
-      if (!(Stem::has_interface (elts[i])
+      if (!(has_interface<Stem> (elts[i])
             && to_boolean (elts[i]->get_property ("cross-staff"))))
         (void) elts[i]->get_property ("vertical-skylines");
 
@@ -535,7 +535,7 @@ Axis_group_interface::calc_pure_y_common (SCM smob)
 
   extract_grob_set (me, "pure-relevant-grobs", elts);
   Grob *common = common_refpoint_of_array (elts, me, Y_AXIS);
-  if (common != me && Align_interface::has_interface (common))
+  if (common != me && has_interface<Align_interface> (common))
     {
       me->programming_error("My pure_y_common is a VerticalAlignment,"
                             " which might contain several staves.");
@@ -599,7 +599,7 @@ Axis_group_interface::get_children (Grob *me, vector<Grob *> *found)
 {
   found->push_back (me);
 
-  if (!has_interface (me))
+  if (!has_interface<Axis_group_interface> (me))
     return;
 
   extract_grob_set (me, "elements", elements);
index 7e8067a577ac5db20ceb8129e977a2edf27ee819..d8519f6e39345bfd45f8a08dab5e7c0597534bd1 100644 (file)
@@ -33,7 +33,6 @@ class Balloon_interface
 public:
   DECLARE_SCHEME_CALLBACK (print, (SCM));
   DECLARE_SCHEME_CALLBACK (print_spanner, (SCM));
-  DECLARE_GROB_INTERFACE ();
 
   static SCM internal_balloon_print (Grob *me, Grob *p, Offset off);
 };
index bb8e42e1cf19d9c95f75f1336bd95bcb7156e8b9..151ffacf16eab597378664eeb3d84a74f7ce5229 100644 (file)
@@ -115,12 +115,12 @@ Beam_collision_engraver::finalize ()
           if ((covered_grob_spanned_rank[RIGHT] >= beam_spanned_rank_[LEFT])
               && !(to_boolean (beam_grob->get_property ("collision-voice-only"))
                    && (covered_grob_context != beam_context))
-              && !(Beam::has_interface (covered_grob)
+              && !(has_interface<Beam> (covered_grob)
                    && (covered_grob_spanned_rank[LEFT] <= beam_spanned_rank_[LEFT]))
               && covered_grob_has_interface (covered_grob, beam_grob))
             {
               // Do not consider note heads attached to the beam.
-              if (Stem::has_interface (covered_grob))
+              if (has_interface<Stem> (covered_grob))
                 if (unsmob<Grob> (covered_grob->get_object ("beam")))
                   continue;
 
index 856d8be0b6cf6338e46a20acb5d011701906adbf..f3505772f1a70940c4deb9014d400b9158e485a2 100644 (file)
@@ -305,7 +305,7 @@ void Beam_scoring_problem::init_instance_variables (Grob *me, Drul_array<Real> y
         edge_dirs_ = Drul_array<Direction> (stem_infos_[0].dir_,
                                             stem_infos_.back ().dir_);
 
-      is_xstaff_ = Align_interface::has_interface (common[Y_AXIS]);
+      is_xstaff_ = has_interface<Align_interface> (common[Y_AXIS]);
       is_knee_ |= dirs_found[DOWN] && dirs_found[UP];
 
       staff_radius_ = Staff_symbol_referencer::staff_radius (beams[i]);
@@ -343,7 +343,7 @@ void Beam_scoring_problem::init_instance_variables (Grob *me, Drul_array<Real> y
           if (!collisions[j]->is_live ())
             continue;
 
-          if (Beam::has_interface (collisions[j]) && Beam::is_cross_staff (collisions[j]))
+          if (has_interface<Beam> (collisions[j]) && Beam::is_cross_staff (collisions[j]))
             continue;
 
           Box b;
@@ -364,7 +364,7 @@ void Beam_scoring_problem::init_instance_variables (Grob *me, Drul_array<Real> y
             add_collision (b[X_AXIS][d], b[Y_AXIS], width_factor);
 
           Grob *stem = unsmob<Grob> (collisions[j]->get_object ("stem"));
-          if (stem && Stem::has_interface (stem) && Stem::is_normal_stem (stem))
+          if (has_interface<Stem> (stem) && Stem::is_normal_stem (stem))
             {
               colliding_stems.insert (stem);
             }
index c18c3d8430be70e4b0ccccaf4584283aef3ad913..206f6e9f4dfb4ff9f5a442f19596f80e17cef7e9 100644 (file)
@@ -1232,7 +1232,7 @@ Beam::rest_collision_callback (SCM smob, SCM prev_offset)
     return scm_from_double (0.0);
   Grob *beam = unsmob<Grob> (stem->get_object ("beam"));
   if (!beam
-      || !Beam::has_interface (beam)
+      || !has_interface<Beam> (beam)
       || !Beam::normal_stem_count (beam))
     return scm_from_double (0.0);
 
index cb8c91dbece9de761ba7a5d1421e4f5e8c12987c..f205df8d78a14014c0d23547e7afaf5601f6166c 100644 (file)
@@ -165,7 +165,7 @@ Beaming_pattern::beamify (Beaming_options const &options)
   for (int i = 0; i < 2; i++)
     for (vsize i = 1; i < infos_.size () - 1; i++)
       {
-        Direction non_flag_dir = other_dir (flag_directions[i]);
+        Direction non_flag_dir = -flag_directions[i];
         if (non_flag_dir)
           {
             int importance = infos_[i + 1].rhythmic_importance_;
index cb145f0436d12f36ab1617bde76d274ac524eade..c7f5dd02378372ba377320d9c1a94dec2899d17b 100644 (file)
@@ -229,7 +229,18 @@ Book::process_score (SCM s, Paper_book *output_paper_book, Output_def *layout)
           Music_output *output = unsmob<Music_output> (scm_car (outputs));
 
           if (Performance *perf = dynamic_cast<Performance *> (output))
-            output_paper_book->add_performance (perf->self_scm ());
+            {
+              output_paper_book->add_performance (perf->self_scm ());
+              // Associate the performance with a \header block (if there is
+              // one in effect in the scope of the current score), to make the
+              // header metadata accessible when outputting the performance.
+              if (ly_is_module (score->get_header ()))
+                perf->set_header (score->get_header ());
+              else if (ly_is_module (output_paper_book->header_))
+                perf->set_header (output_paper_book->header_);
+              else if (ly_is_module (output_paper_book->header_0_))
+                perf->set_header (output_paper_book->header_0_);
+            }
           else if (Paper_score *pscore = dynamic_cast<Paper_score *> (output))
             {
               if (ly_is_module (score->get_header ()))
index 58cb488d6b920efd83d21efbe841f9af8d7770fc..e2a546f6a676ed1ecbbbc85ef56414aea512e0a2 100644 (file)
@@ -263,7 +263,7 @@ Break_alignable_interface::self_align_callback (SCM grob)
 {
   Grob *me = unsmob<Grob> (grob);
   Item *alignment = dynamic_cast<Item *> (me->get_parent (X_AXIS));
-  if (!Break_alignment_interface::has_interface (alignment))
+  if (!has_interface<Break_alignment_interface> (alignment))
     return scm_from_int (0);
 
   SCM symbol_list = me->get_property ("break-align-symbols");
index 5cf07bf0e2fd9244982498200016c01e65901309..0f8823d484350fdb580998ba2895e2f0227bb7df 100644 (file)
@@ -78,7 +78,7 @@ Change_iterator::change_to (Music_iterator &it,
       result = _f ("not changing to same context type: %s", ly_symbol2string (to_type).c_str ());
     }
   else
-    /* FIXME: uncomprehensable message */
+    /* FIXME: incomprehensible message */
     result = _ ("none of these in my family");
 
   return result;
index 4c24dd356e0473a9aa98ee603ff729798807bd18..c6ce950fc04a64ab5a6abf28bdaa05fda706876f 100644 (file)
@@ -22,7 +22,6 @@
 struct Clef_modifier
 {
   DECLARE_SCHEME_CALLBACK (calc_parent_alignment, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 MAKE_SCHEME_CALLBACK (Clef_modifier, calc_parent_alignment, 1)
index 8af3137f90e9c21f5db4f3f9839afac418d0c767..bb5ed0dc54da0b6f79b430afb227b2bb35682ab7 100644 (file)
@@ -135,7 +135,7 @@ Cluster_spanner_engraver::stop_translation_timestep ()
 void
 Cluster_spanner_engraver::acknowledge_note_column (Grob_info info)
 {
-  if (!beacon_ && Note_column::has_interface (info.grob ()))
+  if (!beacon_ && has_interface<Note_column> (info.grob ()))
     {
       finished_spanner_ = spanner_;
       spanner_ = 0;
index 694da482a5fba6cb4de806fd06963e43e5b723b1..9c160fd8ccb4037aee24480a5581078e997208bd 100644 (file)
@@ -228,7 +228,6 @@ struct Cluster_beacon
 {
 public:
   DECLARE_SCHEME_CALLBACK (height, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 MAKE_SCHEME_CALLBACK (Cluster_beacon, height, 1);
index d2cf95e1e8515d33962325207af37dd59e456cb6..d1eb2dd3c0a4b49bc29a7f4553468c43b677420c 100644 (file)
@@ -23,6 +23,8 @@
 #include "axis-group-interface.hh"
 #include "item.hh"
 
+#include "translator.icc"
+
 class Collision_engraver : public Engraver
 {
   Item *col_;
@@ -51,7 +53,7 @@ Collision_engraver::process_acknowledged ()
 void
 Collision_engraver::acknowledge_note_column (Grob_info i)
 {
-  if (Note_column::has_interface (i.grob ()))
+  if (has_interface<Note_column> (i.grob ()))
     {
       /*should check Y axis? */
       if (Note_column::has_rests (i.grob ()) || i.grob ()->get_parent (X_AXIS))
@@ -76,8 +78,6 @@ Collision_engraver::Collision_engraver ()
   col_ = 0;
 }
 
-#include "translator.icc"
-
 ADD_ACKNOWLEDGER (Collision_engraver, note_column);
 
 ADD_TRANSLATOR (Collision_engraver,
index 9b0d676870d5d08d6074e2a3d2c6090657b5a7b0..82beebe122fb002066f0fede1a4303c67fcbadd7 100644 (file)
@@ -52,11 +52,15 @@ Control_track_performer::add_text (Audio_text::Type text_type, const string &str
 void
 Control_track_performer::initialize ()
 {
-  control_track_ = new Audio_staff;
+  control_track_ = new Audio_control_track_staff;
   announce_element (Audio_element_info (control_track_, 0));
 
   string id_string = String_convert::pad_to (gnu_lilypond_version_string (), 30);
 
+  // The first audio element in the control track is a placeholder for the
+  // name of the MIDI sequence.  The actual name is stored in the element
+  // later before outputting the track (in Performance::output, see
+  // performance.cc).
   add_text (Audio_text::TRACK_NAME, "control track");
   add_text (Audio_text::TEXT, "creator: ");
   add_text (Audio_text::TEXT, id_string);
index b8f1663b1080cf9faeeb9cf7fb51f9f8b4842117..7ac3140141065c5a4b7fe359d8725d21a0cce230 100644 (file)
@@ -95,12 +95,12 @@ Dot_column::calc_positioning_done (SCM smob)
          Rest collisions should wait after line breaking.
       */
       Interval y;
-      if (Rest::has_interface (s))
+      if (has_interface<Rest> (s))
         {
           base_x.unite (s->extent (commonx, X_AXIS));
           continue;
         }
-      else if (Stem::has_interface (s))
+      else if (has_interface<Stem> (s))
         {
           Real y1 = Stem::head_positions (s)[-get_grob_direction (s)];
           Real y2 = y1 + get_grob_direction (s) * 7;
@@ -110,7 +110,7 @@ Dot_column::calc_positioning_done (SCM smob)
 
           stems.insert (s);
         }
-      else if (Note_head::has_interface (s))
+      else if (has_interface<Note_head> (s))
         y = Interval (-1.1, 1.1);
       else
         {
@@ -200,7 +200,7 @@ Dot_column::calc_positioning_done (SCM smob)
       Grob *note = dots[i]->get_parent (Y_AXIS);
       if (note)
         {
-          if (Note_head::has_interface (note))
+          if (has_interface<Note_head> (note))
             dp.dir_ = to_dir (dp.dot_->get_property ("direction"));
 
           dp.x_extent_ = note->extent (commonx, X_AXIS);
@@ -252,7 +252,7 @@ Dot_column::add_head (Grob *me, Grob *head)
       // correct X-offset of the dots for horizontal collision avoidance.
       // The translation here is undone in calc_positioning_done, where we
       // do the X-offset properly.
-      if (Rest::has_interface (head))
+      if (has_interface<Rest> (head))
         d->translate_axis (head->extent (head, X_AXIS).length (), X_AXIS);
       else
         d->set_property ("X-offset", Grob::x_parent_positioning_proc);
index 4a443dec5c7dfe1bb975e3d435c37e65c0cceb6d..0abb39a7f2614b5bd0ab79e488b2159e46890f14 100644 (file)
@@ -80,7 +80,7 @@ Dynamic_align_engraver::create_line_spanner (Grob *cause)
 void
 Dynamic_align_engraver::acknowledge_end_dynamic (Grob_info info)
 {
-  if (Spanner::has_interface (info.grob ()))
+  if (has_interface<Spanner> (info.grob ()))
     ended_.push_back (info.spanner ());
 
   /* If the break flag is set, store the current spanner and let new dynamics
@@ -141,7 +141,7 @@ Dynamic_align_engraver::acknowledge_dynamic (Grob_info info)
     }
 
   create_line_spanner (info.grob ());
-  if (Spanner::has_interface (info.grob ()))
+  if (has_interface<Spanner> (info.grob ()))
     {
       started_.push_back (info.spanner ());
       current_dynamic_spanner_ = info.spanner ();
index 4b51d904140e9f0a6e4d87d716a5c534cf174308..edfd35fcb5912652b08a46dd3548da3cc5866ac6 100644 (file)
@@ -179,11 +179,11 @@ Dynamic_engraver::process_music ()
         }
       if (finished_spanner_)
         {
-          if (Hairpin::has_interface (finished_spanner_))
+          if (has_interface<Hairpin> (finished_spanner_))
             Pointer_group_interface::add_grob (finished_spanner_,
                                                ly_symbol2scm ("adjacent-spanners"),
                                                current_spanner_);
-          if (Hairpin::has_interface (current_spanner_))
+          if (has_interface<Hairpin> (current_spanner_))
             Pointer_group_interface::add_grob (current_spanner_,
                                                ly_symbol2scm ("adjacent-spanners"),
                                                finished_spanner_);
index 57593649d30332b79cbf9b8583107212646ddb28..dd551e38414078c28ad515f4c57fec667af3da61 100644 (file)
@@ -26,7 +26,6 @@
 
 struct Enclosing_bracket
 {
-  DECLARE_GROB_INTERFACE ();
 
 public:
   DECLARE_SCHEME_CALLBACK (print, (SCM));
index 371c4d24babd3dd1ceec00976acb1ab50edf5988..bb84bb3c3ef73f510332a7c7f9222e6130e88fca 100644 (file)
@@ -30,7 +30,6 @@
 
 struct Figured_bass_continuation
 {
-  DECLARE_GROB_INTERFACE ();
 
 public:
   DECLARE_SCHEME_CALLBACK (print, (SCM));
index 1e1ba55ffee9be9dbdfaa0f5710312dc61bc2103..4b90be8be01a2395624067d2d64d04d9e230048d 100644 (file)
@@ -38,7 +38,6 @@ public:
   DECLARE_SCHEME_CALLBACK (calc_y_offset, (SCM));
   DECLARE_SCHEME_CALLBACK (pure_calc_y_offset, (SCM, SCM, SCM));
   DECLARE_SCHEME_CALLBACK (calc_x_offset, (SCM));
-  DECLARE_GROB_INTERFACE ();
 
   static SCM internal_calc_y_offset (SCM smob, bool pure);
 };
@@ -187,7 +186,7 @@ Flag::internal_calc_y_offset (SCM smob, bool pure)
     = me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter"));
 
   Interval stem_extent = pure
-                         ? stem->pure_height (stem, 0, INT_MAX)
+                         ? stem->pure_y_extent (stem, 0, INT_MAX)
                          : stem->extent (stem, Y_AXIS);
 
   return scm_from_double (stem_extent.is_empty ()
index 26a9799b76c5963f3ee404f2422e63ff4da89d25..74e591254f4a96a820984bf50b5c56c5b37418e2 100644 (file)
@@ -38,7 +38,41 @@ init_fontconfig ()
   debug_output (_ ("Initializing FontConfig..."));
 
   /* TODO: Find a way for Fontconfig to update its cache, if needed. */
-  font_config_global = FcInitLoadConfig ();
+  FcInitLoadConfig ();
+
+  /* Create an empty configuration */
+  font_config_global = FcConfigCreate ();
+
+  /* fontconfig conf files */
+  vector<string> confs;
+
+  /* LilyPond local fontconfig conf file 00
+     This file is loaded *before* fontconfig's default conf. */
+  confs.push_back (lilypond_datadir + "/fonts/00-lilypond-fonts.conf");
+
+  /* fontconfig's default conf file */
+  void *default_conf = FcConfigFilename (NULL);
+  confs.push_back (static_cast<char*>(default_conf));
+  FcStrFree(static_cast<FcChar8*>(default_conf));
+
+  /* LilyPond local fontconfig conf file 99
+     This file is loaded *after* fontconfig's default conf. */
+  confs.push_back (lilypond_datadir + "/fonts/99-lilypond-fonts.conf");
+
+  /* Load fontconfig conf files */
+  for (vector<string>::const_iterator it = confs.begin ();
+       it != confs.end ();
+       it++)
+    {
+      if (!FcConfigParseAndLoad (font_config_global,
+                                 (FcChar8 *)it->c_str (),
+                                 FcFalse))
+        error (_f ("failed to add fontconfig configuration file `%s'",
+                   it->c_str ()));
+      else
+        debug_output (_f ("Adding fontconfig configuration file: %s",
+                          it->c_str ()));
+    }
 
   /* Extra trailing slash suddenly breaks fontconfig (fc-cache 2.5.0)
      on windows.  */
@@ -49,17 +83,6 @@ init_fontconfig ()
   else
     debug_output (_f ("Adding font directory: %s", dir.c_str ()));
 
-  string conf (lilypond_datadir + "/fonts/lilypond-fonts.conf");
-
-  if (!FcConfigParseAndLoad (font_config_global,
-                             (FcChar8 *)conf.c_str (),
-                             FcFalse))
-    error (_f ("failed adding fontconfig configuration file: %s",
-               conf.c_str ()));
-  else
-    debug_output (_f ("Adding fontconfig configuration file: %s",
-                      conf.c_str ()));
-
   debug_output (_ ("Building font database..."));
 
   FcConfigBuildFonts (font_config_global);
index 8535f7f2a672fc0c80c411bdc7589b4a55e8220c..756f174512417ef14a58e3722d2ec84ebb72356a 100644 (file)
 */
 
 #include <cstring>
+#include <map>
 using namespace std;
 
 #include "std-string.hh"
 #include "lily-guile.hh"
 #include "warn.hh"
 
+/* type predicates. */
+#include "global-context.hh"
+#include "input.hh"
+#include "item.hh"
+#include "music.hh"
+#include "music-function.hh"
+#include "paper-score.hh"
+#include "performance.hh"
+#include "spanner.hh"
+#include "stream-event.hh"
+#include "unpure-pure-container.hh"
+
 static SCM doc_hash_table;
 
 void
@@ -64,8 +77,6 @@ LY_DEFINE (ly_get_all_function_documentation, "ly:get-all-function-documentation
   return doc_hash_table;
 }
 
-#include <map>
-
 map<void *, string> type_names;
 
 void
@@ -87,18 +98,6 @@ predicate_to_typename (void *ptr)
     return type_names[ptr];
 }
 
-/* type predicates. */
-#include "global-context.hh"
-#include "input.hh"
-#include "item.hh"
-#include "music.hh"
-#include "music-function.hh"
-#include "paper-score.hh"
-#include "performance.hh"
-#include "spanner.hh"
-#include "stream-event.hh"
-#include "unpure-pure-container.hh"
-
 void
 init_func_doc ()
 {
index d51236b68150b5f958458bc13343782f56b20aea..a61f61df789162cd495cca4b73e202a995784019 100644 (file)
@@ -21,6 +21,8 @@
 #include "item.hh"
 #include "grid-line-interface.hh"
 
+#include "translator.icc"
+
 class Grid_line_span_engraver : public Engraver
 {
   Item *spanline_;
@@ -68,7 +70,6 @@ Grid_line_span_engraver::stop_translation_timestep ()
   lines_.resize (0);
 }
 
-#include "translator.icc"
 ADD_ACKNOWLEDGER (Grid_line_span_engraver, grid_point);
 ADD_TRANSLATOR (Grid_line_span_engraver,
                 /* doc */
index 8644f6f08315902e8597b596ad2d409b69a7669f..45b4ff2b359d7aca819c4ab074145eb9df430e4a 100644 (file)
@@ -22,6 +22,8 @@
 #include "grob.hh"
 #include "warn.hh"
 
+#include "translator.icc"
+
 struct Grob_pq_entry
 {
   Grob *grob_;
@@ -146,7 +148,6 @@ Grob_pq_engraver::start_translation_timestep ()
     context ()->set_property ("busyGrobs", busy);
 }
 
-#include "translator.icc"
 ADD_ACKNOWLEDGER (Grob_pq_engraver, grob);
 ADD_TRANSLATOR (Grob_pq_engraver,
                 /* doc */
index b6d07cb8c4dcbc8d939984d82cc550d30e330a2a..0924b0a58dab8699abde6cc5b2c87b104f86a6a5 100644 (file)
@@ -120,7 +120,7 @@ LY_DEFINE (ly_grob_pure_height, "ly:grob-pure-height",
   if (SCM_UNBNDP (val))
     val = SCM_EOL;
 
-  Interval retval = sc->pure_height (ref, scm_to_int (beg), scm_to_int (end));
+  Interval retval = sc->pure_y_extent (ref, scm_to_int (beg), scm_to_int (end));
 
   return ly_interval2scm (retval);
 }
index d5dcf6794dd90233209e94d924972f8fe5612815..2f1bd8aa9f52c463c274fa28ab6fe2fc60227d03 100644 (file)
@@ -157,10 +157,14 @@ Grob::get_print_stencil () const
         }
 
       /* Calls the scheme procedure stencil-whiteout-box in scm/stencils.scm */
-      if (!transparent && to_boolean (get_property ("whiteout-box")))
+      if (!transparent && (scm_is_number (get_property("whiteout-box"))
+                           || to_boolean (get_property ("whiteout-box"))))
         {
+          Real thickness = robust_scm2double (get_property("whiteout-box"), 0.0)
+               * layout ()->get_dimension (ly_symbol2scm ("line-thickness"));
           retval = *unsmob<Stencil>
-            (Lily::stencil_whiteout_box (retval.smobbed_copy ()));
+            (Lily::stencil_whiteout_box (retval.smobbed_copy (),
+                                     scm_from_double (thickness)));
         }
 
       if (transparent)
@@ -391,7 +395,7 @@ Grob::pure_relative_y_coordinate (Grob const *refp, int start, int end)
   if (Grob *p = get_parent (Y_AXIS))
     {
       Real trans = 0;
-      if (Align_interface::has_interface (p) && !dim_cache_[Y_AXIS].offset_)
+      if (has_interface<Align_interface> (p) && !dim_cache_[Y_AXIS].offset_)
         trans = Align_interface::get_pure_child_y_translation (p, this, start, end);
 
       return off + trans + p->pure_relative_y_coordinate (refp, start, end);
@@ -496,7 +500,7 @@ Grob::extent (Grob *refp, Axis a) const
 }
 
 Interval
-Grob::pure_height (Grob *refp, int start, int end)
+Grob::pure_y_extent (Grob *refp, int start, int end)
 {
   SCM iv_scm = get_pure_property ("Y-extent", start, end);
   Interval iv = robust_scm2interval (iv_scm, Interval ());
@@ -518,7 +522,7 @@ Grob::pure_height (Grob *refp, int start, int end)
 Interval
 Grob::maybe_pure_extent (Grob *refp, Axis a, bool pure, int start, int end)
 {
-  return (pure && a == Y_AXIS) ? pure_height (refp, start, end) : extent (refp, a);
+  return (pure && a == Y_AXIS) ? pure_y_extent (refp, start, end) : extent (refp, a);
 }
 
 Interval_t<int>
@@ -638,7 +642,7 @@ get_maybe_root_vertical_alignment (Grob *g, Grob *maybe)
 {
   if (!g)
     return maybe;
-  if (Align_interface::has_interface (g))
+  if (has_interface<Align_interface> (g))
     return get_maybe_root_vertical_alignment (g->get_parent (Y_AXIS), g);
   return get_maybe_root_vertical_alignment (g->get_parent (Y_AXIS), maybe);
 
@@ -657,8 +661,8 @@ Grob::get_vertical_axis_group (Grob *g)
     return 0;
   if (!g->get_parent (Y_AXIS))
     return 0;
-  if (Axis_group_interface::has_interface (g)
-      && Align_interface::has_interface (g->get_parent (Y_AXIS)))
+  if (has_interface<Axis_group_interface> (g)
+      && has_interface<Align_interface> (g->get_parent (Y_AXIS)))
     return g;
   return get_vertical_axis_group (g->get_parent (Y_AXIS));
 
@@ -965,11 +969,11 @@ robust_relative_extent (Grob *me, Grob *refpoint, Axis a)
 bool
 Grob::check_cross_staff (Grob *commony)
 {
-  if (Align_interface::has_interface (commony))
+  if (has_interface<Align_interface> (commony))
     return true;
 
   for (Grob *g = this; g && g != commony; g = g->get_parent (Y_AXIS))
-    if (Align_interface::has_interface (g))
+    if (has_interface<Align_interface> (g))
       return true;
 
   return false;
index a083062e392499c72bf4523a5f7b1e6fa9f6c325..01d8fd93dea61f696d5af6a189244517f4fca622 100644 (file)
@@ -185,7 +185,7 @@ Hairpin::print (SCM smob)
         }
       else
         {
-          if (Text_interface::has_interface (b))
+          if (has_interface<Text_interface> (b))
             {
               if (!e.is_empty ())
                 x_points[d] = e[-d] - d * padding;
@@ -214,7 +214,7 @@ Hairpin::print (SCM smob)
 
               if (neighbor_found)
                 {
-                  if (Hairpin::has_interface (adjacent))
+                  if (has_interface<Hairpin> (adjacent))
                     {
                       /*
                         Handle back-to-back hairpins with a circle in the middle
@@ -237,7 +237,7 @@ Hairpin::print (SCM smob)
               else
                 {
                   if (d == RIGHT // end at the left edge of a rest
-                      && Note_column::has_interface (b)
+                      && has_interface<Note_column> (b)
                       && Note_column::has_rests (b))
                     x_points[d] = e[-d];
                   else
index f5c36c5583f3e9b732e9cf740a9c0576e916994f..ef5e07ea663fcb857cca2d48d6c6be6cbe89e40e 100644 (file)
@@ -34,7 +34,6 @@ public:
   DECLARE_SCHEME_CALLBACK (height, (SCM));
   DECLARE_SCHEME_CALLBACK (remove_tied, (SCM));
 
-  DECLARE_GROB_INTERFACE ();
   static SCM get_stencil (Grob *me);
 };
 
index bb47efdb0a8a6c9958851968d49b257b85c22e18..4c362cbd93d1c1df2d1ba0f4e77613e74257b253 100644 (file)
@@ -35,7 +35,6 @@ public:
                                  vector<Grob *> *real_acc);
 
   DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 #endif /* ACCIDENTAL_PLACEMENT_HH */
 
index 66548410f4b3484a0018d23a9223411514d825a0..612c31c0d5bef18fc53c35575bcec351180b4c27 100644 (file)
@@ -40,7 +40,6 @@ public:
   static void add_element (Grob *, Grob *);
   static int get_count (Grob *, Grob *);
 
-  DECLARE_GROB_INTERFACE ();
 
   static Real get_pure_child_y_translation (Grob *, Grob *child, int start, int end);
 
index 6a59b5600066400d5b6c2b415938733f663b0a40..46245290982a9ea94712d1e9c611585fa1977cf5 100644 (file)
@@ -34,7 +34,6 @@ public:
   DECLARE_SCHEME_CALLBACK (brew_chord_slur, (SCM));
   DECLARE_SCHEME_CALLBACK (width, (SCM));
   DECLARE_SCHEME_CALLBACK (pure_height, (SCM, SCM, SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 #endif /* ARPEGGIO_HH */
index 13124cfc09162ce4e1216b1644b9c5feaf8bfd41..a4a9d8a0d1386a9fc87e2446ba107fecefb2f54a 100644 (file)
@@ -36,4 +36,10 @@ struct Audio_staff : public Audio_element
   vector<Audio_item *> audio_items_;
 };
 
+// Subtype to identify a staff that represents the "control track" of a MIDI
+// sequence (created by Control_track_performer).
+struct Audio_control_track_staff : public Audio_staff
+{
+};
+
 #endif // AUDIO_STAFF_HH
index 1987d9289bb0b3239184bcd9c95bdbd39508e3dc..5e5152d2378aa6e684c6c7e30f275f58eca8c711 100644 (file)
@@ -69,7 +69,6 @@ class Axis_group_interface
   static SCM calc_common (Grob *, Axis);
   static Real minimum_distance (Grob *, Grob *, Axis);
   static SCM calc_maybe_pure_staff_staff_spacing (Grob *, bool, int, int);
-  DECLARE_GROB_INTERFACE ();
 };
 
 #endif /* AXIS_GROUP_INTERFACE_HH */
index 1a157f3c447dad16f0c8230a4e0b3e6885f0c58c..ef3739faf007cd6cd72624b8ecbb08feaa07fb76 100644 (file)
@@ -26,7 +26,6 @@
 class Bar_line
 {
 public:
-  DECLARE_GROB_INTERFACE ();
 
   static bool non_empty_barline (Grob *me);
 };
index afa3a805ab71ca1a82e64516aeb83fbf464ba80f..6dbdf4b23f626b1958655695e8001f9908a4b4e7 100644 (file)
@@ -57,7 +57,6 @@ public:
   static int normal_stem_count (Grob *);
   static Grob *first_normal_stem (Grob *);
   static Grob *last_normal_stem (Grob *);
-  DECLARE_GROB_INTERFACE ();
   static void add_stem (Grob *, Grob *);
   static bool is_cross_staff (Grob *);
   static bool is_knee (Grob *);
index 5eba16efeece5218d6a5d016adc64d871311ad3f..cbb7f00c7441c2397043a8bb16fe781c8407b97e 100644 (file)
@@ -27,7 +27,6 @@ class Break_alignment_interface
 {
 public:
   static vector<Grob *> ordered_elements (Grob *me);
-  DECLARE_GROB_INTERFACE ();
   static void add_element (Grob *me, Grob *add);
   static SCM break_align_order (Item *me);
   DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM element));
@@ -38,13 +37,11 @@ struct Break_aligned_interface
   DECLARE_SCHEME_CALLBACK (calc_average_anchor, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_extent_aligned_anchor, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_break_visibility, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 struct Break_alignable_interface
 {
   DECLARE_SCHEME_CALLBACK (self_align_callback, (SCM element));
-  DECLARE_GROB_INTERFACE ();
 };
 
 #endif // BREAK_ALIGN_INTERFACE_HH
index 5718bf24733570f53b415e79098f83cfa47fd7a0..84b33cd1b3547d9ca9557b2691ba1e3139aead57 100644 (file)
@@ -27,7 +27,6 @@ public:
   DECLARE_SCHEME_CALLBACK (finalis, (SCM));
   DECLARE_SCHEME_CALLBACK (offset_callback, (SCM element));
 
-  DECLARE_GROB_INTERFACE ();
 };
 
 #endif // BREATHING_SIGN_HH
index 5a289e223f8190e244077c740c8c8ab64c70a45e..0df71f2fb47b39d23c91915bb7f68815bab15691 100644 (file)
@@ -27,7 +27,6 @@ class Chord_name
 {
 public:
   DECLARE_SCHEME_CALLBACK (after_line_breaking, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 #endif // CHORD_NAME_HH
index 240086ce8b3e573b54456022f7d779337995c58f..8e3d10c0d38d15e4c3fb38a7ed777a7d074d1dc4 100644 (file)
@@ -27,7 +27,6 @@ struct Clef
 {
   DECLARE_SCHEME_CALLBACK (calc_glyph_name, (SCM));
   DECLARE_SCHEME_CALLBACK (print, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 #endif /* CLEF_HH */
index b9d6cf0e07898f5111bbf42a0c1caf9d84a2d199..81aec746f96f0936035495403e7f214badf56c2c 100644 (file)
@@ -28,7 +28,6 @@ class Cluster
 public:
   DECLARE_SCHEME_CALLBACK (print, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_cross_staff, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 #endif // CLUSTER_HH
index fcb9e9e146f610691eae67d064d3ecb267e94c45..ddf38b0b8aa6407605e8f1a576b5fc4ab67b3c70 100644 (file)
@@ -26,7 +26,6 @@
 struct Custos
 {
   DECLARE_SCHEME_CALLBACK (print, (SCM));
-  DECLARE_GROB_INTERFACE ();
 
 private:
   static void add_streepjes (Grob *me, int pos, int interspaces, Stencil *custos_);
index a816f426ae7e74b520c409ff125168c9c7e0f16d..6c975b1c561963ebae652bec85ab9f49a9929176 100644 (file)
@@ -34,7 +34,6 @@ public:
   static int compare (Grob *const &, Grob *const &);
   static void add_head (Grob *dotcol, Grob *rh);
 
-  DECLARE_GROB_INTERFACE ();
   DECLARE_SCHEME_CALLBACK (side_position, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM));
 };
index fdd0673af9821797669e73ade3dba919455b1961..7e1a1f6b524bd772acdcd4b9d33f720691bb93df 100644 (file)
@@ -27,7 +27,6 @@ class Dots
 {
 public:
   DECLARE_SCHEME_CALLBACK (print, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 #endif // DOTS_HH
index e7d47c0b43fc6f9d005b62a88fca0488e6129f20..f422da99ebe7444dc21e89e23a110ddd3fea4ddd 100644 (file)
@@ -28,7 +28,6 @@ struct Fingering_column
 {
   static void add_fingering (Grob *, Grob *);
   DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM));
-  DECLARE_GROB_INTERFACE ();
   static void do_x_positioning (Grob *me);
   static void do_y_positioning (Grob *me);
 };
index 96b6b0b8d942284495bc617c69d5d4e3571b4e16..43fd271dd6ae633eb7a20860111422a9b043c046 100644 (file)
@@ -28,7 +28,6 @@ struct Font_interface
   static SCM text_font_alist_chain (Grob *);
   static SCM music_font_alist_chain (Grob *);
   static Font_metric *get_default_font (Grob *);
-  DECLARE_GROB_INTERFACE ();
 };
 
 #endif /* FONT_INTERFACE_HH */
index b0cfd7afda3ec4e44761d25bbf4b49b906202d47..00894341632fd00ad4e3492599d92179be491a2c 100644 (file)
@@ -27,7 +27,6 @@ class Grob;
 class Gregorian_ligature
 {
 public:
-  DECLARE_GROB_INTERFACE ();
   static string prefixes_to_str (Grob *);
 };
 
index 75ed7a7cdfc5515042f4e1e8324a45e5bc2bff95..2a4760a7177289d4d9d14a06e5e82b787821f7c2 100644 (file)
@@ -29,13 +29,11 @@ public:
   static void add_grid_point (Grob *me, Grob *b);
   DECLARE_SCHEME_CALLBACK (print, (SCM));
   DECLARE_SCHEME_CALLBACK (width, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 class Grid_point_interface
 {
 public:
-  DECLARE_GROB_INTERFACE ();
 };
 
 #endif /* GRID_LINE_INTERFACE_HH */
index fc9e58c4a28c3b3d53f0a2143f5d31cd910c2db1..9c3eadb4b06b7deccf252f2cabfbe65f4cc91fa1 100644 (file)
 
 #include "lily-guile.hh"
 
-#define DECLARE_GROB_INTERFACE() \
-  static SCM interface_symbol_;    \
-  static bool has_interface (Grob*)
-
-#define ADD_INTERFACE(cl, b, c)                         \
-  SCM cl::interface_symbol_; \
-  bool cl::has_interface (Grob *me)                             \
-  {                                                             \
-    return me->internal_has_interface (interface_symbol_);      \
-  }                                                             \
-  void cl ## _init_ifaces ()                                    \
-  {                                                             \
-    cl::interface_symbol_ = add_interface (#cl, b, c);          \
-  }                                                             \
-  ADD_SCM_INIT_FUNC (cl ## ifaces, cl ## _init_ifaces);
+class Grob;
+
+#define ADD_INTERFACE(cl, b, c)                                 \
+  Grob_interface<cl> cl ## _interface_initializer;              \
+  template <> char const *Grob_interface<cl>::cxx_name_ (#cl);  \
+  template <> char const *Grob_interface<cl>::description_ (b); \
+  template <> char const *Grob_interface<cl>::variables_ (c);
 
 SCM add_interface (char const *cxx_name,
                    char const *descr,
@@ -46,5 +38,33 @@ SCM ly_add_interface (SCM, SCM, SCM);
 void internal_add_interface (SCM, SCM, SCM);
 SCM ly_all_grob_interfaces ();
 
+template <class Interface>
+class Grob_interface
+{
+public:
+  Grob_interface ()
+  {
+    add_scm_init_func (Grob_interface::init);
+  }
+
+private:
+  static void init ()
+  {
+    interface_symbol_ = ::add_interface (cxx_name_, description_, variables_);
+  }
+
+  template <class T>
+  friend bool has_interface(Grob *);
+
+private:
+  static SCM interface_symbol_;
+  static char const *cxx_name_;
+  static char const *description_;
+  static char const *variables_;
+};
+
+template <class Interface>
+SCM Grob_interface<Interface>::interface_symbol_;
+
 #endif /* INTERFACE_HH */
 
index 819c86c287af033314adec15a6249e9093ad4868..db51e02e73cb0a0c5ec6ce1f4e91d56d5bc69bbe 100644 (file)
@@ -137,7 +137,6 @@ public:
 
   /* interfaces */
   bool internal_has_interface (SCM intf);
-  DECLARE_GROB_INTERFACE ();
 
   /* offsets */
   void translate_axis (Real, Axis);
@@ -148,7 +147,7 @@ public:
   /* extents */
   Interval extent (Grob *refpoint, Axis) const;
   void flush_extent_cache (Axis);
-  virtual Interval pure_height (Grob *refpoint, int start_col, int end_col);
+  virtual Interval pure_y_extent (Grob *refpoint, int start, int end);
   Interval maybe_pure_extent (Grob *refpoint, Axis, bool pure, int start, int end);
 
   /* refpoints */
@@ -175,6 +174,12 @@ public:
   static SCM internal_skylines_from_element_stencils (SCM, Axis);
 };
 
+template <class T>
+inline bool has_interface(Grob *g)
+{
+  return g && g->internal_has_interface (Grob_interface<T>::interface_symbol_);
+}
+
 /* unification */
 void uniquify (vector <Grob *> &);
 
index 8807bc8cc81c893f6af490450f2c87ee6449a69d..a2e2f8bf9e9ee2fa26860067cedaa87ba26ff2c2 100644 (file)
@@ -30,7 +30,6 @@ public:
   DECLARE_SCHEME_CALLBACK (print, (SCM));
   DECLARE_SCHEME_CALLBACK (broken_bound_padding, (SCM));
   DECLARE_SCHEME_CALLBACK (pure_height, (SCM, SCM, SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 #endif // HAIRPIN_HH
index b8ccba5beed63ec346634eea4ecafce578245715..ad5c1d64a27448d75351a1a2bb7f6748f8344b03 100644 (file)
@@ -31,7 +31,6 @@ public:
   DECLARE_SCHEME_CALLBACK (calc_skylines, (SCM smob));
   DECLARE_SCHEME_CALLBACK (pure_height, (SCM smob, SCM start, SCM end));
   DECLARE_SCHEME_CALLBACK (force_hara_kiri_in_y_parent_callback, (SCM));
-  DECLARE_GROB_INTERFACE ();
   static bool request_suicide (Grob *me, int start, int end);
   static bool request_suicide_alone (Grob *me, int start, int end);
   static void consider_suicide (Grob *me);
index e2fbb22b09e64ea6255b3e6f876f1bba029d1fd6..3a1692fc1124b216e04c253f064263cfa27bf0e9 100644 (file)
@@ -31,7 +31,6 @@ struct Horizontal_bracket
   static Stencil make_enclosing_bracket (Grob *me, Grob *refpoint,
                                          vector<Grob *> grobs,
                                          Axis a, Direction dir);
-  DECLARE_GROB_INTERFACE ();
 };
 
 #endif /* HORIZONTAL_BRACKET_HH */
index 3b13ed8477b804e6a108f5e93e88a345e8a3a5a5..07f1261a525c72fca408cd4085d26c0df80da42d 100644 (file)
@@ -52,9 +52,8 @@ public:
   virtual Paper_column *get_column () const;
   virtual void handle_prebroken_dependencies ();
   virtual Interval_t<int> spanned_rank_interval () const;
-  virtual Interval pure_height (Grob *ref, int start, int end);
+  virtual Interval pure_y_extent (Grob *ref, int start, int end);
   virtual void cache_pure_height (Interval height);
-  DECLARE_GROB_INTERFACE ();
 protected:
   virtual void discretionary_processing ();
   void copy_breakable_items ();
index a74387a89bd0c5708e76ce2aa9acfd4a19cc29b0..d3d425a515329bed5cf1948f3d4bec5e6731aed8 100644 (file)
@@ -26,7 +26,6 @@
 struct Kievan_ligature
 {
   DECLARE_SCHEME_CALLBACK (print, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 #endif /* KIEVAN_LIGATURE_HH */
index afb6beba2a3bf3ac5947c1507003ff1d300c0c37..f574b39c3f25c0ecb69523bbce3bef8437d28742 100644 (file)
@@ -86,7 +86,6 @@ class Ligature_engraver;
 class Lily_lexer;
 class Lily_parser;
 class Listener;
-class Lookup;
 class Lyric_combine_music;
 class Lyric_combine_music_iterator;
 class Lyric_engraver;
index f45aca5b221d36fd5b297f9d634b235413d4eba9..b805f7262af464722ea8ea03db1e51fe5a16c731 100644 (file)
@@ -26,7 +26,6 @@
 struct Line_interface
 {
   static Stencil line (Grob *me, Offset from, Offset to);
-  DECLARE_GROB_INTERFACE ();
   static Stencil make_zigzag_line (Grob *me,
                                    Offset from,
                                    Offset to);
index 3c9c19d7dee28756f628d4f845f6cb673b4244f2..5b7614531625c0bb02099c3618bcdf8b3d054409 100644 (file)
 #include "stencil.hh"
 #include "std-vector.hh"
 
-struct Lookup
+namespace Lookup
 {
-  static Stencil bracket (Axis a, Interval iv, Real thick, Real protrude, Real blot);
-  static Stencil circle (Real rad, Real thick, bool filled);
-  static Stencil rotated_box (Real slope, Real width, Real thick, Real blot);
-  static Stencil round_filled_polygon (vector<Offset> const &points, Real blotdiameter);
-  static Stencil frame (Box b, Real thick, Real blot);
-  static Stencil slur (Bezier controls, Real cthick, Real thick,
+  Stencil bracket (Axis a, Interval iv, Real thick, Real protrude, Real blot);
+  Stencil circle (Real rad, Real thick, bool filled);
+  Stencil rotated_box (Real slope, Real width, Real thick, Real blot);
+  Stencil round_filled_polygon (vector<Offset> const &points, Real blotdiameter);
+  Stencil frame (Box b, Real thick, Real blot);
+  Stencil slur (Bezier controls, Real cthick, Real thick,
                        SCM dash_definition);
-  static Stencil bezier_sandwich (Bezier top_curve, Bezier bottom_curve,
+  Stencil bezier_sandwich (Bezier top_curve, Bezier bottom_curve,
                                   Real thickness);
-  static Stencil beam (Real slope, Real width, Real thick, Real blot);
-  static Stencil blank (Box b);
-  static Stencil filled_box (Box b);
-  static Stencil round_filled_box (Box b, Real blotdiameter);
-  static Stencil repeat_slash (Real w, Real slope, Real th);
-  static Stencil horizontal_line (Interval w, Real th);
-  static Stencil triangle (Interval iv, Real thick, Real protrude);
-  static Stencil points_to_line_stencil (Real thick, vector<Offset> const &points);
+  Stencil beam (Real slope, Real width, Real thick, Real blot);
+  Stencil blank (Box b);
+  Stencil filled_box (Box b);
+  Stencil round_filled_box (Box b, Real blotdiameter);
+  Stencil repeat_slash (Real w, Real slope, Real th);
+  Stencil horizontal_line (Interval w, Real th);
+  Stencil triangle (Interval iv, Real thick, Real protrude);
+  Stencil points_to_line_stencil (Real thick, vector<Offset> const &points);
 };
 
 #endif // LOOKUP_HH
index 88135421e4de30f32aa6dd8f5702ca5d38d5c1dd..8ae8c975531a34cdad61e4e9a41edc170c93684b 100644 (file)
@@ -27,7 +27,6 @@
 class Lyric_extender
 {
 public:
-  DECLARE_GROB_INTERFACE ();
   DECLARE_SCHEME_CALLBACK (print, (SCM));
 };
 
index 95418bc36ad1e856923fbeb2681061196f8e3d91..fb03c6df5161b59de5a119be9c166b5612b8c2cf 100644 (file)
@@ -27,7 +27,6 @@ struct Lyric_hyphen
 {
 public:
   DECLARE_SCHEME_CALLBACK (set_spacing_rods, (SCM));
-  DECLARE_GROB_INTERFACE ();
   DECLARE_SCHEME_CALLBACK (print, (SCM));
 };
 
index 44eb334b17e2f546aab2f133e345c062d1f51183..0e67f228228ad2238999b5063803b6732c38370a 100644 (file)
@@ -28,7 +28,6 @@ class Measure_grouping
 public:
   DECLARE_SCHEME_CALLBACK (print, (SCM));
 
-  DECLARE_GROB_INTERFACE ();
 };
 
 #endif /* MEASURE_GROUPING_SPANNER_HH */
index 4609a4c90d794a6d1f059974b0b5f00dbe2cc624..6ce6a2733b2a6fb933a3ed83d40de2eac2910243 100644 (file)
@@ -26,7 +26,6 @@
 class Melody_spanner
 {
 public:
-  DECLARE_GROB_INTERFACE ();
   static void add_stem (Grob *, Grob *);
   DECLARE_SCHEME_CALLBACK (calc_neutral_stem_direction, (SCM));
 };
index 97b8e2e21682a5eecd7863e28537a987d91609dd..3e4e46a6412524387ed4a9b4b31ebcbee14b9784 100644 (file)
@@ -45,7 +45,6 @@ struct Mensural_ligature
 {
   DECLARE_SCHEME_CALLBACK (brew_ligature_primitive, (SCM));
   DECLARE_SCHEME_CALLBACK (print, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 #endif /* MENSURAL_LIGATURE_HH */
index bf3c7083a77e1d1b96d4b765ee47a35adc348877..f4d379ade4a639c3a6ac39c6bebee33507434874 100644 (file)
@@ -26,7 +26,6 @@
 class Multi_measure_rest
 {
 public:
-  DECLARE_GROB_INTERFACE ();
   DECLARE_SCHEME_CALLBACK (print, (SCM));
   DECLARE_SCHEME_CALLBACK (height, (SCM));
   DECLARE_SCHEME_CALLBACK (percent, (SCM));
index fcdece0a59e69be00d229fd2fa78b9739b606819..ad2ed5345d3575f775e17bbb0585f764c4ce4594 100644 (file)
@@ -44,6 +44,5 @@ public:
   static Drul_array<vector<Grob *> > get_clash_groups (Grob *me);
   DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM smob));
   static void add_column (Grob *me, Grob *ncol);
-  DECLARE_GROB_INTERFACE ();
 };
 #endif // COLLISION_HH
index cd09b076afe2d36942c425ee0f9344c1e5e16b55..1cf08545bf4c48f4adffb75df8ea9446590381e5 100644 (file)
@@ -43,7 +43,6 @@ public:
   static bool has_rests (Grob *me);
   static Grob *dot_column (Grob *me);
   static Interval cross_staff_extent (Grob *me, Grob *refp);
-  DECLARE_GROB_INTERFACE ();
 
   static Item *get_stem (Grob *);
   static Item *get_flag (Grob *);
index d14fbcfe775e2a86f813f9f8d2af99ec4570e3aa..1e167d58b284b36835ee43e6f0408e380f4bb3af 100644 (file)
@@ -30,7 +30,6 @@ public:
   DECLARE_SCHEME_CALLBACK (stem_x_shift, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_stem_attachment, (SCM));
   DECLARE_SCHEME_CALLBACK (include_ledger_line_height, (SCM));
-  DECLARE_GROB_INTERFACE ();
 
   static Real stem_attachment_coordinate (Grob *, Axis a);
   static int get_balltype (Grob *);
index 7fde934f512a8ddf1b46a877eda984cccd19f11e..df063b382ea3df66c8739a0209f3f52f56c95b3b 100644 (file)
@@ -27,7 +27,6 @@
 class Note_spacing
 {
 public:
-  DECLARE_GROB_INTERFACE ();
 
   static Spring get_spacing (Grob *me, Item *, Spring, Real);
   static void stem_dir_correction (Grob *me, Item *next_col, Real incr,
index 03c503f9a831b829675a5ac278040a6800f252e7..f1cb01e740685bcf11f9463e82a42466501d01f0 100644 (file)
@@ -50,7 +50,6 @@ public:
   DECLARE_SCHEME_CALLBACK (print, (SCM));
   DECLARE_SCHEME_CALLBACK (before_line_breaking, (SCM));
 
-  DECLARE_GROB_INTERFACE ();
   static int get_rank (Grob const *);
   static bool is_musical (Grob *);
   static Moment when_mom (Grob *);
index 448b8110346dfe262b54494c72e9a284205402e6..85b1cdb446041243f4012983abcca6158c14c096 100644 (file)
@@ -26,7 +26,6 @@
 class Percent_repeat_item_interface
 {
 public:
-  DECLARE_GROB_INTERFACE ();
   DECLARE_SCHEME_CALLBACK (beat_slash, (SCM));
   DECLARE_SCHEME_CALLBACK (double_percent, (SCM));
   static Stencil x_percent (Grob *, int);
index 3f9c5d6f1ba044d2e00fb7a92f33dc61baa720cb..f9c53ff2e85e7baa70007deb34e59c18d5697d28 100644 (file)
@@ -31,19 +31,25 @@ public:
   ~Performance ();
   DECLARE_CLASSNAME (Performance);
 
+  SCM get_header () const;
+  void set_header (SCM header);
+
+  virtual void derived_mark () const;
+
   void add_element (Audio_element *p);
   virtual void process ();
   void remap_grace_durations ();
-  void output (Midi_stream &midi_stream) const;
+  void output (Midi_stream &midi_stream, const string &performance_name) const;
   void output_header_track (Midi_stream &midi_stream) const;
 
   void print () const;
-  void write_output (string filename) const;
+  void write_output (string filename, const string &performance_name) const;
 
   vector<Audio_staff *> audio_staffs_;
   vector<Audio_element *> audio_elements_;
   Output_def *midi_;
   bool ports_;
+  SCM header_;
 };
 
 #endif /* PERFORMANCE_HH */
index ec53a97f473ff2e1044f90ccd5653e3f79434287..f125d217e4dbf1e13afa46fb832f4c4f29855123 100644 (file)
@@ -27,7 +27,6 @@ class Pure_from_neighbor_interface
 {
 public:
   DECLARE_SCHEME_CALLBACK (calc_pure_relevant_grobs, (SCM));
-  DECLARE_GROB_INTERFACE ();
 
 };
 
index b9cfc17b8ef23e961be9026de36b76f77f4b3bdf..3946f9b93306b128429cae35892c11a7bc3412a9 100644 (file)
@@ -28,7 +28,6 @@ class Rest_collision
 public:
   static void add_column (Grob *me, Grob *);
 
-  DECLARE_GROB_INTERFACE ();
   DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM element));
   DECLARE_SCHEME_CALLBACK (force_shift_callback_rest, (SCM element, SCM off));
   static SCM do_shift (Grob *);
index 548e031e557e8171b4fe3e91e17b5c72cd4e930e..644aa1450c7bf904d203f444424d82f3eef7b24f 100644 (file)
@@ -29,7 +29,6 @@ class Rest
 public:
   DECLARE_SCHEME_CALLBACK (y_offset_callback, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_cross_staff, (SCM));
-  DECLARE_GROB_INTERFACE ();
   static string glyph_name (Grob *, int durlog, const string &style, bool, Real);
   static Real staff_position_internal (Grob *, int /* duration_log */,
                                        int /* dir */);
index e7cb7cfc4a1c8ec8cd1f521e65cff75291d299bf..17eecd4f22b8c567717d5502bf65df83a428dc0c 100644 (file)
@@ -32,7 +32,6 @@ public:
   static Item *get_dots (Grob *);
   static int dot_count (Grob *);
   DECLARE_SCHEME_CALLBACK (after_line_breaking, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 #endif // RHYTHMIC_HEAD_HH
index 51f2eb9206ecbf2d73528e69402933d1f2639c24..fe4816eae16d3bc797b490bad6969db5096b1315 100644 (file)
@@ -30,7 +30,6 @@ public:
   static void add_side_positioned (Grob *, Grob *);
   DECLARE_SCHEME_CALLBACK (before_line_breaking, (SCM));
   DECLARE_SCHEME_CALLBACK (row_before_line_breaking, (SCM));
-  DECLARE_GROB_INTERFACE ();
   static void order_grobs (vector<Grob *> grobs);
 
 };
index 2839010b0d9106bc6d8bc1bbcf8036b71ce9b988..9154aea6cc4a991881b03afb6a1861616d5a57f5 100644 (file)
@@ -34,7 +34,6 @@ public:
   static Stencil get_stencil (Grob *, Direction d);
   static Direction get_direction (Grob *);
 
-  DECLARE_GROB_INTERFACE ();
   DECLARE_SCHEME_CALLBACK (print, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_direction, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM));
index ffdfb825015366b1aef10403b5157360856f9ef6..4cf683fd36e58c0851bf15e063ea5136220cfebf 100644 (file)
@@ -25,7 +25,6 @@
 
 struct Self_alignment_interface
 {
-  DECLARE_GROB_INTERFACE ();
 
   static SCM aligned_on_self (Grob *me, Axis a, bool pure, int start, int end);
   static SCM centered_on_object (Grob *me, Axis a);
index 7ad63e80d17ec6f85a720f4ef193b4def2ace38f..e02b57a11eac323ef24522cdcfc8f11c8f602564 100644 (file)
@@ -26,7 +26,6 @@
 
 struct Semi_tie_column
 {
-  DECLARE_GROB_INTERFACE ();
 
   DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_head_direction, (SCM));
index 97a3dcbe04cf3b98ba218c75b8a4e6e05cf5abb7..1e8db8bdb85fb590722fded7351e43448fe1e988 100644 (file)
@@ -25,7 +25,6 @@
 
 struct Semi_tie
 {
-  DECLARE_GROB_INTERFACE ();
 
   DECLARE_SCHEME_CALLBACK (calc_control_points, (SCM));
   static bool less (Grob *s1, Grob *s2);
index f78fd0d6a945a3b245ed0df4cbd73bba399f4a35..81ea523fe29b649807323bbdcb99eb3ea1c097f2 100644 (file)
@@ -27,7 +27,6 @@
 
 struct Separation_item
 {
-  DECLARE_GROB_INTERFACE ();
   DECLARE_SCHEME_CALLBACK (calc_skylines, (SCM));
   DECLARE_SCHEME_CALLBACK (print, (SCM));
 
index c98189f0875bb09976e25e4d3de43a36791dde3f..c0330e795d1497bf5c4ecbb1b24bdcf25a7751c6 100644 (file)
@@ -42,7 +42,6 @@ public:
 
   static Axis get_axis (Grob *);
   static void set_axis (Grob *, Axis);
-  DECLARE_GROB_INTERFACE ();
   static void add_support (Grob *, Grob *);
   static void recursive_add_support (Grob *, Grob *);
   static void add_staff_support (Grob *);
index 000c07dce82945320002b99979d1add1f787d2db..ae85ac24d3c769253e98390535b880eb1d67e27c 100644 (file)
@@ -41,7 +41,6 @@ public:
   DECLARE_SCHEME_CALLBACK (pure_outside_slur_callback, (SCM, SCM, SCM, SCM));
   DECLARE_SCHEME_CALLBACK (outside_slur_cross_staff, (SCM, SCM));
   DECLARE_SCHEME_CALLBACK (calc_cross_staff, (SCM));
-  DECLARE_GROB_INTERFACE ();
   static Bezier get_curve (Grob *me);
 };
 
index ba219c28a987f047a371e675248033028e7f3ce5..5c6427e6589c7c8b15d7bef5e8b9024c3dd5a410 100644 (file)
@@ -31,7 +31,6 @@ struct Spaceable_grob
   static void add_spring (Grob *me, Grob *to, Spring sp);
   static Spring get_spring (Grob *me, Grob *other);
 
-  DECLARE_GROB_INTERFACE ();
   static SCM get_minimum_distances (Grob *);
   static SCM get_ideal_distances (Grob *);
 };
index 2ade005a22260363ec25471987646e3a780986f7..ddfe2efb1c43b48aed07249933cd37adfa3b922f 100644 (file)
@@ -32,7 +32,6 @@ struct Spacing_interface
   static Drul_array<Skyline> skylines (Grob *me, Grob *right_col);
   static Grob *extremal_break_aligned_grob (Grob *me, Direction, Direction, Interval *);
 
-  DECLARE_GROB_INTERFACE ();
 };
 
 #endif /* SPACING_INTERFACE_HH */
index 61ed8dc4ac0c3ee8ac5df1b8262e5997f992f1e1..fcfba904175f8a4a830306f557dd587f6bb8c4e8 100644 (file)
@@ -50,7 +50,6 @@ public:
 
   DECLARE_SCHEME_CALLBACK (set_springs, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_common_shortest_duration, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 #endif /* SPACING_SPANNER_HH */
index 7ee27abcb19208d0218d53062f8aeda1d12cba66..79032dfb305c2d52dc2eef5f3d057e52565240c7 100644 (file)
@@ -76,7 +76,6 @@ public:
   static bool less (Spanner *const &, Spanner *const &);
   virtual Grob *find_broken_piece (System *) const;
   virtual void derived_mark () const;
-  DECLARE_GROB_INTERFACE ();
   virtual System *get_system () const;
 
   SCM get_cached_pure_property (SCM sym, int start, int end);
index 3ad0ccf5681831a974bef78061795d3ff9d2d3b8..0e00d4280f72b64fc635290b07d559b4d5b64f15 100644 (file)
@@ -25,7 +25,6 @@
 class Staff_grouper_interface
 {
 public:
-  DECLARE_GROB_INTERFACE ();
 
   static bool maybe_pure_within_group (Grob *, Grob *child, bool, int, int);
 };
index 521be99d19c88538069321c1ad6e36a3de446d0c..11a81a998eef5027c792d3735ab314f70b1620d8 100644 (file)
@@ -30,7 +30,6 @@ class Staff_spacing
   static Real next_notes_correction (Grob *, Grob *);
 
 public:
-  DECLARE_GROB_INTERFACE ();
   static Spring get_spacing (Grob *, Grob *, Real);
   static Interval bar_y_positions (Grob *);
 };
index 3c5f55b836aa78b957de6fb223e107748ad85179..64d41014d70ae28a6041e940a0b124338f125a2a 100644 (file)
@@ -30,7 +30,6 @@
 class Staff_symbol_referencer
 {
 public:
-  DECLARE_GROB_INTERFACE ();
   static bool ugly_hack (Grob *);
   static void set_position (Grob *, Real);
   static void pure_set_position (Grob *, Real);
index 19e826d3d0620fa953bb2805be3344ee18157fd5..9454ebe7f445a53c72f7284c1e7bfb5a6cd9280e 100644 (file)
@@ -40,6 +40,5 @@ public:
   static Interval line_span (Grob *);
   DECLARE_SCHEME_CALLBACK (print, (SCM));
   DECLARE_SCHEME_CALLBACK (height, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 #endif // STAFF_SYMBOL_HH
index 2495bb695a8bb422b65521e4633c737c20beeacb..ead984dc38a6bb9bb0bc94572156c487ec8592e0 100644 (file)
@@ -27,7 +27,6 @@ class Stem_tremolo
 {
 public:
 
-  DECLARE_GROB_INTERFACE ();
   DECLARE_SCHEME_CALLBACK (calc_slope, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_width, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_y_offset, (SCM));
index 0aeb83ee6aa88e2356bc77c443c8d795ba5be589..7c4612552a13d6c3ea34545b2ff35ef69fae1890 100644 (file)
@@ -58,7 +58,6 @@ public:
   static Real internal_calc_stem_end_position (Grob *, bool);
   static Real internal_calc_stem_begin_position (Grob *, bool);
 
-  DECLARE_GROB_INTERFACE ();
   static void set_spacing_hints (Grob *);
   static Grob *flag (Grob *);
 
index 3e1848c530b7561244b3aebc5180369fbddf9373..bf1fd0d28c11d004d60b1bbbfd7de7b5de0708ec 100644 (file)
@@ -31,7 +31,6 @@ class System_start_delimiter
 public:
   DECLARE_SCHEME_CALLBACK (print, (SCM));
 
-  DECLARE_GROB_INTERFACE ();
   static void try_collapse (Grob *);
   static Stencil staff_bracket (Grob *, Real);
   static Stencil old_staff_bracket (Grob *, Real);
index 84b39bd02fa394fb121b6546b1659b177c51bf91..4e402ffeca5c40ead781a964ce5d8f2dd34bad18 100644 (file)
@@ -74,7 +74,6 @@ public:
   int spanner_count () const;
 
   void break_into_pieces (vector<Column_x_positions> const &);
-  DECLARE_GROB_INTERFACE ();
 
   vector<Item *> broken_col_range (Item const *, Item const *) const;
   vector<Grob *> used_columns () const;
index f8f86d6f33225219388586ba74a1a1d24f9cd5cb..c653495be892c89a5495e1c52a3fe752c5a4acf2 100644 (file)
@@ -30,7 +30,6 @@ public:
   DECLARE_SCHEME_CALLBACK (print, (SCM));
   DECLARE_SCHEME_CALLBACK (interpret_markup, (SCM, SCM, SCM));
   DECLARE_SCHEME_CALLBACK (interpret_string, (SCM, SCM, SCM));
-  DECLARE_GROB_INTERFACE ();
   static bool is_markup (SCM);
   static bool is_markup_list (SCM);
 };
index 0485cd0bcf3c96607b23153ca394b2d0c939642f..025cf8433aced03c419f2e70c8f001b6b965533d 100644 (file)
@@ -26,7 +26,6 @@
 class Tie_column
 {
 public:
-  DECLARE_GROB_INTERFACE ();
   static void add_tie (Grob *me, Spanner *);
   DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM));
   DECLARE_SCHEME_CALLBACK (before_line_breaking, (SCM));
index 186c0a4d386dc7f27a33156c3296ebf54528f351..e92ca6194704db6fcc29c19ec73ea5f8b6d7e1a2 100644 (file)
@@ -28,7 +28,6 @@ class Tie
 {
 public:
   static void set_head (Spanner *, Direction, Grob *head);
-  DECLARE_GROB_INTERFACE ();
   static Item *head (Spanner *, Direction);
   static int get_column_rank (Spanner *, Direction);
   static int get_position (Spanner *);
index 72daae4da9990aa7c942617ffc04b57008764e04..1e41154fbf32dfd03755ffd524cf1a6de81a8230 100644 (file)
@@ -34,7 +34,6 @@ public:
   DECLARE_SCHEME_CALLBACK (calc_connect_to_neighbors, (SCM smob));
   DECLARE_SCHEME_CALLBACK (calc_cross_staff, (SCM));
 
-  DECLARE_GROB_INTERFACE ();
   static Grob *get_common_x (Spanner *);
   static void add_tuplet_bracket (Grob *me, Grob *smaller_bracket);
   static void get_bounds (Grob *, Grob **, Grob **);
index 9780beefb29491baec0146f0f60912045253a935..24ba77a37712efee55a98be041e215e02135a79d 100644 (file)
@@ -30,7 +30,6 @@ struct Tuplet_number
   DECLARE_SCHEME_CALLBACK (calc_x_offset, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_y_offset, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_cross_staff, (SCM));
-  DECLARE_GROB_INTERFACE ();
 
   static Real calc_offset (Spanner *me, Axis a); // not used
 
index 912b54decea2dc05c2e1f0467cc70f5e390aa55d..25e994753f8686a7e5d88313ab1af7f8e4b0516b 100644 (file)
@@ -27,7 +27,6 @@ struct Vaticana_ligature
 {
   DECLARE_SCHEME_CALLBACK (brew_ligature_primitive, (SCM));
   DECLARE_SCHEME_CALLBACK (print, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 /*
index 1a934d4a4a94177cf06f56ac24b9d53a5d6284b2..ffde225d2f07e23f28d80a4c7cab3e2e4209949c 100644 (file)
@@ -26,7 +26,6 @@
 class Volta_bracket_interface
 {
 public:
-  DECLARE_GROB_INTERFACE ();
   DECLARE_SCHEME_CALLBACK (print, (SCM));
   static void modify_edge_height (Spanner *);
   static void add_bar (Grob *me, Item *bar);
index 8b1a4c30033cddcdcfe59fd8e8509e82f5349233..d339fbce612e94c19638c33ed0da5c532b07f89b 100644 (file)
@@ -133,7 +133,7 @@ Instrument_name_engraver::acknowledge_axis_group (Grob_info info)
       && !info.grob ()->internal_has_interface (ly_symbol2scm ("dynamic-interface"))
       && !info.grob ()->internal_has_interface (ly_symbol2scm ("piano-pedal-interface"))
       && !info.grob ()->internal_has_interface (ly_symbol2scm ("volta-interface"))
-      && (!Align_interface::has_interface (info.grob ())))
+      && (!has_interface<Align_interface> (info.grob ())))
     {
       if (Page_layout_problem::is_spaceable (info.grob ()))
         axis_groups_.push_back (info.grob ());
index 220176e55b8803fc64e4834309f2e49b354ead97..f90b29d30a78445c0789de622aadd1275d916ca3 100644 (file)
@@ -224,7 +224,7 @@ Item::derived_mark () const
 }
 
 Interval
-Item::pure_height (Grob *g, int start, int end)
+Item::pure_y_extent (Grob *g, int start, int end)
 {
   if (cached_pure_height_valid_)
     return cached_pure_height_ + pure_relative_y_coordinate (g, start, end);
@@ -232,7 +232,7 @@ Item::pure_height (Grob *g, int start, int end)
      assuming that Items' pure_heights do not depend on 'start' or 'end'.
   */
 
-  cache_pure_height (Grob::pure_height (this, start, end));
+  cache_pure_height (Grob::pure_y_extent (this, start, end));
   return cached_pure_height_ + pure_relative_y_coordinate (g, start, end);
 }
 
index 56af49da39b9c4ce0bd789b14a1e812f5bac1e94..3249a736c3f2a18c103107bdce08e851b06650b8 100644 (file)
@@ -32,7 +32,6 @@
 struct Key_signature_interface
 {
   DECLARE_SCHEME_CALLBACK (print, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 /*
index 40ef019d234d80d0733e48455dd672b689b6ce30..8e871c1abf868c5ee53f34ffb82eaa5a4f2e6039 100644 (file)
@@ -22,6 +22,8 @@
 #include "engraver.hh"
 #include "staff-symbol.hh"
 
+#include "translator.icc"
+
 class Ledger_line_engraver : public Engraver
 {
   Spanner *span_;
@@ -118,8 +120,6 @@ Ledger_line_engraver::acknowledge_ledgered (Grob_info s)
   ledgered_grobs_.push_back (s.grob ());
 }
 
-#include "translator.icc"
-
 ADD_ACKNOWLEDGER (Ledger_line_engraver, ledgered);
 ADD_ACKNOWLEDGER (Ledger_line_engraver, staff_symbol);
 ADD_TRANSLATOR (Ledger_line_engraver,
index 5cb5462351667fc1d84f834e8a0190d6fe41e21a..b0e8fee3c2321b8e7f078a7946048714deca168a 100644 (file)
@@ -32,7 +32,6 @@ struct Ledger_line_spanner
 {
   DECLARE_SCHEME_CALLBACK (print, (SCM));
   DECLARE_SCHEME_CALLBACK (set_spacing_rods, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 static void
@@ -339,7 +338,6 @@ ADD_INTERFACE (Ledger_line_spanner,
 
 struct Ledgered_interface
 {
-  DECLARE_GROB_INTERFACE ();
 };
 
 ADD_INTERFACE (Ledgered_interface,
diff --git a/lily/line-interface-scheme.cc b/lily/line-interface-scheme.cc
new file mode 100644 (file)
index 0000000..dee6a15
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+  This file is part of LilyPond, the GNU music typesetter.
+
+  Copyright (C) 2010--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+  LilyPond is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  LilyPond is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "line-interface.hh"
+
+#include "stencil.hh"
+#include "grob.hh"
+
+LY_DEFINE (ly_line_interface__line, "ly:line-interface::line",
+           5, 0, 0, (SCM grob, SCM startx, SCM starty, SCM endx, SCM endy),
+           "Make a line using layout information from grob @var{grob}.")
+{
+  LY_ASSERT_SMOB (Grob, grob, 1);
+
+  Grob *me = unsmob<Grob> (grob);
+
+  LY_ASSERT_TYPE (scm_is_number, startx, 2);
+  LY_ASSERT_TYPE (scm_is_number, starty, 3);
+  LY_ASSERT_TYPE (scm_is_number, endx, 4);
+  LY_ASSERT_TYPE (scm_is_number, endy, 5);
+
+  Offset from = Offset (scm_to_double (startx), scm_to_double (starty));
+  Offset to = Offset (scm_to_double (endx), scm_to_double (endy));
+
+  Stencil stil = Line_interface::line (me, from, to);
+
+  return stil.smobbed_copy ();
+}
index 056587a1d9863f3049a207d66ff4d0cee2b13e8e..b90be8c04ca17ec277a52564a0956a0963cdce1d 100644 (file)
@@ -30,7 +30,7 @@ Line_interface::make_arrow (Offset begin, Offset end,
                             Real thick,
                             Real length, Real width)
 {
-  Real angle = (end - begin).arg ();
+  Offset dir = (end - begin).direction ();
   vector<Offset> points;
 
   points.push_back (Offset (0, 0));
@@ -38,7 +38,7 @@ Line_interface::make_arrow (Offset begin, Offset end,
   points.push_back (Offset (-length, -width));
 
   for (vsize i = 0; i < points.size (); i++)
-    points[i] = points[i] * complex_exp (Offset (0, angle)) + end;
+    points[i] = points[i] * dir + end;
 
   return Lookup::round_filled_polygon (points, thick);
 }
@@ -95,7 +95,7 @@ Line_interface::make_zigzag_line (Grob *me,
   Real l = robust_scm2double (me->get_property ("zigzag-length"), 1) * w;
   Real h = l > w / 2 ? sqrt (l * l - w * w / 4) : 0;
 
-  Offset rotation_factor = complex_exp (Offset (0, dz.arg ()));
+  Offset rotation_factor = dz.direction ();
 
   Offset points[3];
   points[0] = Offset (0, -h / 2);
index be20f25d98fb0a824030cb48ecd4faa77bfa3974..84c43ccf81ef34e80913c1d298e1511321e17982 100644 (file)
@@ -43,12 +43,11 @@ public:
   DECLARE_SCHEME_CALLBACK (calc_left_bound_info_and_text, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_right_bound_info, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_bound_info, (SCM, Direction));
-  DECLARE_GROB_INTERFACE ();
 };
 
 Spanner *parent_spanner (Grob *g)
 {
-  if (Spanner::has_interface (g))
+  if (has_interface<Spanner> (g))
     return dynamic_cast<Spanner *> (g);
   return parent_spanner (g->get_parent (Y_AXIS));
 }
@@ -110,7 +109,7 @@ Line_spanner::calc_bound_info (SCM smob, Direction dir)
                          ? columns[0] : columns.back ();
         }
 
-      Real x_coord = (Paper_column::has_interface (bound_grob)
+      Real x_coord = (has_interface<Paper_column> (bound_grob)
                       ? Axis_group_interface::generic_bound_extent (bound_grob, commonx, X_AXIS)
                       : robust_relative_extent (bound_grob, commonx, X_AXIS)).linear_combination (attach);
 
@@ -169,7 +168,7 @@ Line_spanner::calc_bound_info (SCM smob, Direction dir)
                 VerticalAxisGroup of a staff) that extends over the break.
               */
               Spanner *next_bound_parent_on_this_line
-                = next_bound_parent->broken_neighbor (other_dir (dir));
+                = next_bound_parent->broken_neighbor (-dir);
 
               if (next_bound_parent_on_this_line)
                 {
index 280b85bcfab09a193c2cd4fd386b70890a07b9cc..4f9d0bbbdefaa78d1766c4fea4345dbe8d80964b 100644 (file)
@@ -88,11 +88,8 @@ Stencil
 Lookup::rotated_box (Real slope, Real width, Real thick, Real blot)
 {
   vector<Offset> pts;
-  Offset rot (1, slope);
+  Offset rot = Offset (1, slope).direction ();
 
-  thick -= 2 * blot;
-  width -= 2 * blot;
-  rot /= sqrt (1 + slope * slope);
   pts.push_back (Offset (0, -thick / 2) * rot);
   pts.push_back (Offset (width, -thick / 2) * rot);
   pts.push_back (Offset (width, thick / 2) * rot);
@@ -268,9 +265,36 @@ Lookup::round_filled_polygon (vector<Offset> const &points,
     return Line_interface::make_line (blotdiameter, points[0], points[1]);
 
   /* shrink polygon in size by 0.5 * blotdiameter */
+
+  // first we need to determine the orientation of the polygon in
+  // order to decide whether shrinking means moving the polygon to the
+  // left or to the right of the outline.  We do that by calculating
+  // (double) the oriented area of the polygon.  We first determine the
+  // center and do the area calculations relative to it.
+  // Mathematically, the result is not affected by this shift, but
+  // numerically a lot of cancellation is going on and this keeps its
+  // effects in check.
+
+  Offset center;
+  for (vsize i = 0; i < points.size (); i++)
+    center += points[i];
+  center /= points.size ();
+
+  Real area = 0.0;
+  Offset last = points.back () - center;
+
+  for (vsize i = 0; i < points.size (); i++)
+    {
+      Offset here = points[i] - center;
+      area += cross_product (last, here);
+      last = here;
+    }
+
+  bool ccw = area >= 0.0;  // true if whole shape is counterclockwise oriented
+
   vector<Offset> shrunk_points;
   shrunk_points.resize (points.size ());
-  bool ccw = 1; // true, if three adjacent points are counterclockwise ordered
+
   for (vsize i = 0; i < points.size (); i++)
     {
       int i0 = i;
@@ -279,39 +303,43 @@ Lookup::round_filled_polygon (vector<Offset> const &points,
       Offset p0 = points[i0];
       Offset p1 = points[i1];
       Offset p2 = points[i2];
-      Offset p10 = p0 - p1;
+      Offset p01 = p1 - p0;
       Offset p12 = p2 - p1;
-      if (p10.length () != 0.0)
-        {
-          // recompute ccw
-          Real phi = p10.arg ();
-          // rotate (p2 - p0) by (-phi)
-          Offset q = complex_multiply (p2 - p0, complex_exp (Offset (1.0, -phi)));
-
-          if (q[Y_AXIS] > 0)
-            ccw = 1;
-          else if (q[Y_AXIS] < 0)
-            ccw = 0;
-          else {} // keep ccw unchanged
-        }
-      else {} // keep ccw unchanged
-      Offset p10n = (1.0 / p10.length ()) * p10; // normalize length to 1.0
-      Offset p12n = (1.0 / p12.length ()) * p12;
-      Offset p13n = 0.5 * (p10n + p12n);
-      Offset p14n = 0.5 * (p10n - p12n);
-      Offset p13;
-      Real d = p13n.length () * p14n.length (); // distance p3n to line (p1..p0)
-      if (d < epsilon)
-        // special case: p0, p1, p2 are on a single line => build
-        // vector orthogonal to (p2-p0) of length 0.5 blotdiameter
+      Offset inward0 = Offset(-p01[Y_AXIS], p01[X_AXIS]).direction ();
+      Offset inward2 = Offset(-p12[Y_AXIS], p12[X_AXIS]).direction ();
+
+      if (!ccw)
         {
-          p13[X_AXIS] = p10[Y_AXIS];
-          p13[Y_AXIS] = -p10[X_AXIS];
-          p13 = (0.5 * blotdiameter / p13.length ()) * p13;
+          inward0 = -inward0;
+          inward2 = -inward2;
         }
-      else
-        p13 = (0.5 * blotdiameter / d) * p13n;
-      shrunk_points[i1] = p1 + ((ccw) ? p13 : -p13);
+
+      Offset middle = 0.5*(inward0 + inward2);
+
+      // "middle" now is a vector in the right direction for the
+      // shrinkage.  Its size needs to be large enough that the
+      // projection on either of the inward vectors has a size of 1.
+
+      Real proj = dot_product (middle, inward0);
+
+      // What's the size of proj?  Assuming that we have a corner
+      // angle of phi where 0 corresponds to a continuing line, the
+      // length of middle is 0.5 |(1+cos phi, sin phi)| = cos (phi/2),
+      // so its projection has length
+      // cos^2 (phi/2) = 0.5 + 0.5 cos (phi).
+      // We don't really want to move inwards more than 3 blob
+      // diameters corresponding to 6 blob radii.  So
+      // cos (phi/2) = 1/6 gives phi ~ 161, meaning that a 20 degree
+      // corner necessitates moving 3 blob diameters from the corner
+      // in order to stay inside the lines.  Ruler and circle agree.
+      // 0.03 is close enough to 1/36.  Basically we want to keep the
+      // shape from inverting from pulling too far inward.
+      // 3 diameters is pretty much a handwaving guess.
+
+      if (abs (proj) < 0.03)
+        proj = proj < 0 ? -0.03 : 0.03;
+
+      shrunk_points[i1] = p1 + (0.5 * blotdiameter / proj) * middle;
     }
 
   /* build scm expression and bounding box */
index bc576bf3ccc669f23fbea53df01ce072c069549b..cdee61517e333f4c6a554c973b27c11555d8835c 100644 (file)
@@ -158,7 +158,7 @@ get_current_note_head (Context *voice)
       // here.  Not with this mechanism.
       if ((*end_mom == end_from_now)
           && dynamic_cast<Item *> (g)
-          && Note_head::has_interface (g))
+          && has_interface<Note_head> (g))
         {
           return g;
         }
index 0ef6b7b4e0b322ba767d35a8684402fbb1e7f2fa..f98cb5a3a037d279c5234b314638432a5252737f 100644 (file)
@@ -309,14 +309,14 @@ check_meshing_chords (Grob *me,
     {
       Grob *d = unsmob<Grob> (head_up->get_object ("dot"));
       Grob *parent = d->get_parent (X_AXIS);
-      if (Dot_column::has_interface (parent))
+      if (has_interface<Dot_column> (parent))
         Side_position_interface::add_support (parent, head_down);
     }
   else if (Rhythmic_head::dot_count (head_down))
     {
       Grob *d = unsmob<Grob> (head_down->get_object ("dot"));
       Grob *parent = d->get_parent (X_AXIS);
-      if (Dot_column::has_interface (parent))
+      if (has_interface<Dot_column> (parent))
         {
           Grob *stem = unsmob<Grob> (head_up->get_object ("stem"));
           // Loop over all heads on an up-pointing-stem to see if dots
@@ -433,7 +433,7 @@ Note_collision_interface::get_clash_groups (Grob *me)
   for (vsize i = 0; i < elements.size (); i++)
     {
       Grob *se = elements[i];
-      if (Note_column::has_interface (se))
+      if (has_interface<Note_column> (se))
         {
           if (!Note_column::dir (se))
             se->programming_error ("note-column has no direction");
index f5b6f35e9045189b6ba5f88118cefc522b7100cf..1d79fee652c57a825400a5e9a3fca3abb9c483a2 100644 (file)
@@ -98,7 +98,7 @@ Direction
 Note_column::dir (Grob *me)
 {
   Grob *stem = unsmob<Grob> (me->get_object ("stem"));
-  if (stem && Stem::has_interface (stem))
+  if (has_interface<Stem> (stem))
     return get_grob_direction (stem);
   else
     {
@@ -107,7 +107,7 @@ Note_column::dir (Grob *me)
         return (Direction)sign (head_positions_interval (me).center ());
     }
 
-  if (has_interface (me))
+  if (has_interface<Note_column> (me))
     programming_error ("Note_column without heads and stem");
   else
     programming_error ("dir() given grob without Note_column interface");
@@ -131,7 +131,7 @@ void
 Note_column::add_head (Grob *me, Grob *h)
 {
   bool both = false;
-  if (Rest::has_interface (h))
+  if (has_interface<Rest> (h))
     {
       extract_grob_set (me, "note-heads", heads);
       if (heads.size ())
@@ -139,7 +139,7 @@ Note_column::add_head (Grob *me, Grob *h)
       else
         me->set_object ("rest", h->self_scm ());
     }
-  else if (Note_head::has_interface (h))
+  else if (has_interface<Note_head> (h))
     {
       if (unsmob<Grob> (me->get_object ("rest")))
         both = true;
@@ -205,7 +205,7 @@ Note_column::accidentals (Grob *me)
   if (!acc)
     return 0;
 
-  if (Accidental_placement::has_interface (acc->get_parent (X_AXIS)))
+  if (has_interface<Accidental_placement> (acc->get_parent (X_AXIS)))
     return acc->get_parent (X_AXIS);
 
   /* compatibility. */
index fcd1523d2f1d2ba88f5b3ca3b2b04da561ac2847..a894be25394c9a41ba44a5db8870e79e686c574b 100644 (file)
@@ -228,7 +228,7 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn,
       for (vsize i = 0; i < items.size (); i++)
         {
           Item *it = dynamic_cast<Item *> (items[i]);
-          if (!Note_column::has_interface (it))
+          if (!has_interface<Note_column> (it))
             continue;
           if (d == RIGHT && it->get_column () != rcolumn)
             continue;
@@ -265,7 +265,7 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn,
           if (!hp.is_empty ())
             {
               Real ss = Staff_symbol_referencer::staff_space (stem);
-              stem_posns[d] = stem->pure_height (stem, 0, INT_MAX) * (2 / ss);
+              stem_posns[d] = stem->pure_y_extent (stem, 0, INT_MAX) * (2 / ss);
               head_posns[d].unite (hp);
             }
         }
index 5e962a6bb3eef0b3dcffaea7818419ccf0aa5684..63a9d3ebca37adaa2b60dd4bce024875b2301202 100644 (file)
@@ -35,7 +35,6 @@
 struct Ottava_bracket
 {
   DECLARE_SCHEME_CALLBACK (print, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 /*
@@ -61,7 +60,7 @@ Ottava_bracket::print (SCM smob)
       Item *b = me->get_bound (d);
       broken[d] = (b->break_status_dir () != CENTER);
 
-      if (Note_column::has_interface (b))
+      if (has_interface<Note_column> (b))
         {
           extract_grob_set (b, "note-heads", heads);
           common = common_refpoint_of_array (heads, common, X_AXIS);
@@ -94,7 +93,7 @@ Ottava_bracket::print (SCM smob)
       Item *b = me->get_bound (d);
 
       Interval ext;
-      if (Note_column::has_interface (b))
+      if (has_interface<Note_column> (b))
         {
           extract_grob_set (b, "note-heads", heads);
           for (vsize i = 0; i < heads.size (); i++)
index 3f4fca05f1fddfb8be11561dc51a71154b465bdb..8f1951223c4e8a4721047f848ec296ebc50a5e3f 100644 (file)
@@ -1232,7 +1232,7 @@ Page_layout_problem::filter_dead_elements (vector<Grob *> const &input)
   vector<Grob *> output;
   for (vsize i = 0; i < input.size (); ++i)
     {
-      if (Hara_kiri_group_spanner::has_interface (input[i]))
+      if (has_interface<Hara_kiri_group_spanner> (input[i]))
         Hara_kiri_group_spanner::consider_suicide (input[i]);
 
       if (input[i]->is_live ())
index 334861844c900076ffaf540f9cb02d53813bf3fa..7c44f173d70226f540b266bd24c7c28dfc8d8a76 100644 (file)
@@ -241,10 +241,10 @@ Paper_column_engraver::stop_translation_timestep ()
       if (!unsmob<Grob> (elem->get_object ("axis-group-parent-X")))
         elem->set_object ("axis-group-parent-X", col->self_scm ());
 
-      if (Accidental_placement::has_interface (elem)
-          || Arpeggio::has_interface (elem))
+      if (has_interface<Accidental_placement> (elem)
+          || has_interface<Arpeggio> (elem))
         Separation_item::add_conditional_item (col, elem);
-      else if (!Accidental_interface::has_interface (elem))
+      else if (!has_interface<Accidental_interface> (elem))
         Separation_item::add_item (col, elem);
     }
   items_.clear ();
index d907acdf24f914e9b435aca0c92b44a46c149d96..3ea5a89f0538a37b236c412e9744ba5a378ad61f 100644 (file)
@@ -203,7 +203,7 @@ Paper_column::break_align_width (Grob *me, SCM align_syms)
           (me, ly_symbol2scm ("elements"),
            (scm_is_eq (align_sym, ly_symbol2scm ("staff-bar"))
             ? Bar_line::non_empty_barline
-            : Break_alignment_interface::has_interface));
+            : has_interface<Break_alignment_interface>));
       else
         {
           extract_grob_set (me, "elements", elts);
@@ -440,7 +440,7 @@ Paper_column::is_extraneous_column_from_ligature (Grob *me)
   bool has_notehead = false;
   for (vsize i = 0; i < elts.size (); i++)
     {
-      if (Rhythmic_head::has_interface (elts[i]))
+      if (has_interface<Rhythmic_head> (elts[i]))
         {
           has_notehead = true;
           if (dynamic_cast<Item *> (elts[i])->get_column () == me)
index 9ab087a2c3bf22e14682c59d46481a6cf0e442b6..4d3c1e651256eafb38d911131f59b38a303f6349 100644 (file)
 
 #include "performance.hh"
 
+LY_DEFINE (ly_performance_header, "ly:performance-header",
+           1, 0, 0, (SCM performance),
+           "Return header of performance.")
+{
+  LY_ASSERT_SMOB (Performance, performance, 1);
+  Performance *p = unsmob<Performance> (performance);
+  return p->get_header ();
+}
+
+LY_DEFINE (ly_performance_set_header_x, "ly:performance-set-header!",
+           2, 0, 0, (SCM performance, SCM module),
+           "Set the performance header.")
+{
+  LY_ASSERT_SMOB (Performance, performance, 1);
+  SCM_ASSERT_TYPE (ly_is_module (module), module, SCM_ARG2, __FUNCTION__,
+                   "module");
+
+  Performance *p = unsmob<Performance> (performance);
+  p->set_header (module);
+  return SCM_UNSPECIFIED;
+}
+
 LY_DEFINE (ly_performance_write, "ly:performance-write",
-           2, 0, 0, (SCM performance, SCM filename),
-           "Write @var{performance} to @var{filename}.")
+           3, 0, 0, (SCM performance, SCM filename, SCM name),
+           "Write @var{performance} to @var{filename} storing @var{name} as "
+           "the name of the performance in the file metadata.")
 {
   LY_ASSERT_SMOB (Performance, performance, 1);
   LY_ASSERT_TYPE (scm_is_string, filename, 2);
+  LY_ASSERT_TYPE (scm_is_string, name, 3);
 
-  unsmob<Performance> (performance)->write_output (ly_scm2string (filename));
+  unsmob<Performance> (performance)->write_output (ly_scm2string (filename),
+                                                   ly_scm2string (name));
   return SCM_UNSPECIFIED;
 }
-
index f462c3322952cc2d8b0f3d49a8e04f3e5e5d1f14..9f840efd2524eedc28e7204a13d5c5f47d97a958 100644 (file)
@@ -37,7 +37,8 @@ using namespace std;
 
 Performance::Performance (bool ports)
   : midi_ (0),
-    ports_ (ports)
+    ports_ (ports),
+    header_ (SCM_EOL)
 {
 }
 
@@ -47,7 +48,27 @@ Performance::~Performance ()
 }
 
 void
-Performance::output (Midi_stream &midi_stream) const
+Performance::derived_mark () const
+{
+  scm_gc_mark (header_);
+}
+
+SCM
+Performance::get_header () const
+{
+  return header_;
+}
+
+void
+Performance::set_header (SCM module)
+{
+  assert (ly_is_module (module));
+  header_ = module;
+}
+
+void
+Performance::output (Midi_stream &midi_stream,
+                     const string &performance_name) const
 {
   int tracks_ = audio_staffs_.size ();
 
@@ -64,6 +85,21 @@ Performance::output (Midi_stream &midi_stream) const
   for (vsize i = 0; i < audio_staffs_.size (); i++)
     {
       Audio_staff *s = audio_staffs_[i];
+      if (Audio_control_track_staff *c =
+          dynamic_cast<Audio_control_track_staff *>(s))
+        {
+          // The control track, created by Control_track_performer, should
+          // contain a placeholder for the name of the MIDI sequence as its
+          // initial audio element.  Fill in the name of the sequence to
+          // this element before outputting MIDI.
+          assert (!c->audio_items_.empty ());
+          Audio_text *text =
+            dynamic_cast<Audio_text *>(c->audio_items_.front ());
+          assert (text != 0);
+          assert (text->type_ == Audio_text::TRACK_NAME);
+          assert (text->text_string_ == "control track");
+          text->text_string_ = performance_name;
+        }
       debug_output ("[" + ::to_string (i), true);
       s->output (midi_stream, i, ports_, moment_to_ticks (start_mom));
       debug_output ("]", false);
@@ -77,7 +113,7 @@ Performance::add_element (Audio_element *p)
 }
 
 void
-Performance::write_output (string out) const
+Performance::write_output (string out, const string &performance_name) const
 {
   if (out == "-")
     out = "lelie.midi";
@@ -89,7 +125,7 @@ Performance::write_output (string out) const
   Midi_stream midi_stream (out);
   message (_f ("MIDI output to `%s'...", out));
 
-  output (midi_stream);
+  output (midi_stream, performance_name);
   progress_indication ("\n");
 }
 
index 0be5ff4b17d85f421a3bb0203b6c6587dcd5fc4c..7134a6cfc7797d895491db906a751d502bfc3295 100644 (file)
@@ -27,6 +27,8 @@
 #include "warn.hh"
 #include "axis-group-interface.hh"
 
+#include "translator.icc"
+
 /*
   TODO:
 
@@ -246,8 +248,6 @@ Piano_pedal_align_engraver::finalize ()
     }
 }
 
-#include "translator.icc"
-
 ADD_ACKNOWLEDGER (Piano_pedal_align_engraver, note_column);
 ADD_ACKNOWLEDGER (Piano_pedal_align_engraver, piano_pedal_bracket);
 ADD_ACKNOWLEDGER (Piano_pedal_align_engraver, piano_pedal_script);
index f58a130f75dad10698c728ece0c5ba491dbb8d57..b47e5e3b6deee146c2f20a51d49c05353064273d 100644 (file)
@@ -26,7 +26,6 @@
 struct Piano_pedal_bracket
 {
   DECLARE_SCHEME_CALLBACK (print, (SCM));
-  DECLARE_GROB_INTERFACE ();
 };
 
 MAKE_SCHEME_CALLBACK (Piano_pedal_bracket, print, 1);
index ac9e4dfd4d7f5be52aa9aa3e3b68aed6f0336026..30d734346e53df7565c419817a9637ad1524afc0 100644 (file)
@@ -30,6 +30,8 @@
 #include "stream-event.hh"
 #include "warn.hh"
 
+#include "translator.icc"
+
 class Pitched_trill_engraver : public Engraver
 {
 public:
@@ -167,8 +169,6 @@ Pitched_trill_engraver::stop_translation_timestep ()
   trill_accidental_ = 0;
 }
 
-#include "translator.icc"
-
 ADD_ACKNOWLEDGER (Pitched_trill_engraver, note_head);
 ADD_ACKNOWLEDGER (Pitched_trill_engraver, dots);
 ADD_ACKNOWLEDGER (Pitched_trill_engraver, stem);
index 7061a9268498b3c492e9d2eb07a55cfccadd37b7..e147f53ccadb3a5da4663b83cf59616d518911f4 100644 (file)
@@ -26,6 +26,8 @@
 #include "pure-from-neighbor-interface.hh"
 #include "engraver.hh"
 
+#include "translator.icc"
+
 class Pure_from_neighbor_engraver : public Engraver
 {
   vector<Grob *> pure_relevants_;
@@ -46,7 +48,7 @@ Pure_from_neighbor_engraver::Pure_from_neighbor_engraver ()
 void
 Pure_from_neighbor_engraver::acknowledge_item (Grob_info i)
 {
-  if (!Pure_from_neighbor_interface::has_interface (i.item ()))
+  if (!has_interface<Pure_from_neighbor_interface> (i.item ()))
     pure_relevants_.push_back (i.item ());
 }
 
@@ -134,8 +136,6 @@ Pure_from_neighbor_engraver::finalize ()
   pure_relevants_.clear ();
 }
 
-#include "translator.icc"
-
 ADD_ACKNOWLEDGER (Pure_from_neighbor_engraver, item);
 ADD_ACKNOWLEDGER (Pure_from_neighbor_engraver, pure_from_neighbor);
 ADD_TRANSLATOR (Pure_from_neighbor_engraver,
index 73fde03f15dd77f656712654da90f1c6f5a05d2c..879377a1cc0928bae14c6fd92c5fd8f032eacac2 100644 (file)
 #include "version.hh"
 #include "warn.hh"
 
+#ifdef __MINGW32__
+#include <winbase.h>
+#endif
+
 #define FRAMEWORKDIR ".."
 
 int
@@ -103,10 +107,6 @@ prepend_env_path (char const *key, string value)
   return -1;
 }
 
-#ifdef __MINGW32__
-#include <winbase.h>
-#endif
-
 static void
 prefix_relocation (const string &prefix)
 {
index 20e7eb9fc784940fe610bec1d6348d5382616250..a70641cfd05e522d3f67e7bc3c8addb4d06d18bb 100644 (file)
@@ -32,6 +32,8 @@
 #include "stream-event.hh"
 #include "warn.hh"
 
+#include "translator.icc"
+
 class Rest_collision_engraver : public Engraver
 {
 protected:
@@ -62,7 +64,7 @@ Rest_collision_engraver::process_acknowledged ()
       if (!g || !m)
         continue;
 
-      if (Rhythmic_head::has_interface (g) && (*m) > now)
+      if (has_interface<Rhythmic_head> (g) && (*m) > now)
         {
           Grob *column = g->get_parent (X_AXIS);
           if (!column)
@@ -70,7 +72,7 @@ Rest_collision_engraver::process_acknowledged ()
 
           // Only include rests that start now. Include notes that started any time.
           Paper_column *paper_column = dynamic_cast<Item *> (column)->get_column ();
-          if (!Rest::has_interface (g) || !paper_column || Paper_column::when_mom (paper_column) == now)
+          if (!has_interface<Rest> (g) || !paper_column || Paper_column::when_mom (paper_column) == now)
             {
               columns.insert (column);
               rest_count += Note_column::has_rests (column);
@@ -92,8 +94,6 @@ Rest_collision_engraver::stop_translation_timestep ()
   rest_collision_ = 0;
 }
 
-#include "translator.icc"
-
 ADD_TRANSLATOR (Rest_collision_engraver,
                 /* doc */
                 "Handle collisions of rests.",
index 300dcfc3c40d160238f8c4bcc3f00a55667916cb..536ced40e5b7fb75b88b34893da3064ff3faa8bd 100644 (file)
@@ -52,7 +52,7 @@ Rest_collision::force_shift_callback_rest (SCM rest, SCM offset)
   if (scm_is_number (offset))
     rest_grob->translate_axis (scm_to_double (offset), Y_AXIS);
 
-  if (Note_column::has_interface (parent) && Note_column::has_rests (parent))
+  if (has_interface<Note_column> (parent) && Note_column::has_rests (parent))
     {
       Grob *collision = unsmob<Grob> (parent->get_object ("rest-collision"));
 
@@ -109,7 +109,7 @@ Rest_collision::calc_positioning_done (SCM smob)
   for (vsize i = 0; i < elts.size (); i++)
     {
       Grob *e = elts[i];
-      if (Note_column::has_interface (e))
+      if (has_interface<Note_column> (e))
         {
           if (unsmob<Grob> (e->get_object ("rest")))
             rests.push_back (e);
index 3a288dac72fed44d4d617de36671398b357a2a40..94aa8908e70a1dfc3c2dfc791358491edb99e9d9 100644 (file)
@@ -72,8 +72,8 @@ Script_column::row_before_line_breaking (SCM smob)
       /*
         Don't want to consider scripts horizontally next to notes.
       */
-      if (Accidental_placement::has_interface (sc)
-          || Arpeggio::has_interface (sc))
+      if (has_interface<Accidental_placement> (sc)
+          || has_interface<Arpeggio> (sc))
         {
           affect_all_grobs.push_back (sc);
         }
index eaba157f34b27196a7d074aa410654fa5f11e15b..24fe4dc0824ed063beb72142f10cae86a46d5f72 100644 (file)
@@ -131,7 +131,6 @@ Script_interface::print (SCM smob)
 
 struct Text_script
 {
-  DECLARE_GROB_INTERFACE ();
 };
 
 ADD_INTERFACE (Text_script,
index dc81f38b7f2da42a206e180d1d9d2ace49c3c3dd..35b5038020f34431faa1819ff09b36611868ce16 100644 (file)
@@ -56,7 +56,7 @@ Script_row_engraver::stop_translation_timestep ()
   if (script_row_)
     {
       for (vsize i = 0; i < scripts_.size (); i++)
-        if (Accidental_placement::has_interface (scripts_[i])
+        if (has_interface<Accidental_placement> (scripts_[i])
             || Side_position_interface::get_axis (scripts_[i]) == X_AXIS)
           Script_column::add_side_positioned (script_row_, scripts_[i]);
     }
index 49b4125364fa9ad1a0b23e1d91b9d244b3426f37..512f970e0e05fa500735eb9e93ec12039f58d5e1 100644 (file)
@@ -104,7 +104,7 @@ Self_alignment_interface::aligned_on_parent (Grob *me, Axis a)
 {
   Grob *him = me->get_parent (a);
   Interval he;
-  if (Paper_column::has_interface (him))
+  if (has_interface<Paper_column> (him))
       /*
         PaperColumn extents aren't reliable (they depend on size and alignment
         of PaperColumn's children), so we align on NoteColumn instead.
@@ -115,7 +115,7 @@ Self_alignment_interface::aligned_on_parent (Grob *me, Axis a)
   else
     {
       if (to_boolean (me->get_property ("X-align-on-main-noteheads"))
-          && Note_column::has_interface (him))
+          && has_interface<Note_column> (him))
         he = Note_column::calc_main_extent(him);
       else
         he = him->extent (him, a);
index 049cd029d6c40d56eb9348e81b0639bf9f70cf12..0d31a2e07388b82e1ad0627b57f10d124e8bd5d9 100644 (file)
@@ -60,7 +60,7 @@ Semi_tie::calc_control_points (SCM smob)
   (void) me->get_property ("direction");
 
   Grob *yparent = me->get_parent (Y_AXIS);
-  if (Semi_tie_column::has_interface (yparent))
+  if (has_interface<Semi_tie_column> (yparent))
     {
       /* trigger positioning. */
       yparent->get_property ("positioning-done");
@@ -89,13 +89,20 @@ bool
 Semi_tie::less (Grob *g1, Grob *g2)
 {
   Item *i1 = dynamic_cast<Item *> (g1);
+  if (!i1)
+    {
+      g1->programming_error ("grob is not a semi-tie");
+      return false;
+    }
+
   Item *i2 = dynamic_cast<Item *> (g2);
-  if (i1 && i2) {
-    return get_position (i1) < get_position (i2);
-  }
+  if (!i2)
+    {
+      g2->programming_error ("grob is not a semi-tie");
+      return true;
+    }
 
-  programming_error ("grob is not a semi-tie");
-  return false;
+  return get_position (i1) < get_position (i2);
 }
 
 Item *
index 5355f5cc43d9b29f8deac66c9324a687db499b1b..08069afda8858634692b5d73ea8d99d92e025371 100644 (file)
@@ -78,7 +78,7 @@ Separating_line_group_engraver::acknowledge_item (Grob_info i)
 {
   Item *it = i.item ();
 
-  if (Note_spacing::has_interface (it))
+  if (has_interface<Note_spacing> (it))
     {
       current_spacings_.note_spacings_.push_back (it);
       return;
index d0cad83d8ec49bbbf8c7265414ea502edd8a9158..e29b8a912960454e099e1a89a5b367369c751c4d 100644 (file)
@@ -129,7 +129,7 @@ Separation_item::boxes (Grob *me, Grob *left)
       vector<Grob *> other_elts; // for now only arpeggios
       for (vsize i = 0; i < read_only_elts.size (); i++)
         {
-          if (Accidental_placement::has_interface (read_only_elts[i]))
+          if (has_interface<Accidental_placement> (read_only_elts[i]))
             accidental_elts.push_back (read_only_elts[i]);
           else
             other_elts.push_back (read_only_elts[i]);
@@ -153,11 +153,11 @@ Separation_item::boxes (Grob *me, Grob *left)
          bounds all of them). However, we can't exclude an axis-group that
          adds to its childrens' stencil. Currently, this is just TrillPitchGroup;
          hence the check for note-head-interface. */
-      if (Axis_group_interface::has_interface (il)
-          && !Note_head::has_interface (il))
+      if (has_interface<Axis_group_interface> (il)
+          && !has_interface<Note_head> (il))
         continue;
 
-      Interval y (il->pure_height (ycommon, 0, very_large));
+      Interval y (il->pure_y_extent (ycommon, 0, very_large));
       Interval x (il->extent (pc, X_AXIS));
 
       Interval extra_width = robust_scm2interval (elts[i]->get_property ("extra-spacing-width"),
index 08ac17285d4b9b1c6fa5bf7805a3a9609e4b1ba8..16e2929a6699001fd029f7e43548097ec62031c6 100644 (file)
@@ -65,7 +65,7 @@ get_support_set (Grob *me)
 
   for (vsize i = 0; i < proto_support.size (); i++)
     {
-      if (Accidental_placement::has_interface (proto_support[i]))
+      if (has_interface<Accidental_placement> (proto_support[i]))
         {
           Grob *accs = proto_support[i];
           for (SCM acs = accs->get_object ("accidental-grobs"); scm_is_pair (acs);
@@ -252,7 +252,7 @@ Side_position_interface::aligned_side (Grob *me, Axis a, bool pure, int start, i
         continue; // so 'me' may not move in response to 'e'
 
       if (a == Y_AXIS
-          && Stem::has_interface (e))
+          && has_interface<Stem> (e))
         {
           // If called as 'pure' we may not force a stem to set its direction,
           if (pure && !is_direction (e->get_property_data ("direction")))
@@ -283,7 +283,7 @@ Side_position_interface::aligned_side (Grob *me, Axis a, bool pure, int start, i
                          : e->maybe_pure_coordinate (common[Y_AXIS], Y_AXIS, pure, start, end);
                Skyline_pair copy = *unsmob<Skyline_pair> (sp);
                if (a == Y_AXIS
-                   && Stem::has_interface (e)
+                   && has_interface<Stem> (e)
                    && to_boolean (me->get_maybe_pure_property ("add-stem-support", pure, start, end)))
                  copy[dir].set_minimum_height (copy[dir].max_height ());
                copy.shift (a == X_AXIS ? yc : xc);
@@ -381,7 +381,7 @@ Side_position_interface::aligned_side (Grob *me, Axis a, bool pure, int start, i
           staff_span.widen (1);
           if (staff_span.contains (position)
               /* If we are between notehead and staff, quantize for ledger lines. */
-              || (Note_head::has_interface (head)
+              || (has_interface<Note_head> (head)
                   && dir * position < 0))
             {
               total_off += (rounded - position) * 0.5 * ss;
index 8e1db97d8413d3e35fdbe502738541457fae4589..dc453a97294fc130b3ec49378d21bdaec3924893 100644 (file)
@@ -334,7 +334,7 @@ Slur_configuration::score_extra_encompass (Slur_score_state const &state)
   // we find forbidden attachments
   vector<Offset> forbidden_attachments;
   for (vsize i = 0; i < state.extra_encompass_infos_.size (); i++)
-    if (Tie::has_interface (state.extra_encompass_infos_[i].grob_))
+    if (has_interface<Tie> (state.extra_encompass_infos_[i].grob_))
       {
         Grob *t = state.extra_encompass_infos_[i].grob_;
         Grob *common_x = Grob::get_vertical_axis_group (t);
index cca56781aa92eaaa18579fb611f75161e9338d96..edd45f64278a80bf36e1d180f70664b8e5ccb9c8 100644 (file)
@@ -161,7 +161,7 @@ Slur_score_state::get_bound_info () const
   for (LEFT_and_RIGHT (d))
     {
       extremes[d].bound_ = slur_->get_bound (d);
-      if (Note_column::has_interface (extremes[d].bound_))
+      if (has_interface<Note_column> (extremes[d].bound_))
         {
           extremes[d].note_column_ = extremes[d].bound_;
           extremes[d].stem_ = Note_column::get_stem (extremes[d].note_column_);
@@ -285,7 +285,7 @@ Slur_score_state::fill (Grob *me)
                      ly_symbol2scm ("inside"))
           && minmax (dir_, encompass_place, y_place) == encompass_place
           && (!extra_encompass_infos_[i].grob_->internal_has_interface (ly_symbol2scm ("key-signature-interface"))
-              && !Clef::has_interface (extra_encompass_infos_[i].grob_)
+              && !has_interface<Clef> (extra_encompass_infos_[i].grob_)
               && !extra_encompass_infos_[i].grob_->internal_has_interface (ly_symbol2scm ("time-signature-interface"))))
         {
           for (LEFT_and_RIGHT (d))
@@ -627,7 +627,7 @@ Slur_score_state::generate_avoid_offsets () const
   extract_grob_set (slur_, "encompass-objects", extra_encompasses);
   for (vsize i = 0; i < extra_encompasses.size (); i++)
     {
-      if (Slur::has_interface (extra_encompasses[i]))
+      if (has_interface<Slur> (extra_encompasses[i]))
         {
           Grob *small_slur = extra_encompasses[i];
           Bezier b = Slur::get_curve (small_slur);
@@ -756,7 +756,7 @@ Slur_score_state::get_extra_encompass_infos () const
   vector<Extra_collision_info> collision_infos;
   for (vsize i = encompasses.size (); i--;)
     {
-      if (Slur::has_interface (encompasses[i]))
+      if (has_interface<Slur> (encompasses[i]))
         {
           Spanner *small_slur = dynamic_cast<Spanner *> (encompasses[i]);
           Bezier b = Slur::get_curve (small_slur);
@@ -797,12 +797,12 @@ Slur_score_state::get_extra_encompass_infos () const
           Grob *g = encompasses [i];
           Interval xe = g->extent (common_[X_AXIS], X_AXIS);
           Interval ye = g->extent (common_[Y_AXIS], Y_AXIS);
-          if (Dots::has_interface (g))
+          if (has_interface<Dots> (g))
             ye.widen (0.2);
 
           Real xp = 0.0;
           Real penalty = parameters_.extra_object_collision_penalty_;
-          if (Accidental_interface::has_interface (g))
+          if (has_interface<Accidental_interface> (g))
             {
               penalty = parameters_.accidental_collision_;
 
index 93f5492b66f85c7a3d67ce31b7548b049f7e3d09..a11a30258e8f3ae57daf500a19a171a5421a5f6b 100644 (file)
@@ -99,7 +99,7 @@ Slur::pure_height (SCM smob, SCM start_scm, SCM end_scm)
 
   for (vsize i = 0; i < encompasses.size (); i++)
     {
-      Interval d = encompasses[i]->pure_height (parent, start, end);
+      Interval d = encompasses[i]->pure_y_extent (parent, start, end);
       if (!d.is_empty ())
         {
           for (DOWN_and_UP (downup))
@@ -204,7 +204,7 @@ Slur::replace_breakable_encompass_objects (Grob *me)
     {
       Grob *g = extra_objects[i];
 
-      if (Separation_item::has_interface (g))
+      if (has_interface<Separation_item> (g))
         {
           extract_grob_set (g, "elements", breakables);
           for (vsize j = 0; j < breakables.size (); j++)
@@ -271,7 +271,7 @@ Slur::pure_outside_slur_callback (SCM grob, SCM start_scm, SCM end_scm, SCM offs
 
   Real offset = robust_scm2double (offset_scm, 0.0);
   Direction dir = get_grob_direction (script);
-  return scm_from_double (offset + dir * slur->pure_height (slur, start, end).length () / 4);
+  return scm_from_double (offset + dir * slur->pure_y_extent (slur, start, end).length () / 4);
 }
 
 MAKE_SCHEME_CALLBACK_WITH_OPTARGS (Slur, outside_slur_callback, 2, 1, "");
@@ -409,7 +409,7 @@ Slur::auxiliary_acknowledge_extra_object (Grob_info const &info,
   else
     slur = slurs[0];
 
-  if (Tie::has_interface (e)
+  if (has_interface<Tie> (e)
       || scm_is_eq (avoid, ly_symbol2scm ("inside")))
     {
       for (vsize i = slurs.size (); i--;)
@@ -478,7 +478,7 @@ Slur::calc_cross_staff (SCM smob)
      so we can ignore them here */
   vector<Grob *> non_sep_extras;
   for (vsize i = 0; i < extras.size (); i++)
-    if (!Separation_item::has_interface (extras[i]))
+    if (!has_interface<Separation_item> (extras[i]))
       non_sep_extras.push_back (extras[i]);
 
   Grob *common = common_refpoint_of_array (cols, me, Y_AXIS);
index c7990558dd5d633700d412bfc100d06926c33c61..4be23042ad44bbddc007c8879714cd0c201bd35d 100644 (file)
@@ -108,7 +108,7 @@ is_loose_column (Grob *l, Grob *col, Grob *r, Spacing_options const *options)
   for (vsize i = elts.size (); i--;)
     {
       Grob *g = elts[i];
-      if (g && Break_alignment_interface::has_interface (g))
+      if (has_interface<Break_alignment_interface> (g))
         {
           extract_grob_set (g, "elements", gelts);
           for (vsize j = gelts.size (); j--;)
@@ -150,7 +150,7 @@ Spacing_spanner::set_distances_for_loose_col (Grob *me, Grob *c,
               || Spacing_interface::right_column (sp) != rc)
             continue;
 
-          if (Note_spacing::has_interface (sp))
+          if (has_interface<Note_spacing> (sp))
             {
               /*
                 The note spacing should be taken from the musical
@@ -161,7 +161,7 @@ Spacing_spanner::set_distances_for_loose_col (Grob *me, Grob *c,
 
               dists[d] = max (dists[d], spring.min_distance ());
             }
-          else if (Staff_spacing::has_interface (sp))
+          else if (has_interface<Staff_spacing> (sp))
             {
               Spring spring = Staff_spacing::get_spacing (sp, rc, 0.0);
 
index 1ade62b0e53224ffd2568d794bf18b43de578b79..030d02e7272ca63b42df028cad1b85d59d22e9c3 100644 (file)
@@ -64,7 +64,7 @@ Spacing_interface::skylines (Grob *me, Grob *right_col)
             if (Item *piece = g->find_prebroken_piece (break_dirs[d]))
               g = piece;
 
-          if (g && Separation_item::has_interface (g) && g->get_column () == columns[d])
+          if (has_interface<Separation_item> (g) && g->get_column () == columns[d])
             {
               SCM sky_scm = g->get_property ("horizontal-skylines");
               Skyline_pair *sky = unsmob<Skyline_pair> (sky_scm);
@@ -144,9 +144,9 @@ get_note_columns (vector<Grob *> const &elts)
 
   for (vsize i = 0; i < elts.size (); i++)
     {
-      if (Note_column::has_interface (elts[i]))
+      if (has_interface<Note_column> (elts[i]))
         ret.push_back (dynamic_cast<Item *> (elts[i]));
-      else if (Separation_item::has_interface (elts[i]))
+      else if (has_interface<Separation_item> (elts[i]))
         {
           extract_grob_set (elts[i], "elements", more_elts);
           vector<Item *> ncs = get_note_columns (more_elts);
index c3846e694ddd6ffe4b31c6618da5f7ae378c7b86..15f77f34a0bcc0283ca5119af4e5958b9df24c06 100644 (file)
@@ -155,7 +155,7 @@ set_loose_columns (System *which, Column_x_positions const *posns)
             {
               Spring spring = Spacing_spanner::note_spacing (spacing, loose_col,
                                                              next_col, &options);
-              if (Note_spacing::has_interface (spacing))
+              if (has_interface<Note_spacing> (spacing))
                 spring = Note_spacing::get_spacing (spacing, next_col,
                                                     spring, options.increment_);
 
index f6f532125afa31cf9720e2cd92b0e3c700e5b98e..cc353bc365896abd19b5ada958a688d5a3d8a27e 100644 (file)
@@ -351,7 +351,7 @@ Spacing_spanner::musical_column_spacing (Grob *me,
           /*
             This is probably a waste of time in the case of polyphonic
             music.  */
-          if (found_matching_column && Note_spacing::has_interface (wish))
+          if (found_matching_column && has_interface<Note_spacing> (wish))
             {
               Real inc = options->increment_;
               Grob *gsp = unsmob<Grob> (left_col->get_object ("grace-spacing"));
@@ -489,7 +489,7 @@ Spacing_spanner::breakable_column_spacing (Grob *me, Item *l, Item *r,
         {
           Item *spacing_grob = dynamic_cast<Item *> (wishes[i]);
 
-          if (!spacing_grob || !Staff_spacing::has_interface (spacing_grob))
+          if (!spacing_grob || !has_interface<Staff_spacing> (spacing_grob))
             continue;
 
           /*
index e81dcfe258235f2842b73c92b4072d57d24680f2..f66c8770b52333c9bbc23c19d9d3c01bbeb510a8 100644 (file)
@@ -27,6 +27,8 @@
 #include "side-position-interface.hh"
 #include "staff-symbol-referencer.hh"
 
+#include "translator.icc"
+
 /**
    Make arpeggios that span multiple staves.  Catch arpeggios, and span a
    Span_arpeggio over them if we find more than two arpeggios.
@@ -123,8 +125,6 @@ Span_arpeggio_engraver::stop_translation_timestep ()
   note_columns_.clear ();
 }
 
-#include "translator.icc"
-
 ADD_ACKNOWLEDGER (Span_arpeggio_engraver, arpeggio);
 ADD_ACKNOWLEDGER (Span_arpeggio_engraver, note_column);
 ADD_TRANSLATOR (Span_arpeggio_engraver,
index d8f7590ea551248d35174a87875d63f074e4fbe3..63c245e70cbcb32f4620b4e8ecd4fd9a9ae4b8c7 100644 (file)
@@ -22,6 +22,8 @@
 #include "pointer-group-interface.hh"
 #include "lily-imports.hh"
 
+#include "translator.icc"
+
 /**
 
 Make bars that span multiple "staves". Catch bars, and span a
@@ -92,8 +94,6 @@ Span_bar_engraver::stop_translation_timestep ()
   bars_.resize (0);
 }
 
-#include "translator.icc"
-
 ADD_ACKNOWLEDGER (Span_bar_engraver, bar_line);
 ADD_TRANSLATOR (Span_bar_engraver,
                 /* doc */
index 0f1df50b6e3b3c027b3ea9f024e35ecbd65562e3..3517c3f5fd38e6e3938a567b90f63caab4adf733 100644 (file)
@@ -27,6 +27,8 @@
 #include "pointer-group-interface.hh"
 #include "engraver.hh"
 
+#include "translator.icc"
+
 /*
   The Span_bar_stub_engraver creates SpanBarStub grobs in the contexts
   that a grouping context contains.  For example, if a PianoStaff contains
@@ -174,8 +176,6 @@ Span_bar_stub_engraver::stop_translation_timestep ()
   axis_groups_ = axis_groups;
 }
 
-#include "translator.icc"
-
 ADD_ACKNOWLEDGER (Span_bar_stub_engraver, span_bar);
 ADD_ACKNOWLEDGER (Span_bar_stub_engraver, hara_kiri_group_spanner);
 ADD_TRANSLATOR (Span_bar_stub_engraver,
index 7874e50db38230f697479a376c23eeec35da902a..0648d0aae8bee5c8a7214c563d54798526344092 100644 (file)
@@ -29,6 +29,8 @@
 #include "warn.hh"
 #include "lily-imports.hh"
 
+#include "translator.icc"
+
 /* Perform a staff. Individual notes should have their instrument
   (staff-wide) set, so we override play_element ()
 */
@@ -77,8 +79,6 @@ map<string, int> Staff_performer::static_channel_map_;
 int Staff_performer::channel_count_ = 0;
 int Staff_performer::staff_performer_count_ = 0;
 
-#include "translator.icc"
-
 ADD_TRANSLATOR (Staff_performer,
                 /* doc */
                 "",
index c414268f26b6f685c68a8365708123fd9c9a034f..c8e51f56f8ee4585ac4b5242c4151e238dd1d3b6 100644 (file)
@@ -44,7 +44,7 @@ using namespace std;
 Real
 Staff_spacing::optical_correction (Grob *me, Grob *g, Interval bar_height)
 {
-  if (!g || !Note_column::has_interface (g))
+  if (!g || !has_interface<Note_column> (g))
     return 0;
 
   Grob *stem = Note_column::get_stem (g);
@@ -55,7 +55,7 @@ Staff_spacing::optical_correction (Grob *me, Grob *g, Interval bar_height)
       Direction d = get_grob_direction (stem);
       if (Stem::is_normal_stem (stem) && d == DOWN)
         {
-          Interval stem_posns = stem->pure_height (stem, 0, INT_MAX);
+          Interval stem_posns = stem->pure_y_extent (stem, 0, INT_MAX);
 
           stem_posns.intersect (bar_height);
 
index 2f245fda9be2c8fcbebd23a80a825530462141c2..09b3d2856ec5405162e50f58e817a2e784933cce 100644 (file)
@@ -48,7 +48,7 @@ Staff_symbol_referencer::on_staff_line (Grob *me, int pos)
 Grob *
 Staff_symbol_referencer::get_staff_symbol (Grob *me)
 {
-  if (Staff_symbol::has_interface (me))
+  if (has_interface<Staff_symbol> (me))
     return me;
 
   SCM st = me->get_object ("staff-symbol");
index a84dd701bdd33a241d0df33e34969bb1139a8de0..2f2eaf82daedf380d0b53cd1505be4ff1ca9016f 100644 (file)
@@ -158,7 +158,8 @@ Stem_engraver::acknowledge_rhythmic_head (Grob_info gi)
   Stem::add_head (stem_, gi.grob ());
 
   if (Stem::is_normal_stem (stem_)
-      && Stem::duration_log (stem_) > 2)
+      && Stem::duration_log (stem_) > 2
+      && !(unsmob<Grob> (stem_->get_object ("flag"))))
     {
       Item *flag = make_item ("Flag", stem_->self_scm ());
       flag->set_parent (stem_, X_AXIS);
index 8cb60db0787d8a3e75b9b9dc0840a0d67e4bc993..5f71607a37b89b8877ea58c832c9521cb0163aa7 100644 (file)
@@ -172,7 +172,7 @@ Stem_tremolo::pure_height (SCM smob, SCM, SCM)
   if (!beam)
     return ly_interval2scm (s1.extent (Y_AXIS));
 
-  Interval ph = stem->pure_height (stem, 0, INT_MAX);
+  Interval ph = stem->pure_y_extent (stem, 0, INT_MAX);
   Stem_info si = Stem::get_stem_info (stem);
   ph[-dir] = si.shortest_y_;
   int beam_count = Stem::beam_multiplicity (stem).length () + 1;
@@ -261,7 +261,7 @@ Stem_tremolo::calc_direction (SCM smob)
    */
   Grob *maybe_nc = stem->get_parent (X_AXIS)->get_parent (X_AXIS);
   bool whole_note = Stem::duration_log (stem) <= 0;
-  if (whole_note && Note_collision_interface::has_interface (maybe_nc))
+  if (whole_note && has_interface<Note_collision_interface> (maybe_nc))
     {
       Drul_array<bool> avoid_me (false, false);
       vector<int> all_nhps = Note_collision_interface::note_head_positions (maybe_nc);
@@ -298,16 +298,16 @@ Stem_tremolo::y_offset (Grob *me, bool pure)
 
   if (pure && beam)
     {
-      Interval ph = stem->pure_height (stem, 0, INT_MAX);
+      Interval ph = stem->pure_y_extent (stem, 0, INT_MAX);
       Stem_info si = Stem::get_stem_info (stem);
       ph[-dir] = si.shortest_y_;
 
-      return (ph - dir * max (beam_count, 1) * beam_translation)[dir] - dir * 0.5 * me->pure_height (me, 0, INT_MAX).length ();
+      return (ph - dir * max (beam_count, 1) * beam_translation)[dir] - dir * 0.5 * me->pure_y_extent (me, 0, INT_MAX).length ();
     }
 
   Real end_y
     = (pure
-       ? stem->pure_height (stem, 0, INT_MAX)[dir]
+       ? stem->pure_y_extent (stem, 0, INT_MAX)[dir]
        : stem->extent (stem, Y_AXIS)[dir])
       - dir * max (beam_count, 1) * beam_translation
       - Stem::beam_end_corrective (stem);
index 2fad60d10598f139753cfa87e5c11bab0feb8605..9cb84f57faa424b38df02d44e3086e06d6714629 100644 (file)
@@ -266,9 +266,9 @@ Stem::add_head (Grob *me, Grob *n)
 {
   n->set_object ("stem", me->self_scm ());
 
-  if (Note_head::has_interface (n))
+  if (has_interface<Note_head> (n))
     Pointer_group_interface::add_grob (me, ly_symbol2scm ("note-heads"), n);
-  else if (Rest::has_interface (n))
+  else if (has_interface<Rest> (n))
     Pointer_group_interface::add_grob (me, ly_symbol2scm ("rests"), n);
 }
 
index f11858baa594f4db917ce60713ef6ed502fab4ce..747217c847024b993b307555edcca46c85b025d1 100644 (file)
@@ -190,8 +190,7 @@ make_draw_line_boxes (vector<Box> &boxes, vector<Drul_array<Offset> > &buildings
   Offset left (x0, y0);
   Offset right (x1, y1);
   Offset dir = (right - left).direction ();
-  Direction d = DOWN;
-  do
+  for (DOWN_and_UP (d))
     {
       Offset outward = d * get_normal ((thick / 2) * dir);
       Offset inter_l = left + outward;
@@ -231,7 +230,6 @@ make_draw_line_boxes (vector<Box> &boxes, vector<Drul_array<Offset> > &buildings
             }
         }
     }
-  while (flip (&d) != DOWN);
 
   if (thick > 0.0)
     {
@@ -280,9 +278,8 @@ make_partial_ellipse_boxes (vector<Box> &boxes,
   Offset ep (cos (end) * x_rad, sin (end) * y_rad);
   //////////////////////
   Drul_array<vector<Offset> > points;
-  Direction d = DOWN;
   int quantization = max (1, (int) (((x_rad * trans.xx) + (y_rad * trans.yy)) * M_PI / QUANTIZATION_UNIT));
-  do
+  for (DOWN_and_UP (d))
     {
       for (vsize i = 0; i < 1 + (vsize) quantization; i++)
         {
@@ -293,17 +290,15 @@ make_partial_ellipse_boxes (vector<Box> &boxes,
           points[d].push_back (inter);
         }
     }
-  while (flip (&d) != DOWN);
 
   for (vsize i = 0; i < points[DOWN].size () - 1; i++)
     {
       Box b;
-      do
+      for (DOWN_and_UP (d))
         {
           b.add_point (points[d][i]);
           b.add_point (points[d][i + 1]);
         }
-      while (flip (&d) != DOWN);
       boxes.push_back (b);
     }
 
@@ -421,12 +416,11 @@ make_draw_bezier_boxes (vector<Box> &boxes,
   pango_matrix_transform_point (&trans, &temp3[X_AXIS], &temp3[Y_AXIS]);
   //////////////////////
   Drul_array<vector<Offset> > points;
-  Direction d = DOWN;
   int quantization = int (((temp1 - temp0).length ()
                            + (temp2 - temp1).length ()
                            + (temp3 - temp2).length ())
                           / QUANTIZATION_UNIT);
-  do
+  for (DOWN_and_UP (d))
     {
       Offset first = curve.control_[0]
         + d * get_normal ((th / 2) * curve.dir_at_point (0.0));
@@ -445,17 +439,15 @@ make_draw_bezier_boxes (vector<Box> &boxes,
       pango_matrix_transform_point (&trans, &last[X_AXIS], &last[Y_AXIS]);
       points[d].push_back (last);
     }
-  while (flip (&d) != DOWN);
 
   for (vsize i = 0; i < points[DOWN].size () - 1; i++)
     {
       Box b;
-      do
+      for (DOWN_and_UP (d))
         {
           b.add_point (points[d][i]);
           b.add_point (points[d][i + 1]);
         }
-      while (flip (&d) != DOWN);
       boxes.push_back (b);
     }
 
index a37c520dfc9cc82e4b9969f20d0e2d71c910b6bd..7eadbb0eec3ca70d0cfec80e8685b888f33f5273 100644 (file)
@@ -26,6 +26,8 @@
 #include "staff-symbol.hh"
 #include "system-start-delimiter.hh"
 
+#include "translator.icc"
+
 struct Bracket_nesting_node
 {
 public:
@@ -227,8 +229,6 @@ System_start_delimiter_engraver::acknowledge_system_start_delimiter (Grob_info i
   nesting_->add_support (inf.grob ());
 }
 
-#include "translator.icc"
-
 ADD_ACKNOWLEDGER (System_start_delimiter_engraver, staff_symbol);
 ADD_ACKNOWLEDGER (System_start_delimiter_engraver, system_start_delimiter);
 
index 91e3f0818163f4036eeba3c4f620ed059002d6d7..4a18ab52b7fd8c8b61d153d182fe79afad490208 100644 (file)
@@ -414,7 +414,7 @@ System::vertical_skyline_elements (SCM smob)
   vector<Grob *> vertical_skyline_grobs;
   extract_grob_set (me_grob, "elements", my_elts);
   for (vsize i = 0; i < my_elts.size (); i++)
-    if (System_start_delimiter::has_interface (my_elts[i]))
+    if (has_interface<System_start_delimiter> (my_elts[i]))
       vertical_skyline_grobs.push_back (my_elts[i]);
 
   System *me = dynamic_cast<System *> (me_grob);
@@ -429,7 +429,7 @@ System::vertical_skyline_elements (SCM smob)
   extract_grob_set (align, "elements", elts);
 
   for (vsize i = 0; i < elts.size (); i++)
-    if (Hara_kiri_group_spanner::has_interface (elts[i]))
+    if (has_interface<Hara_kiri_group_spanner> (elts[i]))
       vertical_skyline_grobs.push_back (elts[i]);
 
   SCM grobs_scm = Grob_array::make_array ();
@@ -450,7 +450,7 @@ System::break_into_pieces (vector<Column_x_positions> const &breaking)
 
       int st = Paper_column::get_rank (c[0]);
       int end = Paper_column::get_rank (c.back ());
-      Interval iv (pure_height (this, st, end));
+      Interval iv (pure_y_extent (this, st, end));
       system->set_property ("pure-Y-extent", ly_interval2scm (iv));
 
       system->set_bound (LEFT, c[0]);
@@ -763,7 +763,7 @@ System::get_vertical_alignment (SCM smob)
   extract_grob_set (me, "elements", elts);
   Grob *ret = 0;
   for (vsize i = 0; i < elts.size (); i++)
-    if (Align_interface::has_interface (elts[i]))
+    if (has_interface<Align_interface> (elts[i]))
       {
         if (ret)
           me->programming_error ("found multiple vertical alignments in this system");
@@ -792,7 +792,7 @@ System::get_extremal_staff (Direction dir, Interval const &iv)
   vsize end = (dir == UP) ? elts.size () : VPOS;
   for (vsize i = start; i != end; i += dir)
     {
-      if (Hara_kiri_group_spanner::has_interface (elts[i]))
+      if (has_interface<Hara_kiri_group_spanner> (elts[i]))
         Hara_kiri_group_spanner::consider_suicide (elts[i]);
 
       Interval intersection = elts[i]->extent (this, X_AXIS);
@@ -822,7 +822,7 @@ System::get_neighboring_staff (Direction dir, Grob *vertical_axis_group, Interva
       if (elts[i] == vertical_axis_group)
         return out;
 
-      if (Hara_kiri_group_spanner::has_interface (elts[i]))
+      if (has_interface<Hara_kiri_group_spanner> (elts[i]))
         Hara_kiri_group_spanner::consider_suicide (elts[i]);
 
       bounds.intersect (elts[i]->spanned_rank_interval ());
@@ -917,7 +917,7 @@ System::calc_pure_relevant_grobs (SCM smob)
 
   for (vsize i = 0; i < elts.size (); ++i)
     {
-      if (!Axis_group_interface::has_interface (elts[i]))
+      if (!has_interface<Axis_group_interface> (elts[i]))
         {
           relevant_grobs.push_back (elts[i]);
 
index 8a0ef24139a5b8481e84e4277de5ff8a105cc36e..5f111a8581274bc026c21059f09da714f836a214 100644 (file)
@@ -40,7 +40,7 @@ Tie_column::add_tie (Grob *tc, Spanner *tie)
   Spanner *me = dynamic_cast<Spanner *> (tc);
 
   if (tie->get_parent (Y_AXIS)
-      && Tie_column::has_interface (tie->get_parent (Y_AXIS)))
+      && has_interface<Tie_column> (tie->get_parent (Y_AXIS)))
     return;
 
   if (!me->get_bound (LEFT)
index ad08638ebb000d81b22ba4a050c7f0aa0e2a0636..905718469cf0b7e696366219b37c6cee5acf4169 100644 (file)
@@ -99,7 +99,7 @@ Tie_formatting_problem::set_column_chord_outline (vector<Item *> bounds,
   for (vsize i = 0; i < bounds.size (); i++)
     {
       Grob *head = bounds[i];
-      if (!Note_head::has_interface (head))
+      if (!has_interface<Note_head> (head))
         continue;
 
       if (!stem)
index ae81317e392665ac08cca89a1926e7853c342f04..dcc53ad44e61c7af5ee5522ce3d8b18a19b56eb4 100644 (file)
@@ -45,13 +45,20 @@ bool
 Tie::less (Grob *g1, Grob *g2)
 {
   Spanner *s1 = dynamic_cast<Spanner *> (g1);
+  if (!s1)
+    {
+      g1->programming_error ("grob is not a tie");
+      return false;
+    }
+
   Spanner *s2 = dynamic_cast<Spanner *> (g2);
-  if (s1 && s2) {
-    return get_position (s1) < get_position (s2);
-  }
+  if (!s2)
+    {
+      g2->programming_error ("grob is not a tie");
+      return true;
+    }
 
-  programming_error ("grob is not a tie");
-  return false;
+  return get_position (s1) < get_position (s2);
 }
 
 void
@@ -64,7 +71,7 @@ Item *
 Tie::head (Spanner *me, Direction d)
 {
   Item *it = me->get_bound (d);
-  return Note_head::has_interface (it) ? it : 0;
+  return has_interface<Note_head> (it) ? it : 0;
 }
 
 int
@@ -146,8 +153,8 @@ Tie::calc_direction (SCM smob)
   // types.  It might be clearer to use a template.
   Grob *me = unsmob<Grob> (smob);
   Grob *yparent = me->get_parent (Y_AXIS);
-  if ((Tie_column::has_interface (yparent)
-       || Semi_tie_column::has_interface (yparent))
+  if ((has_interface<Tie_column> (yparent)
+       || has_interface<Semi_tie_column> (yparent))
       && unsmob<Grob_array> (yparent->get_object ("ties"))
       //      && unsmob<Grob_array> (yparent->get_object ("ties"))->size () > 1
      )
@@ -209,8 +216,8 @@ Tie::calc_control_points (SCM smob)
   Spanner *me = LY_ASSERT_SMOB(Spanner, smob, 1);
 
   Grob *yparent = me->get_parent (Y_AXIS);
-  if ((Tie_column::has_interface (yparent)
-       || Semi_tie_column::has_interface (yparent))
+  if ((has_interface<Tie_column> (yparent)
+       || has_interface<Semi_tie_column> (yparent))
       && unsmob<Grob_array> (yparent->get_object ("ties")))
     {
       extract_grob_set (yparent, "ties", ties);
index a1ad69c72acda43ff5f3eefbddb2374174a0d4fc..17e1194de80762822da92ed5e7d8767bc6a8a7d0 100644 (file)
@@ -64,7 +64,7 @@ get_x_bound_item (Grob *me_grob, Direction hdir, Direction my_dir)
 {
   Spanner *me = dynamic_cast<Spanner *> (me_grob);
   Item *g = me->get_bound (hdir);
-  if (Note_column::has_interface (g)
+  if (has_interface<Note_column> (g)
       && Note_column::get_stem (g)
       && Note_column::dir (g) == my_dir)
     g = Note_column::get_stem (g);
index c8781ca14d0d2b7d9dcae542b4fa2c597a3b30b1..4d879ade4c46b37fb143339358a592b11e76971d 100644 (file)
@@ -272,7 +272,7 @@ Tuplet_number::calc_x_offset (SCM smob)
 
   for (LEFT_and_RIGHT (d))
     {
-      if (Note_column::has_interface (bounds[d])
+      if (has_interface<Note_column> (bounds[d])
           && Note_column::get_stem (bounds[d]))
         bounds[d] = Note_column::get_stem (bounds[d]);
       bound_poss[d] = Axis_group_interface::generic_bound_extent (bounds[d], commonx, X_AXIS)[-d];
index d28d0d74a3b121e2c27828d92732920b36f12333..6a47809fd728d64fe33f03020bae8440cfb79d30 100644 (file)
@@ -120,7 +120,7 @@ Vertical_align_engraver::qualifies (Grob_info i) const
 {
   int sz = i.origin_contexts ((Translator *)this).size ();
 
-  return sz > 0 && Axis_group_interface::has_interface (i.grob ())
+  return sz > 0 && has_interface<Axis_group_interface> (i.grob ())
          && !i.grob ()->get_parent (Y_AXIS)
          && !to_boolean (i.grob ()->get_property ("no-alignment"))
          && Axis_group_interface::has_axis (i.grob (), Y_AXIS);
index 0ce1b463a821603de4ef2aa0da8e53897695f885..b58a5d69352d105bc2b12756a2ed739c9f2530af 100644 (file)
@@ -23,7 +23,7 @@ That's it.  For more information, visit http://lilypond.org .
 
 %}
 
-\version "2.19.24"  % necessary for upgrading to future LilyPond versions.
+\version "2.19.26"  % necessary for upgrading to future LilyPond versions.
 
 \header{
   title = "A scale in LilyPond"
index 3664ef258cf8463d6f6924cd4425c357367ccdf3..4bd39226b5b7ba2ba5ca5aacdece46530e3e69e2 100644 (file)
@@ -32,7 +32,7 @@ Good luck with LilyPond!  Happy engraving.
 
 %}
 
-\version "2.19.24"  % necessary for upgrading to future LilyPond versions.
+\version "2.19.26"  % necessary for upgrading to future LilyPond versions.
 
 \header{
   title = "A scale in LilyPond"
index 98e90347ad4a806bc41590f5b46567a5d6d29d4f..78acdbfe1f76da6ed22f49cc1a14ffc2cab3393a 100644 (file)
 % is much scope for improvement.
 
 % See: http://nicta.com.au/people/chubbp/articulate for additional
-
 % information about how the articulate function works.
 
 %%% Supported items:
+% Articulations on a single note (staccato, staccatissimo, portato, tenuto).
 % Slurs and phrasing slurs.
 % Ornaments (i.e. mordents, trills, turns).
 % Rallentando, accelerando, ritard and 'a tempo'.
 % Manual for a more detailed list of supported items.
 
 %%% Technical Details:
-% * Any note not under a slur or phrasing mark, and not marked with an
-% explicit articulation, is shortened by ac:normalFactor (default 7/8)
-% * Any note marked staccato is shortened by ac:staccatoFactor.
-% (default 1/2).
-% * Any note marked tenuto gets its full value.
+% * Any note not under a slur or phrasing slur, and not marked with an
+%   explicit articulation, is shortened by ac:normalFactor (default 7/8).
+%   (Shortening a note means replacing the note with a note of a smaller
+%   duration, and a rest to make up for the difference between the durations
+%   of the original and the shortened note.)
+% * Notes marked with articulations are shortened by factors specific to the
+%   articulation as follows:
+%     staccato       not under a slur: ac:staccatoFactor (default 1/2)
+%                    under a slur: ac:portatoFactor (default 3/4)
+%     staccatissimo  ac:staccatissimoFactor (default 1/4)
+%     portato        ac:portatoFactor (default 3/4)
+%     tenuto         ac:tenutoFactor (default 1/1 - by default, notes marked
+%                                     tenuto are not shortened)
 % * Appogiaturas are made to take half the value of the note following,
-% without taking dots into account (so in \appoggiatura c8 d2. the c
-% will take the time of a crotchet).
+%   without taking dots into account (so in \appoggiatura c8 d2. the c
+%   will take the time of a crotchet).
 % * Trills and turns are expanded. The algorithm tries to choose notes
-% within the time of the current tempo that lead to each twiddle being
-% around 1/8 seconds; this can be adjusted with the ac:maxTwiddleTime
-% variable.
+%   within the time of the current tempo that lead to each twiddle being
+%   around 1/8 seconds; this can be adjusted with the ac:maxTwiddleTime
+%   variable.
 % * Rall, poco rall and a tempo are observed. It'd be fairly trivial to
-% make accel. and stringendo and so on work too.
+%   make accel. and stringendo and so on work too.
 
 %
 %%%USAGE
 % * Cope with more ornaments/articulations.
 %    inverted-turns, etc.
 %   -- accent needs better control of dynamics.
-%   -- Articulations: mezzo-staccato, portato.
 %   -- Handling of generic ornaments (in lily, `\stopped'; in
 %               most early music:  ornament this note (trill, turn
 %               or mordent as the player wishes))
 % * accidentals for trills and turns
 
 % CHANGELOG
+%  * Heikki Tauriainen: handle also the \portato articulation (both as an
+%    explicit articulation, and as the articulation to use for slurred
+%    notes marked \staccato).
 %  * David Kastrup: remove redefinitions of \afterGrace and \appoggiatura
 %    and let their actions be performed when \articulate is called by
 %    recognizing and replacing LilyPond's default code for these constructs.
 % How much to compress notes marked staccatissimo.
 #(define ac:staccatissimoFactor '(1 . 4))
 
+% Shortening factor for notes marked portato (or slurred notes marked
+% staccato).
+#(define ac:portatoFactor '(3 . 4))
+
 % And tenuto (if we ever implement time stealing, this should be >1.0)
 #(define ac:tenutoFactor '(1 . 1))
 
    (unfold-repeats music)))
 
 % If there's an articulation, use it.
-% If in a slur, use (1 . 1) instead.
+% If in a slur, use (1 . 1) instead (unless the note is marked staccato,
+% in which case use ac:portatoFactor).
 % Treat phrasing slurs as slurs, but allow explicit articulation.
-% (Maybe should treat staccato under a phrasing slur as mezzo-staccato?)
 %
 % Expect an EventChord.
 %
 %  ac:articulate-chord applies the actions to each NoteEvent in
 %               the EventChord.
 #(define (ac:getactions music)
-  (let  loop ((factor ac:normalFactor)
-              (newelements '())
-              (es (ly:music-property music 'elements))
-              (actions '()))
-   (if (null? es)
-    (begin
-     (set! (ly:music-property music 'elements) (reverse newelements))
-     (if
-      (not (any (lambda (m) (music-is-of-type? m 'rhythmic-event))
-                newelements))
-      actions
-      (append
-       (let ((st ac:stealForward))
-        (if (= st 0)
-         '()
-         (begin
-          (set! ac:stealForward 0)
-          (list 'steal st))))
+  (let ((at-end-of-slur #f))
+   (let  loop ((factor ac:normalFactor)
+               (newelements '())
+               (es (ly:music-property music 'elements))
+               (actions '()))
+    (if (null? es)
+     (begin
+      (set! (ly:music-property music 'elements) (reverse newelements))
+      (if
+       (not (any (lambda (m) (music-is-of-type? m 'rhythmic-event))
+                 newelements))
        actions
-       (cond
-        (ac:inTrill '(trill))
-        ((and (eq? factor ac:normalFactor) (or ac:inSlur ac:inPhrasingSlur))
-         (list 'articulation  '(1 . 1)))
-        (else (list 'articulation  factor))))))
-    ; else part
-    (let ((e (car es))
-          (tail (cdr es)))
-     (case (ly:music-property e 'name)
-
-      ((BeamEvent) ; throw away beam events, or they'll be duplicated by turn or trill
-       (loop factor newelements tail actions))
-
-      ((LineBreakEvent FingeringEvent MarkEvent BreathingEvent TieEvent SkipEvent RestEvent) ; pass through some events.
-       (loop (cons 1 1) (cons e newelements) tail actions))
-
-      ((ArticulationEvent)
-       (let ((articname (ly:music-property e 'articulation-type)))
-        ; TODO: add more here
+       (append
+        (let ((st ac:stealForward))
+         (if (= st 0)
+          '()
+          (begin
+           (set! ac:stealForward 0)
+           (list 'steal st))))
+        actions
         (cond
-         ((string= articname "staccato")
-          (loop ac:staccatoFactor newelements tail actions))
-         ((string= articname "staccatissimo")
-          (loop ac:staccatissimoFactor newelements tail actions))
-         ((string= articname "tenuto")
-          (loop ac:tenutoFactor newelements tail actions))
-         ((string= articname "mordent")
-          (loop (cons 1 1) newelements tail (cons 'mordent actions)))
-         ((string= articname "prall")
-          (loop (cons 1 1) newelements tail (cons 'prall actions)))
-         ((string= articname "trill")
-          (loop (cons 1 1) newelements tail (cons 'trill actions)))
-         ((string= articname "turn")
-          (loop (cons 1 1) newelements tail (cons 'turn actions)))
-         (else (loop factor (cons e newelements) tail actions)))))
-
-      ((TextScriptEvent)
-       (let ((t (ly:music-property e 'text)))
-        (if (not (string? t))
-         (loop factor (cons e newelements) tail actions)
-         (begin
-          (cond
-           ((or
-             (string= t "rall")
-             (string= t "Rall")
-             (string= t "rit.")
-             (string= t "rall."))
-            (loop factor (cons e newelements) tail (cons 'rall actions)))
-           ((or
-             (string= t "accelerando")
-             (string= t "accel")
-             (string= t "accel."))
-            (loop factor (cons e newelements) tail (cons 'accel actions)))
-           ((or
-             (string= t "poco accel."))
-            (loop factor (cons e newelements) tail (cons 'pocoAccel actions)))
-           ((or
-             (string= t "poco rall.")
-             (string= t "poco rit."))
-            (loop factor (cons e newelements) tail (cons 'pocoRall actions)))
-           ((or (string= t "a tempo")
-             (string= t "tempo I"))
-          (loop factor (cons e newelements) tail (cons 'aTempo actions)))
-           (else (loop factor (cons e newelements) tail actions)))))))
-
-      ((SlurEvent)
-       (let ((direction (ly:music-property e 'span-direction)))
-        (set! ac:inSlur (eq? direction -1))
-        (loop factor newelements tail actions)))
-
-      ((TrillSpanEvent)
-       (let ((direction (ly:music-property e 'span-direction)))
-        (set! ac:inTrill (eq? direction -1))
-        (if ac:inTrill
-         (loop factor newelements tail (cons 'trill actions))
-         (loop factor (cons e newelements) tail actions))))
-
-      ((PhrasingSlurEvent)
-       (let ((direction (ly:music-property e 'span-direction)))
-        (set! ac:inPhrasingSlur (eq? direction -1))
-        (loop factor newelements tail actions)))
-
-      (else (loop factor (cons e newelements) tail actions)))))))
+         (ac:inTrill '(trill))
+         ((and (eq? factor ac:normalFactor) (or ac:inSlur ac:inPhrasingSlur))
+          (list 'articulation  '(1 . 1)))
+         ((and (eq? factor ac:staccatoFactor) (or ac:inSlur at-end-of-slur))
+          (list 'articulation ac:portatoFactor))
+         (else (list 'articulation  factor))))))
+     ; else part
+     (let ((e (car es))
+           (tail (cdr es)))
+      (case (ly:music-property e 'name)
+
+       ((BeamEvent) ; throw away beam events, or they'll be duplicated by turn or trill
+        (loop factor newelements tail actions))
+
+       ((LineBreakEvent FingeringEvent MarkEvent BreathingEvent TieEvent SkipEvent RestEvent) ; pass through some events.
+        (loop (cons 1 1) (cons e newelements) tail actions))
+
+       ((ArticulationEvent)
+        (let ((articname (ly:music-property e 'articulation-type)))
+         ; TODO: add more here
+         (cond
+          ((string= articname "staccato")
+           (loop ac:staccatoFactor newelements tail actions))
+          ((string= articname "staccatissimo")
+           (loop ac:staccatissimoFactor newelements tail actions))
+          ((string= articname "portato")
+           (loop ac:portatoFactor newelements tail actions))
+          ((string= articname "tenuto")
+           (loop ac:tenutoFactor newelements tail actions))
+          ((string= articname "mordent")
+           (loop (cons 1 1) newelements tail (cons 'mordent actions)))
+          ((string= articname "prall")
+           (loop (cons 1 1) newelements tail (cons 'prall actions)))
+          ((string= articname "trill")
+           (loop (cons 1 1) newelements tail (cons 'trill actions)))
+          ((string= articname "turn")
+           (loop (cons 1 1) newelements tail (cons 'turn actions)))
+          (else (loop factor (cons e newelements) tail actions)))))
+
+       ((TextScriptEvent)
+        (let ((t (ly:music-property e 'text)))
+         (if (not (string? t))
+          (loop factor (cons e newelements) tail actions)
+          (begin
+           (cond
+            ((or
+              (string= t "rall")
+              (string= t "Rall")
+              (string= t "rit.")
+              (string= t "rall."))
+             (loop factor (cons e newelements) tail (cons 'rall actions)))
+            ((or
+              (string= t "accelerando")
+              (string= t "accel")
+              (string= t "accel."))
+             (loop factor (cons e newelements) tail (cons 'accel actions)))
+            ((or
+              (string= t "poco accel."))
+             (loop factor (cons e newelements) tail (cons 'pocoAccel actions)))
+            ((or
+              (string= t "poco rall.")
+              (string= t "poco rit."))
+             (loop factor (cons e newelements) tail (cons 'pocoRall actions)))
+            ((or (string= t "a tempo")
+              (string= t "tempo I"))
+           (loop factor (cons e newelements) tail (cons 'aTempo actions)))
+            (else (loop factor (cons e newelements) tail actions)))))))
+
+       ((SlurEvent)
+        (let ((direction (ly:music-property e 'span-direction)))
+         (set! ac:inSlur (eq? direction -1))
+         (set! at-end-of-slur (eq? direction 1))
+         (loop factor newelements tail actions)))
+
+       ((TrillSpanEvent)
+        (let ((direction (ly:music-property e 'span-direction)))
+         (set! ac:inTrill (eq? direction -1))
+         (if ac:inTrill
+          (loop factor newelements tail (cons 'trill actions))
+          (loop factor (cons e newelements) tail actions))))
+
+       ((PhrasingSlurEvent)
+        (let ((direction (ly:music-property e 'span-direction)))
+         (set! ac:inPhrasingSlur (eq? direction -1))
+         (loop factor newelements tail actions)))
+
+       (else (loop factor (cons e newelements) tail actions))))))))
 
 
 
index e8b96025773683aab20fbf3e2d4f42b914105e5b..24b8ce055845e3d730475b64da9c94e6a9e46b46 100644 (file)
@@ -23,3 +23,26 @@ RemoveEmptyStaves = \with {
   \description "Remove staves which are considered to be empty according
 to the list of interfaces set by @code{keepAliveInterfaces}."
 }
+
+inherit-acceptability =
+#(define-void-function (to from)
+   (symbol? symbol?)
+   (_i "When used in an output definition, will modify all context
+definitions such that context @var{to} is accepted as a child by all
+contexts that also accept @var{from}.")
+   (let* ((module (current-module))
+         (cmod (ly:make-context-mod)))
+     (ly:add-context-mod cmod (list 'accepts to))
+     (if (output-module? module)
+        (module-map
+         (lambda (_sym var)
+           (if (variable-bound? var)
+               (let ((cdef (variable-ref var)))
+                 (if (ly:context-def? cdef)
+                     (let ((accepts (ly:context-def-lookup cdef 'accepts)))
+                       (if (and (memq from accepts)
+                                (not (memq to accepts)))
+                           (variable-set! var
+                                          (ly:context-def-modify cdef cmod))))))))
+         module)
+        (ly:parser-error (_ "Not in an output definition")))))
index 2ea76ac646cc180d2fd09ecc43ff02bee06207d8..62559ca40fb6df178f3ab3b9d18954e6ad50769f 100644 (file)
   \accepts "FiguredBass"
   \accepts "GrandStaff"
   \accepts "Lyrics"
+  \accepts "OneStaff"
   \accepts "PianoStaff"
   \accepts "RhythmicStaff"
   \accepts "Staff"
@@ -385,6 +386,7 @@ together, never separately."
   \accepts "FretBoards"
   \accepts "GrandStaff"
   \accepts "Lyrics"
+  \accepts "OneStaff"
   \accepts "PianoStaff"
   \accepts "RhythmicStaff"
   \accepts "Staff"
@@ -397,6 +399,35 @@ staves are connected vertically.  @code{StaffGroup} only consists of
 a collection of staves, with a bracket in front and spanning bar lines."
 }
 
+\context {
+  \type "Engraver_group"
+  \name "OneStaff"
+  \accepts "ChordNames"
+  \accepts "DrumStaff"
+  \accepts "Dynamics"
+  \accepts "FiguredBass"
+  \accepts "FretBoards"
+  \accepts "GregorianTranscriptionStaff"
+  \accepts "KievanStaff"
+  \accepts "Lyrics"
+  \accepts "MensuralStaff"
+  \accepts "NoteNames"
+  \accepts "PetrucciStaff"
+  \accepts "RhythmicStaff"
+  \accepts "Staff"
+  \accepts "TabStaff"
+  \accepts "VaticanaStaff"
+  \defaultchild "Staff"
+  \consists "Axis_group_engraver"
+
+  \description "Provides a common axis for the contained staves,
+making all of them appear in the same vertical space.  This can be
+useful for typesetting staves of different types in immediate succession
+or for temporarily changing the character of one staff or overlaying
+it with a different one.  Often used with @code{\\stopStaff} and
+@code{\\startStaff} for best results."
+}
+
 \context {
   \type "Engraver_group"
   \name "Dynamics"
@@ -571,6 +602,7 @@ automatically when an output definition (a @code{\\score} or
   \accepts "ChordNames"
   \accepts "Devnull"
   \accepts "DrumStaff"
+  \accepts "Dynamics"
   \accepts "FiguredBass"
   \accepts "FretBoards"
   \accepts "GrandStaff"
@@ -579,6 +611,7 @@ automatically when an output definition (a @code{\\score} or
   \accepts "Lyrics"
   \accepts "MensuralStaff"
   \accepts "NoteNames"
+  \accepts "OneStaff"
   \accepts "PetrucciStaff"
   \accepts "PianoStaff"
   \accepts "RhythmicStaff"
index 9af5c885395fffaf5a4b57215d4ba9ad462479ea..5e04d325cfd1ea15fe6c7d29a02553e62683dd8d 100644 (file)
@@ -29,8 +29,6 @@
 #(use-modules (srfi srfi-1)
               (ice-9 optargs))
 
-%% TODO: using define-music-function in a .scm causes crash.
-
 absolute =
 #(define-music-function (music)
    (ly:music?)
@@ -189,19 +187,17 @@ pitch where to switch staves may be specified.  The clefs for the staves are
 optional as well.  Setting clefs  works only for implicitly instantiated
 staves.")
   (let ;; keep the contexts alive for the full duration
-       ((skip (make-skip-music (make-duration-of-length
-                                     (ly:music-length music)))))
-    #{
-      <<
-        \context Staff = "up" $(or clef-1 #{ \with { \clef "treble" } #})
-          <<
-          #(make-autochange-music pitch music)
-          \new Voice { #skip }
-          >>
-        \context Staff = "down" $(or clef-2 #{ \with { \clef "bass" } #})
-          \new Voice { #skip }
-      >>
-    #}))
+       ((skip (make-duration-of-length (ly:music-length music)))
+        (clef-1 (or clef-1 #{ \with { \clef "treble" } #}))
+        (clef-2 (or clef-2 #{ \with { \clef "bass" } #})))
+    (make-simultaneous-music
+     (list
+      (descend-to-context (make-autochange-music pitch music) 'Staff
+                          "up" clef-1)
+      (context-spec-music (make-skip-music skip) 'Staff
+                          "up" clef-1)
+      (context-spec-music (make-skip-music skip) 'Staff
+                          "down" clef-2)))))
 
 balloonGrobText =
 #(define-music-function (grob-name offset text)
@@ -844,6 +840,37 @@ mark =
           (if label (set! (ly:music-property ev 'label) label))
           ev))))
 
+markupMap =
+#(define-music-function (path markupfun music)
+   (symbol-list-or-symbol? markup-function? ly:music?)
+   (_i "This applies the given markup function @var{markupfun} to all markup
+music properties matching @var{path} in @var{music}.
+
+For example,
+@example
+\\new Voice @{ g'2 c'' @}
+\\addlyrics @{
+  \\markupMap LyricEvent.text
+             \\markup \\with-color #red \\etc
+             @{ Oh yes! @}
+@}
+@end example
+")
+   (let* ((p (check-music-path path (*location*)))
+          (name (and p (car p)))
+          (prop (and p (cadr p))))
+     (if p
+         (for-some-music
+          (lambda (m)
+            (if (or (not name) (eq? (ly:music-property m 'name) name))
+                (let ((text (ly:music-property m prop)))
+                  (if (markup? text)
+                      (set! (ly:music-property m prop)
+                            (list markupfun text)))))
+            #f)
+          music)))
+   music)
+
 musicMap =
 #(define-music-function (proc mus) (procedure? ly:music?)
    (_i "Apply @var{proc} to @var{mus} and all of the music it contains.")
index 0c4a03af59379d545c3f2aa8d5344e7f18a372dc..00c4bdf3dabcd3b64b4b07ac369acc627cbf78b5 100644 (file)
   \accepts ChordNames
   \accepts Devnull
   \accepts DrumStaff
+  \accepts Dynamics
   \accepts FiguredBass
   \accepts GrandStaff
   \accepts GregorianTranscriptionStaff
   \accepts MensuralStaff
   \accepts NoteNames
   \accepts NullVoice
+  \accepts OneStaff
   \accepts PetrucciStaff
   \accepts PianoStaff
   \accepts RhythmicStaff
   \accepts DrumStaff
   \accepts GrandStaff
   \accepts Lyrics
+  \accepts OneStaff
   \accepts PianoStaff
   \accepts RhythmicStaff
   \accepts Staff
   \accepts FretBoards
   \accepts GrandStaff
   \accepts Lyrics
+  \accepts OneStaff
   \accepts PianoStaff
   \accepts RhythmicStaff
   \accepts Staff
   \defaultchild Staff
 }
 
+\context {
+  \type "Performer_group"
+  \name "OneStaff"
+  \accepts "ChordNames"
+  \accepts "DrumStaff"
+  \accepts "Dynamics"
+  \accepts "FiguredBass"
+  \accepts "FretBoards"
+  \accepts "GregorianTranscriptionStaff"
+  \accepts "KievanStaff"
+  \accepts "Lyrics"
+  \accepts "MensuralStaff"
+  \accepts "NoteNames"
+  \accepts "PetrucciStaff"
+  \accepts "RhythmicStaff"
+  \accepts "Staff"
+  \accepts "TabStaff"
+  \accepts "VaticanaStaff"
+  \defaultchild "Staff"
+}
+
 \context {
   \Staff
   \name RhythmicStaff
index eb9ced5375c577714e31e005877a71caeaad6fe9..f397ad6bd90177b34de35c2f28ba5d96d8ce15f6 100644 (file)
@@ -76,14 +76,8 @@ scoreTitleMarkup = \markup { \column {
 #(define (book-first-page? layout props)
    "Return #t iff the current page number, got from @code{props}, is the
 book first one."
-   (define (ancestor layout)
-     "Return the topmost layout ancestor"
-     (let ((parent (ly:output-def-parent layout)))
-       (if (not (ly:output-def? parent))
-           layout
-           (ancestor parent))))
    (= (chain-assoc-get 'page:page-number props -1)
-      (ly:output-def-lookup (ancestor layout) 'first-page-number)))
+      (book-first-page layout props)))
 
 #(define (book-last-page? layout props)
    "Return #t iff the current page number, got from @code{props}, is the
diff --git a/mf/00-lilypond-fonts.conf.in b/mf/00-lilypond-fonts.conf.in
new file mode 100644 (file)
index 0000000..899db67
--- /dev/null
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+<fontconfig>
+
+  <!--
+  Define LilyPond default fonts. Where a character doesn't exist in the
+  first font listed, the next font listed will be used instead for that
+  character. Also see scm/font.scm.
+  -->
+
+  <alias binding="strong">
+    <family>LilyPond Serif</family>
+    <prefer>
+      <family>TeX Gyre Schola</family>
+      <family>DejaVu Serif</family>
+    </prefer>
+    <default>
+      <family>serif</family>
+    </default>
+  </alias>
+
+  <alias binding="strong">
+    <family>LilyPond Sans Serif</family>
+    <prefer>
+      <family>TeX Gyre Heros</family>
+      <family>DejaVu Sans</family>
+    </prefer>
+    <default>
+      <family>sans-serif</family>
+    </default>
+  </alias>
+
+  <alias binding="strong">
+    <family>LilyPond Monospace</family>
+    <prefer>
+      <family>TeX Gyre Cursor</family>
+      <family>DejaVu Sans Mono</family>
+    </prefer>
+    <default>
+      <family>monospace</family>
+    </default>
+  </alias>
+
+</fontconfig>
diff --git a/mf/99-lilypond-fonts.conf.in b/mf/99-lilypond-fonts.conf.in
new file mode 100644 (file)
index 0000000..83f8b53
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+<fontconfig>
+
+  <!--
+      Reject bitmap fonts
+      from fontconfig 70-no-bitmaps.conf
+      LilyPond can not use bitmap fonts.
+  -->
+
+  <selectfont>
+    <rejectfont>
+      <pattern>
+       <patelt name="scalable"><bool>false</bool></patelt>
+      </pattern>
+    </rejectfont>
+  </selectfont>
+
+</fontconfig>
index 5550eaf06b49a258d8455b795d24ca65970b6d93..4860f65f6e61a6203d4b21fa33773a11ce83117c 100644 (file)
@@ -35,22 +35,10 @@ OTF_TABLES = $(STAFF_SIZES:%=$(outdir)/feta%.otf-table) \
 SVG_FILES = $(OTF_FILES:%.otf=%.svg)
 WOFF_FILES = $(OTF_FILES:%.otf=%.woff)
 
-NCSB_OTFS = $(addprefix $(outdir)/,CenturySchL-Ital.otf \
-                                  CenturySchL-BoldItal.otf \
-                                  CenturySchL-Roma.otf \
-                                  CenturySchL-Bold.otf)
+TEXGYRE_OTFS = $(addprefix $(TEXGYRE_DIR)/,$(TEXGYRE_FILES))
 
-HELV_OTFS = $(addprefix $(outdir)/,NimbusSanL-ReguItal.otf \
-                                  NimbusSanL-BoldItal.otf \
-                                  NimbusSanL-Regu.otf \
-                                  NimbusSanL-Bold.otf)
-
-COUR_OTFS = $(addprefix $(outdir)/,NimbusMonL-ReguObli.otf \
-                                  NimbusMonL-BoldObli.otf \
-                                  NimbusMonL-Regu.otf \
-                                  NimbusMonL-Bold.otf)
-
-LILYPOND_FONTS_CONF = $(outdir)/lilypond-fonts.conf
+LILYPOND_FONTS_CONF = $(outdir)/00-lilypond-fonts.conf \
+                     $(outdir)/99-lilypond-fonts.conf
 
 LOG_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.log)
 LISP_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.lisp)
@@ -85,9 +73,6 @@ $(outdir)/emmentaler-%.genpe: $(buildscript-dir)/gen-emmentaler-scripts
        $< --dir=$(outdir) --design-size=$(patsubst emmentaler-%.genpe,%,$(notdir $@))
 
 ALL_GEN_FILES = $(ENC_FILES) \
-               $(NCSB_OTFS) \
-               $(HELV_OTFS) \
-               $(COUR_OTFS) \
                $(OTF_FILES) \
                $(SVG_FILES) \
                $(WOFF_FILES) \
@@ -102,7 +87,7 @@ INSTALLATION_OUT_SUFFIXES = 1 2 3
 
 INSTALLATION_OUT_DIR1 = $(local_lilypond_datadir)/fonts/otf
 INSTALLATION_OUT_FILES1 = $(OTF_FILES) \
-                         $(NCSB_OTFS) $(HELV_OTFS) $(COUR_OTFS)
+                         $(TEXGYRE_OTFS)
 
 INSTALLATION_OUT_DIR2 = $(local_lilypond_datadir)/fonts/svg
 INSTALLATION_OUT_FILES2 = $(SVG_FILES) $(WOFF_FILES)
@@ -178,37 +163,3 @@ local-clean:
 
 $(outdir)/fonts.conf:
        echo '<fontconfig><dir>'$(shell cd $(outdir); pwd)'</dir></fontconfig>' > $@
-
-
-$(outdir)/CenturySchL-Roma.otf: $(NCSB_SOURCE_FILES) \
-             $(auxscript-dir)/pfx2ttf.fontforge
-       $(foreach i, $(basename $(NCSB_SOURCE_FILES)), \
-               $(FONTFORGE) -script $(auxscript-dir)/pfx2ttf.fontforge \
-                       $(i).pfb $(i).afm $(outdir)/ && ) true
-
-$(addprefix $(outdir)/,CenturySchL-Ital.otf \
-       CenturySchL-Bold.otf \
-       CenturySchL-BoldItal.otf): $(outdir)/CenturySchL-Roma.otf
-       $(UPDATE_TARGET)
-
-$(outdir)/NimbusSanL-Regu.otf: $(HELV_SOURCE_FILES) \
-             $(auxscript-dir)/pfx2ttf.fontforge
-       $(foreach i, $(basename $(HELV_SOURCE_FILES)), \
-               $(FONTFORGE) -script $(auxscript-dir)/pfx2ttf.fontforge \
-                       $(i).pfb $(i).afm $(outdir)/ && ) true
-
-$(addprefix $(outdir)/,NimbusSanL-ReguItal.otf \
-       NimbusSanL-Bold.otf \
-       NimbusSanL-BoldItal.otf): $(outdir)/NimbusSanL-Regu.otf
-       $(UPDATE_TARGET)
-
-$(outdir)/NimbusMonL-Regu.otf: $(COUR_SOURCE_FILES) \
-             $(auxscript-dir)/pfx2ttf-mono.fontforge
-       $(foreach i, $(basename $(COUR_SOURCE_FILES)), \
-               $(FONTFORGE) -script $(auxscript-dir)/pfx2ttf-mono.fontforge \
-                       $(i).pfb $(i).afm $(outdir)/ && ) true
-
-$(addprefix $(outdir)/,NimbusMonL-ReguObli.otf \
-       NimbusMonL-Bold.otf \
-       NimbusMonL-BoldObli.otf): $(outdir)/NimbusMonL-Regu.otf
-       $(UPDATE_TARGET)
diff --git a/mf/lilypond-fonts.conf.in b/mf/lilypond-fonts.conf.in
deleted file mode 100644 (file)
index e32baf8..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
-<fontconfig>
-
-  <!--
-  Define LilyPond default fonts. Where a character doesn't exist in the
-  first font listed, the next font listed will be used instead for that
-  character. Also see scm/font.scm.
-  -->
-
-  <alias binding="strong">
-    <family>LilyPond Serif</family>
-    <prefer>
-      <family>Century Schoolbook L</family>
-      <family>DejaVu Serif</family>
-    </prefer>
-    <default>
-      <family>serif</family>
-    </default>
-  </alias>
-
-  <alias binding="strong">
-    <family>LilyPond Sans Serif</family>
-    <prefer>
-      <family>Nimbus Sans L</family>
-      <family>DejaVu Sans</family>
-    </prefer>
-    <default>
-      <family>sans-serif</family>
-    </default>
-  </alias>
-
-  <alias binding="strong">
-    <family>LilyPond Monospace</family>
-    <prefer>
-      <family>Nimbus Mono L</family>
-      <family>DejaVu Sans Mono</family>
-    </prefer>
-    <default>
-      <family>monospace</family>
-    </default>
-  </alias>
-
-  <!--
-      Reject bitmap fonts
-      from fontconfig 70-no-bitmaps.conf
-      LilyPond can not use bitmap fonts.
-  -->
-
-  <selectfont>
-    <rejectfont>
-      <pattern>
-       <patelt name="scalable"><bool>false</bool></patelt>
-      </pattern>
-    </rejectfont>
-  </selectfont>
-
-</fontconfig>
index 6f0c9cc16da02fb2a9c378c51e1254efad9c52e4..fa700548d124fb307e85788bc5a2c537cc207881 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -7,10 +7,10 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: lilypond 2.19.16\n"
+"Project-Id-Version: lilypond 2.19.26\n"
 "Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs\n"
-"POT-Creation-Date: 2015-02-28 14:31+0000\n"
-"PO-Revision-Date: 2015-03-02 13:28+0100\n"
+"POT-Creation-Date: 2015-08-27 10:48+0100\n"
+"PO-Revision-Date: 2015-08-31 18:53+0200\n"
 "Last-Translator: Jean-Charles Malahieude <lilyfan@orange.fr>\n"
 "Language-Team: French <traduc@traduc.org>\n"
 "Language: fr\n"
@@ -172,7 +172,7 @@ msgstr "\\textstyle est obsolète ; utiliser désormais la syntaxe \\key"
 
 #: convertrules.py:82 convertrules.py:1856 convertrules.py:2032
 #: convertrules.py:2175 convertrules.py:2506 convertrules.py:2801
-#: convertrules.py:3151 convertrules.py:3385 convertrules.py:3697
+#: convertrules.py:3151 convertrules.py:3388 convertrules.py:3700
 msgid "bump version for release"
 msgstr "sauter de version pour mise à jour"
 
@@ -597,7 +597,7 @@ msgstr "Suppression de oldaddlyrics"
 #: convertrules.py:2820
 msgid ""
 "oldaddlyrics is no longer supported. \n"
-"         Use addlyrics or lyrsicsto instead.\n"
+"         Use addlyrics or lyricsto instead.\n"
 msgstr ""
 "oldaddlyrics n'est désormais plus pris en charge.\n"
 "         Utilisez maintenant addlyrics ou lyricsto.\n"
@@ -859,15 +859,15 @@ msgstr ""
 "input/regression/beam-broken-classic.ly indique comment sont désormais\n"
 "gérées les ligatures tronquées.\n"
 
-#: convertrules.py:3369
+#: convertrules.py:3372
 msgid "beamExceptions controls whole-measure beaming."
 msgstr "Une ligature sur la mesure est gérée par beamExceptions"
 
-#: convertrules.py:3606
+#: convertrules.py:3609
 msgid "Flag.transparent and Flag.color inherit from Stem"
 msgstr "Flag.transparent et Flag.color héritent de Stem"
 
-#: convertrules.py:3672
+#: convertrules.py:3675
 msgid "Staff-padding now controls the distance to the baseline, not the nearest point."
 msgstr ""
 "Staff-padding contrôle désormais la distance par rapport à la ligne de\n"
@@ -977,12 +977,12 @@ msgstr ""
 msgid "Unable to find instrument for ID=%s\n"
 msgstr "Aucun instrument ne correspond à l'ID %s\n"
 
-#: abc2ly.py:1386 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044
+#: abc2ly.py:1389 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044
 #, python-format
 msgid "%s [OPTION]... FILE"
 msgstr "%s [OPTIONS]... FICHIER"
 
-#: abc2ly.py:1387
+#: abc2ly.py:1390
 #, python-format
 msgid ""
 "abc2ly converts ABC music files (see\n"
@@ -991,29 +991,29 @@ msgstr ""
 "abc2ly convertit les fichiers musicaux ABC (voir\n"
 "%s) au format LilyPond.\n"
 
-#: abc2ly.py:1395 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231
-#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:183
+#: abc2ly.py:1398 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231
+#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:184
 msgid "show version number and exit"
 msgstr "affiche le numéro de version et quitte"
 
-#: abc2ly.py:1398 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140
-#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:162
+#: abc2ly.py:1401 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140
+#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:163
 msgid "show this help and exit"
 msgstr "visualiser cette aide et quitter"
 
-#: abc2ly.py:1401 etf2ly.py:1209 midi2ly.py:1071
+#: abc2ly.py:1404 etf2ly.py:1209 midi2ly.py:1071
 msgid "write output to FILE"
 msgstr "produit la sortie dans le FICHIER"
 
-#: abc2ly.py:1404
+#: abc2ly.py:1407
 msgid "be strict about success"
 msgstr "être strict sur la réussite"
 
-#: abc2ly.py:1407
+#: abc2ly.py:1410
 msgid "preserve ABC's notion of beams"
 msgstr "préserver la notion de ligature propre à ABC"
 
-#: abc2ly.py:1410
+#: abc2ly.py:1413
 msgid "suppress progress messages"
 msgstr "n'affiche pas les messages de progression"
 
@@ -1021,8 +1021,8 @@ msgstr "n'affiche pas les messages de progression"
 #. "Report bugs in English via %s",
 #. or if there is a LilyPond users list or forum in your language
 #. "Report bugs in English via %s or in YOUR_LANG via URI"
-#: abc2ly.py:1413 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258
-#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:317
+#: abc2ly.py:1416 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258
+#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:318
 #, c-format, python-format
 msgid "Report bugs via %s"
 msgstr ""
@@ -1080,7 +1080,7 @@ msgstr ""
 "(NONE, ERROR, WARNING, PROGRESS (par défaut), DEBUG)"
 
 #: convert-ly.py:111 lilypond-book.py:163 lilypond-book.py:181
-#: musicxml2ly.py:2629 main.cc:176
+#: musicxml2ly.py:2629 main.cc:177
 msgid "LOGLEVEL"
 msgstr "LOGLEVEL"
 
@@ -1112,7 +1112,7 @@ msgid "make a numbered backup [default: filename.ext~]"
 msgstr "effectue un archivage numéroté [par défaut : nomfichier.etx~]"
 
 #: convert-ly.py:152 etf2ly.py:1212 lilypond-book.py:234 midi2ly.py:1096
-#: main.cc:185
+#: main.cc:186
 msgid "show warranty and copyright"
 msgstr "affiche les notices de garantie et du droit d'auteur"
 
@@ -1133,19 +1133,19 @@ msgstr "Arrêt à la dernière règle appliquée avec succès"
 msgid "Processing `%s'... "
 msgstr "Traitement de « %s »..."
 
-#: convert-ly.py:368
+#: convert-ly.py:366
 #, python-format
 msgid "%s: Unable to open file"
 msgstr "impossible d'ouvrir le fichier « %s »"
 
-#: convert-ly.py:374
+#: convert-ly.py:372
 #, python-format
 msgid "%s: Unable to determine version.  Skipping"
 msgstr ""
 "impossible de déterminer la version de « %s ».\n"
 " Au suivant !"
 
-#: convert-ly.py:380
+#: convert-ly.py:378
 #, python-format
 msgid ""
 "%s: Invalid version string `%s' \n"
@@ -1155,7 +1155,7 @@ msgstr ""
 "Un numéro de version valide est formé de trois nombres séparés par un point,\n"
 "comme par exemple « 2.8.12 »"
 
-#: convert-ly.py:386
+#: convert-ly.py:384
 #, python-format
 msgid "There was %d error."
 msgid_plural "There were %d errors."
@@ -1177,7 +1177,7 @@ msgstr ""
 "exploitable.\n"
 
 #: etf2ly.py:1210 midi2ly.py:1067 midi2ly.py:1072 musicxml2ly.py:2659
-#: main.cc:168 main.cc:180
+#: main.cc:169 main.cc:181
 msgid "FILE"
 msgstr "FICHIER"
 
@@ -1219,7 +1219,7 @@ msgid "add DIR to include path"
 msgstr "ajoute le RÉP au chemin de recherche des inclusions"
 
 #: lilypond-book.py:143 lilypond-book.py:150 lilypond-book.py:169
-#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:167
+#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:168
 msgid "DIR"
 msgstr "RÉP"
 
@@ -1232,7 +1232,7 @@ msgid "PAD"
 msgstr "PAD"
 
 #: lilypond-book.py:157
-msgid "pad left side of music to align music inspite of uneven bar numbers (in mm)"
+msgid "pad left side of music to align music in spite of uneven bar numbers (in mm)"
 msgstr ""
 "tasse la musique par la gauche pour la répartir en dépit du nombre irrégulier\n"
 "de mesures (en mm)"
@@ -1808,7 +1808,7 @@ msgstr ""
 "La saisie d'une liste d'altérations accidentelles doit débuter\n"
 "par un nom de contexte : %s"
 
-#: accidental-engraver.cc:210
+#: accidental-engraver.cc:207
 #, c-format
 msgid "procedure or context-name expected for accidental rule, found %s"
 msgstr ""
@@ -1824,7 +1824,7 @@ msgstr "Aucun nom de glyphe ne correspond à l'altération %s"
 msgid "natural alteration glyph not found"
 msgstr "pas de glyphe correspondant au bécarre"
 
-#: all-font-metrics.cc:149
+#: all-font-metrics.cc:159
 #, c-format
 msgid "cannot find font: `%s'"
 msgstr "fonte « %s » introuvable"
@@ -1837,11 +1837,6 @@ msgstr "l'argument \\applycontext n'est pas une procédure"
 msgid "no heads for arpeggio found?"
 msgstr "arpeggio sans tête de note ?"
 
-#: auto-change-iterator.cc:74 change-iterator.cc:72
-#, c-format
-msgid "cannot change, already in translator: %s"
-msgstr "modification impossible, c'est déjà dans le translateur : %s"
-
 #: axis-group-engraver.cc:149
 msgid "Axis_group_engraver: vertical group already has a parent"
 msgstr "Axis_group_engraver : le groupe vertical a déjà un parent"
@@ -1854,14 +1849,14 @@ msgstr "Axis_group_engraver redondant"
 msgid "removing this vertical group"
 msgstr "retrait de ce groupe vertical"
 
-#: axis-group-interface.cc:714
+#: axis-group-interface.cc:716
 #, c-format
 msgid "\"%s\" is not a valid outside-staff-placement-directive"
 msgstr ""
 "on ne peut positionner un objet externe à la portée avec \"%s\"\n"
 "  (outside-staff-position-directive)"
 
-#: axis-group-interface.cc:786
+#: axis-group-interface.cc:788
 msgid "an outside-staff object should have a direction, defaulting to up"
 msgstr ""
 "un objet externe à la portée devrait avoir un positionnement.\n"
@@ -1893,13 +1888,13 @@ msgid "beam was started here"
 msgstr "la ligature a débuté ici"
 
 #. We are completely screwed.
-#: beam-quanting.cc:839
+#: beam-quanting.cc:850
 msgid "no viable initial configuration found: may not find good beam slope"
 msgstr ""
 "pas de configuration initiale viable repérée :\n"
 "la pente de la ligature pourrait être inesthétique."
 
-#: beam.cc:181
+#: beam.cc:183
 msgid "removing beam with no stems"
 msgstr "suppression d'une ligature ayant moins de deux hampes"
 
@@ -1909,22 +1904,24 @@ msgid "cannot change `%s' to `%s'"
 msgstr "impossible de changer « %s » en « %s »"
 
 #. FIXME: constant error message.
-#: change-iterator.cc:93
+#: change-iterator.cc:67
 msgid "cannot find context to switch to"
 msgstr "impossible de repérer le contexte vers lequel commuter"
 
+#. No enclosing context was found because the iterator's immediate
+#. context is the kind that was sought.
 #. We could change the current translator's id, but that would make
 #. errors hard to catch.
 #.
 #. last->translator_id_string () = get_change
 #. ()->change_to_id_string ();
-#: change-iterator.cc:102
+#: change-iterator.cc:78
 #, c-format
 msgid "not changing to same context type: %s"
 msgstr "pas de changement vers le même type de contexte : %s"
 
-#. FIXME: uncomprehensable message
-#: change-iterator.cc:106
+#. FIXME: incomprehensible message
+#: change-iterator.cc:82
 msgid "none of these in my family"
 msgstr "aucun de ceux-ci dans ma famille"
 
@@ -1963,22 +1960,22 @@ msgstr "impossible de trouver un saut de ligne qui satisfasse aux contraintes"
 msgid "need symbol arguments for \\override and \\revert"
 msgstr "\\override et \\revert requièrent des arguments symboliques"
 
-#: context.cc:143
+#: context.cc:144
 #, c-format
 msgid "cannot find or create new `%s'"
 msgstr "impossible de trouver ou créer un nouveau « %s »"
 
-#: context.cc:222
+#: context.cc:223
 #, c-format
 msgid "cannot find or create `%s' called `%s'"
 msgstr "impossible de trouver ou créer « %s » dénommé(e) « %s »"
 
-#: context.cc:419
+#: context.cc:416
 #, c-format
 msgid "cannot find or create: `%s'"
 msgstr "impossible de trouver ou créer « %s »"
 
-#: context.cc:433
+#: context.cc:430
 #, c-format
 msgid "cannot find or create new Bottom = \"%s\""
 msgstr "impossible de trouver ou créer un nouveau « %s »"
@@ -1988,20 +1985,20 @@ msgstr "impossible de trouver ou créer un nouveau « %s »"
 msgid "custos `%s' not found"
 msgstr "custode « %s » introuvable"
 
-#: dispatcher.cc:83
+#: dispatcher.cc:82
 msgid "Event class should be a list"
 msgstr "La classe d'événement devrait être une liste"
 
-#: dispatcher.cc:166
+#: dispatcher.cc:165
 #, c-format
 msgid "Junking event: %s"
 msgstr "Événement escamoté : « %s »"
 
-#: dispatcher.cc:271
+#: dispatcher.cc:279
 msgid "Attempting to remove nonexisting listener."
 msgstr "Tentative de suppression d'un écouteur inexistant."
 
-#: dispatcher.cc:297
+#: dispatcher.cc:305
 msgid "Already listening to dispatcher, ignoring request"
 msgstr "Déjà à l'écoute du dispatcheur ; requête ignorée."
 
@@ -2010,7 +2007,7 @@ msgstr "Déjà à l'écoute du dispatcheur ; requête ignorée."
 msgid "dot `%s' not found"
 msgstr "point « %s » introuvable"
 
-#: dynamic-engraver.cc:168
+#: dynamic-engraver.cc:169
 #, c-format
 msgid ""
 "unknown crescendo style: %s\n"
@@ -2019,7 +2016,7 @@ msgstr ""
 "style de crescendo inconnu : %s\n"
 "retour à la valeur par défaut (soufflet)."
 
-#: dynamic-engraver.cc:233 slur-proto-engraver.cc:119
+#: dynamic-engraver.cc:234 slur-proto-engraver.cc:119
 #, c-format
 msgid "unterminated %s"
 msgstr "%s non terminé(e)"
@@ -2047,22 +2044,22 @@ msgstr "épisème non terminé"
 msgid "unterminated extender"
 msgstr "prolongation ou extenseur non terminé"
 
-#: flag.cc:134
+#: flag.cc:133
 #, c-format
 msgid "flag `%s' not found"
 msgstr "crochet inconnu : « %s »"
 
-#: flag.cc:154
+#: flag.cc:153
 #, c-format
 msgid "flag stroke `%s' not found"
 msgstr "type de crochet inconnu : « %s »"
 
-#: font-config-scheme.cc:151 font-config.cc:53
+#: font-config-scheme.cc:151 font-config.cc:82
 #, c-format
 msgid "failed adding font directory: %s"
 msgstr "échec lors de l'ajout d'un répertoire de fontes : « %s »"
 
-#: font-config-scheme.cc:153 font-config.cc:55
+#: font-config-scheme.cc:153 font-config.cc:84
 #, c-format
 msgid "Adding font directory: %s"
 msgstr "Ajout d'un répertoire de fontes : « %s »"
@@ -2081,7 +2078,17 @@ msgstr "Ajout d'un fichier de fontes : « %s »"
 msgid "Initializing FontConfig..."
 msgstr "Initialisation de FontConfig..."
 
-#: font-config.cc:58
+#: font-config.cc:70
+#, c-format
+msgid "failed to add fontconfig configuration file `%s'"
+msgstr "échec lors de l'ajout du fichier de configuration de fontconfig « %s »"
+
+#: font-config.cc:73
+#, c-format
+msgid "Adding fontconfig configuration file: %s"
+msgstr "Ajout du fichier de configuration de fontconfig : « %s »"
+
+#: font-config.cc:86
 msgid "Building font database..."
 msgstr "Construction de la base de donnée des fontes..."
 
@@ -2147,12 +2154,12 @@ msgstr ""
 "L'objet graphique (Grob) « %s »\n"
 " n'a pas d'interface pour la propriété « %s »"
 
-#: grob-property.cc:35
+#: grob-property.cc:33
 #, c-format
 msgid "%d: %s"
 msgstr "%d : %s"
 
-#: grob.cc:481
+#: grob.cc:492
 #, c-format
 msgid "ignored infinite %s-offset"
 msgstr "%s-offset infini ignoré"
@@ -2181,7 +2188,7 @@ msgstr "retrait du trait d'union sans suite"
 msgid "unterminated hyphen; removing"
 msgstr "trait d'union sans suite ; escamoté"
 
-#: includable-lexer.cc:71 lily-guile.cc:91 lily-parser-scheme.cc:108
+#: includable-lexer.cc:71 lily-guile.cc:92 lily-parser-scheme.cc:108
 #, c-format
 msgid "cannot find file: `%s'"
 msgstr "fichier non trouvé : « %s »"
@@ -2191,11 +2198,11 @@ msgstr "fichier non trouvé : « %s »"
 msgid "(search path: `%s')"
 msgstr "(chemin de recherche : « %s »)"
 
-#: input.cc:138 source-file.cc:177 source-file.cc:192
+#: input.cc:138 source-file.cc:180 source-file.cc:195
 msgid "position unknown"
 msgstr "position inconnue"
 
-#: key-engraver.cc:198
+#: key-engraver.cc:197
 msgid "Incomplete keyAlterationOrder for key signature"
 msgstr "Propriété keyAlterationOrder incomplète pour cette armure."
 
@@ -2236,21 +2243,21 @@ msgstr "le silence est ignoré : une ligature ne peut contenir de silence"
 msgid "ligature was started here"
 msgstr "la ligature a débuté ici"
 
-#: lily-guile.cc:93
+#: lily-guile.cc:94
 #, c-format
 msgid "(load path: `%s')"
 msgstr "(chemin de chargement : « %s »)"
 
-#: lily-guile.cc:412
+#: lily-guile.cc:413
 #, c-format
 msgid "cannot find property type-check for `%s' (%s)."
 msgstr "vérification du type de propriété pour « %s » (%s) non trouvée"
 
-#: lily-guile.cc:415
+#: lily-guile.cc:416
 msgid "perhaps a typing error?"
 msgstr "Probable faute de frappe"
 
-#: lily-guile.cc:422
+#: lily-guile.cc:423
 msgid "skipping assignment"
 msgstr "affectation ignorée"
 
@@ -2261,20 +2268,33 @@ msgstr ""
 "la vérification du type de « %s » a échoué ; \n"
 "   la valeur « %s » doit être du type « %s »"
 
-#: lily-lexer.cc:249
+#. Uh oh.  unsmob<T> delivered 0, yet
+#. unsmob<T> delivers true.  This means that unsmob<T> is a
+#. matching check from a base class of T, but var is of an
+#. incompatible derived type.
+#: lily-guile.cc:462
+msgid "Wrong kind of "
+msgstr "Mauvais genre de "
+
+#: lily-lexer.cc:251
 msgid "include files are not allowed in safe mode"
 msgstr "l'inclusion de fichiers n'est pas permise en mode sans échec"
 
-#: lily-lexer.cc:276
+#: lily-lexer.cc:278
 #, c-format
 msgid "identifier name is a keyword: `%s'"
 msgstr "Le nom de l'identificateur est un mot clé : « %s »"
 
-#: lily-lexer.cc:297 lily-lexer.cc:310
+#: lily-lexer.cc:299 lily-lexer.cc:312
 #, c-format
 msgid "%s:EOF"
 msgstr "%s:EOF"
 
+#: lily-modules.cc:81
+#, c-format
+msgid "Uninitialized variable `%s' in module (%s)"
+msgstr "Variable « %s » dans le module « %s » non initialisée"
+
 #: lily-parser-scheme.cc:80
 #, c-format
 msgid "Changing working directory to: `%s'"
@@ -2301,23 +2321,23 @@ msgstr ""
 msgid "Processing `%s'"
 msgstr "Traitement de « %s »"
 
-#: lily-parser-scheme.cc:209
+#: lily-parser-scheme.cc:210
 msgid "ly:parser-parse-string is only valid with a new parser.  Use ly:parser-include-string instead."
 msgstr ""
 "ly:parser-parse-string ne peut foncionner qu'avec un nouvel analyseur.\n"
 "Utilisez plutôt ly:parser-include-string"
 
-#: lily-parser-scheme.cc:240
+#: lily-parser-scheme.cc:241
 msgid "ly:parse-string-expression is only valid with a new parser.  Use ly:parser-include-string instead."
 msgstr ""
 "ly:parse-string-expression ne peut foncionner qu'avec un nouvel analyseur.\n"
 "Utilisez plutôt ly:parser-include-string"
 
-#: lily-parser.cc:107
+#: lily-parser.cc:106
 msgid "Parsing..."
 msgstr "Analyse..."
 
-#: lookup.cc:181
+#: lookup.cc:178
 #, c-format
 msgid "Not drawing a box with negative dimension, %.2f by %.2f."
 msgstr "La boîte aux dimensions négatives, %.2f par %.2f, ne sera pas dessinée."
@@ -2326,12 +2346,12 @@ msgstr "La boîte aux dimensions négatives, %.2f par %.2f, ne sera pas dessiné
 msgid "argument of \\lyricsto should contain Lyrics context"
 msgstr "les arguments de \\lyricsto doivent comporter un contexte Lyrics."
 
-#: lyric-combine-music-iterator.cc:349
+#: lyric-combine-music-iterator.cc:344
 #, c-format
 msgid "cannot find %s `%s'"
 msgstr "le contexte %s « %s » n'existe pas"
 
-#: main.cc:105
+#: main.cc:106
 #, c-format
 msgid ""
 "This program is free software.  It is covered by the GNU General Public\n"
@@ -2344,7 +2364,7 @@ msgstr ""
 "sous certaines conditions.\n"
 "Invoquez « %s --warranty » pour plus d'informations.\n"
 
-#: main.cc:111
+#: main.cc:112
 msgid ""
 "    This program is free software; you can redistribute it and/or\n"
 "modify it under the terms of the GNU General Public License as \n"
@@ -2375,11 +2395,11 @@ msgstr ""
 "écrire à la Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n"
 "Boston, MA 02111-1307, USA.\n"
 
-#: main.cc:149
+#: main.cc:150
 msgid "SYM[=VAL]"
 msgstr "SYM[=VAL]"
 
-#: main.cc:150
+#: main.cc:151
 msgid ""
 "set Scheme option SYM to VAL (default: #t).\n"
 "Use -dhelp for help."
@@ -2387,47 +2407,47 @@ msgstr ""
 "affecte VAL (par défaut #t) à l'option Scheme SYM.\n"
 "Utiliser -dhelp pour avoir de l'aide."
 
-#: main.cc:154
+#: main.cc:155
 msgid "EXPR"
 msgstr "EXPR"
 
-#: main.cc:154
+#: main.cc:155
 msgid "evaluate scheme code"
 msgstr "évaluation du code Scheme"
 
 #. Bug in option parser: --output =foe is taken as an abbreviation
 #. for --output-format.
-#: main.cc:157
+#: main.cc:158
 msgid "FORMATs"
 msgstr "FORMATs"
 
-#: main.cc:157
+#: main.cc:158
 msgid "dump FORMAT,...  Also as separate options:"
 msgstr ""
 "produire FORMAT...\n"
 "Aussi comme options séparées :"
 
-#: main.cc:158
+#: main.cc:159
 msgid "generate PDF (default)"
 msgstr "générer le PDF (par défaut)"
 
-#: main.cc:159
+#: main.cc:160
 msgid "generate PNG"
 msgstr "générer le PNG"
 
-#: main.cc:160
+#: main.cc:161
 msgid "generate PostScript"
 msgstr "générer le PostScript"
 
-#: main.cc:161
+#: main.cc:162
 msgid "generate big PDF files"
 msgstr "générer de gros fichiers PDF"
 
-#: main.cc:164
+#: main.cc:165
 msgid "FIELD"
 msgstr "CHAMP"
 
-#: main.cc:164
+#: main.cc:165
 msgid ""
 "dump header field FIELD to file\n"
 "named BASENAME.FIELD"
@@ -2435,21 +2455,21 @@ msgstr ""
 "écrire le champ d'entête CHAMP dans le\n"
 "fichier nommé RACINE.CHAMP"
 
-#: main.cc:167
+#: main.cc:168
 msgid "add DIR to search path"
 msgstr "ajouter RÉPERTOIRE au chemin de recherche"
 
-#: main.cc:168
+#: main.cc:169
 msgid "use FILE as init file"
 msgstr ""
 "utiliser FICHIER comme\n"
 "fichier d'initialisation"
 
-#: main.cc:171
+#: main.cc:172
 msgid "USER, GROUP, JAIL, DIR"
 msgstr "USER, GROUP, CAGE, RÉP"
 
-#: main.cc:171
+#: main.cc:172
 msgid ""
 "chroot to JAIL, become USER:GROUP\n"
 "and cd into DIR"
@@ -2457,7 +2477,7 @@ msgstr ""
 "chroot dans CAGE, devenir UTILISATEUR:GROUPE\n"
 "et cd dans RÉPERTOIRE"
 
-#: main.cc:176
+#: main.cc:177
 msgid ""
 "print log messages according to LOGLEVEL.  Possible values are:\n"
 "NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (default) and DEBUG."
@@ -2465,30 +2485,30 @@ msgstr ""
 "affiche les informations selon le niveau de LOGLEVEL :\n"
 "NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (défaut) ou DEBUG."
 
-#: main.cc:180
+#: main.cc:181
 msgid "write output to FILE (suffix will be added)"
 msgstr ""
 "produire la sortie dans FICHIER \n"
 "(adjonction automatique du suffixe)"
 
-#: main.cc:181
+#: main.cc:182
 msgid "relocate using directory of lilypond program"
 msgstr ""
 "redétermine le chemin d'exécution\n"
 "des composants de LilyPond"
 
-#: main.cc:182
+#: main.cc:183
 msgid "no progress, only error messages (equivalent to loglevel=ERROR)"
 msgstr ""
 "pas de progression, seulement les messages d'erreur\n"
 "(équivalent à loglevel=ERROR)"
 
-#: main.cc:184
+#: main.cc:185
 msgid "be verbose (equivalent to loglevel=DEBUG)"
 msgstr "état verbeux (équivalent à loglevel=DEBUG)"
 
 #. Do not update the copyright years here, run `make grand-replace'
-#: main.cc:263
+#: main.cc:264
 #, c-format
 msgid ""
 "Copyright (c) %s by\n"
@@ -2498,88 +2518,88 @@ msgstr ""
 "%s et autres."
 
 #. No version number or newline here.  It confuses help2man.
-#: main.cc:301
+#: main.cc:302
 #, c-format
 msgid "Usage: %s [OPTION]... FILE..."
 msgstr "Utilisation : %s [OPTIONS]... FICHIER..."
 
-#: main.cc:303
+#: main.cc:304
 msgid "Typeset music and/or produce MIDI from FILE."
 msgstr "Composer la musique ou jouer en format MIDI à partir du FICHIER"
 
-#: main.cc:305
+#: main.cc:306
 msgid "LilyPond produces beautiful music notation."
 msgstr "LilyPond produit une jolie notation musicale"
 
-#: main.cc:307
+#: main.cc:308
 #, c-format
 msgid "For more information, see %s"
 msgstr "Pour plus d'informations, voir %s"
 
-#: main.cc:309
+#: main.cc:310
 msgid "Options:"
 msgstr "Options :"
 
-#: main.cc:376
+#: main.cc:377
 #, c-format
 msgid "expected %d arguments with jail, found: %u"
 msgstr "une cage requiert %d arguments, il y en a %u"
 
-#: main.cc:390
+#: main.cc:391
 #, c-format
 msgid "no such user: %s"
 msgstr "utilisateur inconnu : « %s »"
 
-#: main.cc:392
+#: main.cc:393
 #, c-format
 msgid "cannot get user id from user name: %s: %s"
 msgstr ""
 "impossible de repérer l'identifiant utilisateur à partir du nom d'utilisateur :\n"
 "%s : %s"
 
-#: main.cc:407
+#: main.cc:408
 #, c-format
 msgid "no such group: %s"
 msgstr "groupe inconnu : %s"
 
-#: main.cc:409
+#: main.cc:410
 #, c-format
 msgid "cannot get group id from group name: %s: %s"
 msgstr ""
 "impossible de repérer l'identifiant groupe à partir du nom de groupe :\n"
 "%s : %s "
 
-#: main.cc:417
+#: main.cc:418
 #, c-format
 msgid "cannot chroot to: %s: %s"
 msgstr "impossible de chrooter vers : %s : %s"
 
-#: main.cc:424
+#: main.cc:425
 #, c-format
 msgid "cannot change group id to: %d: %s"
 msgstr "impossible de changer l'identifiant de groupe en %d : %s"
 
-#: main.cc:430
+#: main.cc:431
 #, c-format
 msgid "cannot change user id to: %d: %s"
 msgstr "impossible de changer l'identifiant utilisateur en %d : %s"
 
-#: main.cc:436
+#: main.cc:437
 #, c-format
 msgid "cannot change working directory to: %s: %s"
 msgstr "impossible de changer le répertoire de travail en %s : %s"
 
-#: main.cc:825
+#: main.cc:826
 #, c-format
 msgid "exception caught: %s"
 msgstr "exception capturée : %s"
 
 #. FIXME: constant error message.
-#: mark-engraver.cc:156
+#: mark-engraver.cc:150
 msgid "rehearsalMark must have integer value"
 msgstr "rehearsalMark doit être un entier"
 
-#: mark-engraver.cc:162
+#: mark-engraver.cc:156
 msgid "mark label must be a markup object"
 msgstr "les étiquettes de marque doivent être des objets de type « markup »."
 
@@ -2631,7 +2651,7 @@ msgstr ""
 msgid "unexpected case fall-through"
 msgstr "cas inattendu et non interprétable"
 
-#: midi-control-function-performer.cc:109 staff-performer.cc:152
+#: midi-control-function-performer.cc:107 staff-performer.cc:153
 #, c-format
 msgid "ignoring out-of-range value change for MIDI property `%s'"
 msgstr "propriété MIDI « %s » : modification de valeur hors limite donc ignorée"
@@ -2671,7 +2691,7 @@ msgstr ""
 "usable-duration-logs ne peut être constitué d'une liste vide.\n"
 "Retour à des pauses."
 
-#: music.cc:149
+#: music.cc:150
 #, c-format
 msgid "octave check failed; expected \"%s\", found: \"%s\""
 msgstr ""
@@ -2707,37 +2727,37 @@ msgstr "tête de note « %s » ou « %s » non trouvée"
 msgid "NoteEvent without pitch"
 msgstr "NoteEvent sans hauteur"
 
-#: open-type-font.cc:46
+#: open-type-font.cc:45
 #, c-format
 msgid "cannot allocate %lu bytes"
 msgstr "impossible d'allouer %lu octets"
 
-#: open-type-font.cc:50
+#: open-type-font.cc:49
 #, c-format
 msgid "cannot load font table: %s"
 msgstr "impossible de charger la table des fontes : %s"
 
-#: open-type-font.cc:55
+#: open-type-font.cc:54
 #, c-format
 msgid "FreeType error: %s"
 msgstr "Erreur FreeType : %s"
 
-#: open-type-font.cc:112
+#: open-type-font.cc:115
 #, c-format
 msgid "unsupported font format: %s"
 msgstr "format de police non supporté : %s"
 
-#: open-type-font.cc:114
+#: open-type-font.cc:117
 #, c-format
 msgid "error reading font file %s: %s"
 msgstr "erreur de lecture du fichier de fontes %s : %s"
 
-#: open-type-font.cc:189
+#: open-type-font.cc:192
 #, c-format
 msgid "FT_Get_Glyph_Name () Freetype error: %s"
 msgstr "erreur Freetype FT_Get_Glyph_Name () : %s"
 
-#: open-type-font.cc:337 pango-font.cc:257
+#: open-type-font.cc:340 pango-font.cc:258
 #, c-format
 msgid "FT_Get_Glyph_Name () error: %s"
 msgstr "Erreur FT_Get_Glyph_Name () : %s"
@@ -2775,18 +2795,18 @@ msgstr "tentative pour %d systèmes"
 msgid "best score for this sys-count: %f"
 msgstr "meilleur résultat pour cette configuration « sys-count » : %f"
 
-#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:248
+#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:249
 #: paper-score.cc:156
 msgid "Drawing systems..."
 msgstr "Dessin des systèmes..."
 
-#: output-def.cc:230
+#: output-def.cc:229
 msgid "margins do not fit with line-width, setting default values"
 msgstr ""
 "les marges ne sont pas en cohérence avec la longueur de ligne ;\n"
 "retour aux valeurs par défaut"
 
-#: output-def.cc:237
+#: output-def.cc:236
 msgid "systems run off the page due to improper paper settings, setting default values"
 msgstr ""
 "les systèmes débordent de la page en raison de réglages de papier erronés ;\n"
@@ -2809,72 +2829,72 @@ msgstr ""
 msgid "page %d has been compressed"
 msgstr "la page %d a été comprimée"
 
-#: page-layout-problem.cc:402
+#: page-layout-problem.cc:400
 msgid "A page layout problem has been initiated that cannot accommodate footnotes."
 msgstr "Un défaut de mise en page perturbe la gestion des notes de bas de page."
 
-#: page-layout-problem.cc:731
+#: page-layout-problem.cc:729
 msgid "ragged-bottom was specified, but page must be compressed"
 msgstr "ragged-bottom spécifié, mais la page doit être comprimée"
 
-#: page-layout-problem.cc:734
+#: page-layout-problem.cc:732
 #, c-format
 msgid "compressing over-full page by %.1f staff-spaces"
 msgstr "compression du débordement de page de %.1f espace de portée"
 
-#: page-layout-problem.cc:1199
+#: page-layout-problem.cc:1197
 msgid "staff-affinities should only decrease"
 msgstr "staff-affinities devraient aller en ordre décroissant"
 
-#: page-turn-page-breaking.cc:168
+#: page-turn-page-breaking.cc:169
 #, c-format
 msgid "page-turn-page-breaking: breaking from %d to %d"
 msgstr ""
 "Saut de page et tourne (page-turn-page-breaking) :\n"
 "coupure entre %d et %d"
 
-#: page-turn-page-breaking.cc:217
+#: page-turn-page-breaking.cc:218
 msgid "cannot fit the first page turn onto a single page.  Consider setting first-page-number to an even number."
 msgstr ""
 "Impossible de cadrer sur une seule page ce qui précède la première tourne.\n"
 "Envisagez de définir un numéro pair pour first-page-number."
 
-#: page-turn-page-breaking.cc:230
+#: page-turn-page-breaking.cc:231
 #, c-format
 msgid "Calculating page and line breaks (%d possible page breaks)..."
 msgstr "Calcul des sauts de page et de ligne (%d sauts de pages possibles)..."
 
-#: page-turn-page-breaking.cc:300
+#: page-turn-page-breaking.cc:301
 #, c-format
 msgid "break starting at page %d"
 msgstr "saut intervenant à la page %d"
 
-#: page-turn-page-breaking.cc:301
+#: page-turn-page-breaking.cc:302
 #, c-format
 msgid "\tdemerits: %f"
 msgstr "        démérites : %f"
 
-#: page-turn-page-breaking.cc:302
+#: page-turn-page-breaking.cc:303
 #, c-format
 msgid "\tsystem count: %d"
 msgstr "        nombre de systèmes : %d"
 
-#: page-turn-page-breaking.cc:303
+#: page-turn-page-breaking.cc:304
 #, c-format
 msgid "\tpage count: %d"
 msgstr "        nombre de pages : %d"
 
-#: page-turn-page-breaking.cc:304
+#: page-turn-page-breaking.cc:305
 #, c-format
 msgid "\tprevious break: %d"
 msgstr "        coupure précédente : %d"
 
-#: pango-font.cc:246
+#: pango-font.cc:247
 #, c-format
 msgid "no glyph for character U+%0X in font `%s'"
 msgstr "aucun glyphe ne correspond au caractère U+%0X dans la fonte « %s »"
 
-#: pango-font.cc:273
+#: pango-font.cc:274
 #, c-format
 msgid ""
 "Glyph has no name, but font supports glyph naming.\n"
@@ -2883,21 +2903,21 @@ msgstr ""
 "Le glyphe n'a pas de nom alors que la fonte prend en charge leur nommage.\n"
 "Glyphe U+%0X ignoré dans le fichier « %s »"
 
-#: pango-font.cc:323
+#: pango-font.cc:324
 #, c-format
 msgid "no PostScript font name for font `%s'"
 msgstr "« %s » n'est pas un fichier de fonte PostScript"
 
-#: pango-font.cc:373
+#: pango-font.cc:374
 msgid "FreeType face has no PostScript font name"
 msgstr "Caractère FreeType sans nom de police PostScript"
 
-#: paper-book.cc:201
+#: paper-book.cc:200
 #, c-format
 msgid "program option -dprint-pages not supported by backend `%s'"
 msgstr "l'option -dprint-pages n'est pas opérationnelle avec le moteur %s"
 
-#: paper-book.cc:220
+#: paper-book.cc:219
 #, c-format
 msgid "program option -dpreview not supported by backend `%s'"
 msgstr "l'option -dpreview n'est pas opérationnelle avec le moteur %s"
@@ -2922,7 +2942,7 @@ msgstr "%d éléments dénombrés (%d extensions)"
 msgid "Preprocessing graphical objects..."
 msgstr "Pré-traitement des éléments graphiques..."
 
-#: parse-scm.cc:128
+#: parse-scm.cc:124
 msgid "GUILE signaled an error for the expression beginning here"
 msgstr "GUILE a signalé une erreur pour l'expression débutant ici"
 
@@ -2937,11 +2957,11 @@ msgstr ""
 msgid "unterminated percent repeat"
 msgstr "répétition en pourcent non terminée"
 
-#: performance.cc:55
+#: performance.cc:76
 msgid "Track..."
 msgstr "Piste..."
 
-#: performance.cc:90
+#: performance.cc:126
 #, c-format
 msgid "MIDI output to `%s'..."
 msgstr "Sortie MIDI vers « %s »..."
@@ -2976,25 +2996,25 @@ msgstr "« %s » n'est pas un nom d'objet graphique (grob)"
 msgid "Failed octave check, got: "
 msgstr "échec de la vérification d'octave, a obtenu : "
 
-#: relocate.cc:52
+#: relocate.cc:56
 #, c-format
 msgid "Setting %s to %s"
 msgstr "%s fixé à %s"
 
 #. this warning should only be printed in debug mode!
-#: relocate.cc:73
+#: relocate.cc:77
 #, c-format
 msgid "no such file: %s for %s"
 msgstr "fichier inexistant : %s pour %s"
 
 #. this warning should only be printed in debug mode!
 #. this warning should only be printed in debug mode
-#: relocate.cc:84 relocate.cc:102
+#: relocate.cc:88 relocate.cc:106
 #, c-format
 msgid "no such directory: %s for %s"
 msgstr "répertoire inexistant : %s pour %s"
 
-#: relocate.cc:93
+#: relocate.cc:97
 #, c-format
 msgid "%s=%s (prepend)\n"
 msgstr "%s=%s (ajout)\n"
@@ -3024,7 +3044,7 @@ msgstr "Relocalisation absolue : argv0=%s\n"
 msgid "Relocation : from cwd: argv0=%s\n"
 msgstr "Relocalisation à partir du répertoire courant : argv0=%s\n"
 
-#: relocate.cc:194
+#: relocate.cc:196
 #, c-format
 msgid ""
 "Relocation: from PATH=%s\n"
@@ -3033,30 +3053,30 @@ msgstr ""
 "Relocalisation : à partir de PATH=%s\n"
 "argv0=%s\n"
 
-#: relocate.cc:220
+#: relocate.cc:222
 msgid "LILYPONDPREFIX is obsolete, use LILYPOND_DATADIR"
 msgstr "LILYPONDPREFIX est obsolète, utiliser LILYPOND_DATADIR"
 
-#: relocate.cc:345
+#: relocate.cc:347
 #, c-format
 msgid "Relocation file: %s"
 msgstr "Fichier de relocalisation : %s"
 
-#: relocate.cc:349 source-file.cc:65
+#: relocate.cc:351 source-file.cc:65
 #, c-format
 msgid "cannot open file: `%s'"
 msgstr "Impossible d'ouvrir le fichier « %s »"
 
-#: relocate.cc:379
+#: relocate.cc:381
 #, c-format
 msgid "Unknown relocation command %s"
 msgstr "Commande de relocalisation inconnue : %s"
 
-#: rest-collision.cc:153
+#: rest-collision.cc:154
 msgid "cannot resolve rest collision: rest direction not set"
 msgstr "collision de silences insoluble : positionnement du silence indéterminée"
 
-#: rest-collision.cc:164 rest-collision.cc:273
+#: rest-collision.cc:165 rest-collision.cc:274
 msgid "too many colliding rests"
 msgstr "trop de silences se chevauchent"
 
@@ -3065,33 +3085,33 @@ msgstr "trop de silences se chevauchent"
 msgid "rest `%s' not found"
 msgstr "silence « %s » inconnu"
 
-#: score-engraver.cc:79
+#: score-engraver.cc:77
 #, c-format
 msgid "cannot find `%s'"
 msgstr "impossible de trouver « %s »"
 
-#: score-engraver.cc:81
+#: score-engraver.cc:79
 msgid "Music font has not been installed properly."
 msgstr "Les fontes musicales n'ont pas été installées correctement."
 
-#: score-engraver.cc:83
+#: score-engraver.cc:81
 #, c-format
 msgid "Search path `%s'"
 msgstr "Chemin de recherche : « %s »"
 
-#: score-engraver.cc:85
+#: score-engraver.cc:83
 msgid "Aborting"
 msgstr "Abandon"
 
-#: score.cc:160
+#: score.cc:161
 msgid "already have music in score"
 msgstr "il y a déjà de la musique dans la partition"
 
-#: score.cc:161
+#: score.cc:163
 msgid "this is the previous music"
 msgstr "voici la musique précédente"
 
-#: score.cc:166
+#: score.cc:169
 msgid "errors found, ignoring music expression"
 msgstr "suite à des erreurs répétées, l'expression musicale sera ignorée"
 
@@ -3130,7 +3150,7 @@ msgstr "%s san origine"
 msgid "cannot end %s"
 msgstr "impossible de terminer %s"
 
-#: slur.cc:434
+#: slur.cc:436
 #, c-format
 msgid "Ignoring grob for slur: %s.  avoid-slur not set?"
 msgstr ""
@@ -3167,18 +3187,18 @@ msgstr "la source devrait spécifier des voix polyphoniques"
 msgid "weird stem size, check for narrow beams"
 msgstr "taille de hampe bizarre ; vérifier la présence de liens étroits"
 
-#: system.cc:201
+#: system.cc:202
 #, c-format
 msgid "Element count %d"
 msgstr "%d éléments dénombrés."
 
-#: system.cc:512
+#: system.cc:513
 #, c-format
 msgid "Grob count %d"
 msgstr "%d objet graphiques (grob) dénombrés."
 
 #. TODO: Also print the arguments of the markup!
-#: text-interface.cc:138
+#: text-interface.cc:139
 #, c-format
 msgid "Markup depth exceeds maximal value of %d; Markup: %s"
 msgstr ""
@@ -3201,7 +3221,7 @@ msgstr "extension de texte non terminée"
 msgid "unterminated tie"
 msgstr "liaison de prolongation non terminée"
 
-#: tie-engraver.cc:373
+#: tie-engraver.cc:377
 msgid "lonely tie"
 msgstr "liaison de prolongation orpheline"
 
@@ -3215,7 +3235,7 @@ msgstr "liaison de prolongation orpheline"
 msgid "strange time signature found: %d/%d"
 msgstr "Chiffrage de mesure inhabituel : %d/%d"
 
-#: translator-ctors.cc:65
+#: translator-ctors.cc:68
 #, c-format
 msgid "unknown translator: `%s'"
 msgstr "translateur inconnu : « %s »"
@@ -3225,17 +3245,17 @@ msgstr "translateur inconnu : « %s »"
 msgid "fatal error.  Couldn't find type: %s"
 msgstr "Erreur fatale. Type inconnu : %s"
 
-#: translator-group.cc:188
+#: translator-group.cc:187
 #, c-format
 msgid "cannot find: `%s'"
 msgstr "« %s » inconnu(e)"
 
-#: translator.cc:320
+#: translator.cc:310
 #, c-format
 msgid "Two simultaneous %s events, junking this one"
 msgstr "Deux événements %s simultanés, rejet de celui-ci"
 
-#: translator.cc:321
+#: translator.cc:311
 #, c-format
 msgid "Previous %s event here"
 msgstr "Événement %s précédent ici"
@@ -3308,208 +3328,208 @@ msgstr "a déjà une extension terminée"
 msgid "giving up"
 msgstr "abandon"
 
-#: parser.yy:463 parser.yy:847 parser.yy:928 parser.yy:1150
+#: parser.yy:476 parser.yy:947 parser.yy:1028 parser.yy:1248
 msgid "bad expression type"
 msgstr "type d'expression erroné"
 
-#: parser.yy:759 parser.yy:1361 parser.yy:1406
+#: parser.yy:859 parser.yy:1458 parser.yy:1503
 msgid "not a context mod"
 msgstr "ceci n'est pas un module de contexte"
 
-#: parser.yy:954
+#: parser.yy:1054
 msgid "Missing music in \\score"
 msgstr "Il n'y a pas de musique dans ce \\score"
 
-#: parser.yy:991
+#: parser.yy:1091
 msgid "\\paper cannot be used in \\score, use \\layout instead"
 msgstr "dans la section \\score, utiliser \\layout au lieu de \\paper"
 
-#: parser.yy:1027
+#: parser.yy:1126
 msgid "Spurious expression in \\score"
 msgstr "Expression invalide dans \\score"
 
-#: parser.yy:1057
+#: parser.yy:1156
 msgid "need \\paper for paper block"
 msgstr "\\paper est nécessaire pour définir les paramètres de la page"
 
-#: parser.yy:1234
+#: parser.yy:1331
 msgid "music expected"
 msgstr "On attendait de la musique"
 
-#: parser.yy:1244 parser.yy:1278
+#: parser.yy:1341 parser.yy:1375
 msgid "unexpected post-event"
 msgstr "« post-event » inattendu"
 
-#: parser.yy:1286
+#: parser.yy:1383
 msgid "Ignoring non-music expression"
 msgstr "Expression non musicale ignorée"
 
-#: parser.yy:1587
+#: parser.yy:1691
 msgid "not a symbol"
 msgstr "n'est pas un symbole"
 
-#: parser.yy:2337 parser.yy:2451 parser.yy:2464 parser.yy:2473
+#: parser.yy:2491 parser.yy:2605 parser.yy:2618 parser.yy:2627
 msgid "bad grob property path"
 msgstr "chemin erroné d'accès à la propriété de « grob »"
 
-#: parser.yy:2431
+#: parser.yy:2585
 msgid "only \\consists and \\remove take non-string argument."
 msgstr "seuls \\consists et \\remove peuvent prendre un argument autre qu'une chaîne."
 
-#: parser.yy:2492
+#: parser.yy:2646
 msgid "bad context property path"
 msgstr "chemin erroné d'accès à la propriété de contexte"
 
-#: parser.yy:2593
+#: parser.yy:2733
 msgid "simple string expected"
 msgstr "On attendait une chaîne simple"
 
-#: parser.yy:2611
+#: parser.yy:2750
 msgid "symbol expected"
 msgstr "symbole requis"
 
-#: parser.yy:2747
+#: parser.yy:2886
 msgid "not a rhythmic event"
 msgstr "événement non rythmique"
 
-#: parser.yy:2797
+#: parser.yy:2936
 msgid "post-event expected"
 msgstr "On attendait un « post-event »"
 
-#: parser.yy:2806 parser.yy:2811
+#: parser.yy:2945 parser.yy:2950
 msgid "have to be in Lyric mode for lyrics"
 msgstr "Des paroles requièrent d'utiliser le mode Lyric."
 
-#: parser.yy:2887
+#: parser.yy:3026
 msgid "expecting string or post-event as script definition"
 msgstr "chaîne ou « post-event » requis pour définir un script"
 
-#: parser.yy:2991
+#: parser.yy:3130
 msgid "not an articulation"
 msgstr "n'est pas une articulation"
 
-#: parser.yy:3063 parser.yy:3106
+#: parser.yy:3202 parser.yy:3245
 msgid "not a duration"
 msgstr "ceci n'est pas une durée"
 
-#: parser.yy:3127
+#: parser.yy:3266
 msgid "bass number expected"
 msgstr "On attendait un numéro de basse"
 
-#: parser.yy:3219
+#: parser.yy:3358
 msgid "have to be in Note mode for notes"
 msgstr "Des notes requièrent d'utiliser le mode Note."
 
-#: parser.yy:3258
+#: parser.yy:3397
 msgid "have to be in Chord mode for chords"
 msgstr "Des accords requièrent d'utiliser le mode Chord."
 
-#: parser.yy:3301
+#: parser.yy:3440
 msgid "markup outside of text script or \\lyricmode"
 msgstr "« markup » en dehors d'un script textuel ou de \\lyricmode"
 
-#: parser.yy:3306
+#: parser.yy:3445
 msgid "unrecognized string, not in text script or \\lyricmode"
 msgstr "chaîne non reconnue ; en dehors d'un script textuel ou de \\lyricmode"
 
-#: parser.yy:3458 parser.yy:3467
+#: parser.yy:3597 parser.yy:3606
 msgid "not an unsigned integer"
 msgstr "n'est pas un entier sans signe"
 
-#: parser.yy:3541
+#: parser.yy:3693
 msgid "not a markup"
 msgstr "n'est pas un « markup »"
 
-#: lexer.ll:192
+#: lexer.ll:193
 msgid "stray UTF-8 BOM encountered"
 msgstr "parasitage par UTF-8 BOM"
 
-#: lexer.ll:195
+#: lexer.ll:196
 msgid "Skipping UTF-8 BOM"
 msgstr "Escamotage d'UTF-8 BOM"
 
-#: lexer.ll:247
+#: lexer.ll:248
 #, c-format
 msgid "Renaming input to: `%s'"
 msgstr "L'entrée a été renommée en « %s »"
 
-#: lexer.ll:264
+#: lexer.ll:265
 msgid "quoted string expected after \\version"
 msgstr "\\version doit être suivi d'une chaîne entre guillemets"
 
-#: lexer.ll:268
+#: lexer.ll:269
 msgid "quoted string expected after \\sourcefilename"
 msgstr "\\sourcefilename doit être suivi d'une chaîne entre guillemets"
 
-#: lexer.ll:272
+#: lexer.ll:273
 msgid "integer expected after \\sourcefileline"
 msgstr "\\sourcefilename doit être suivi d'un nombre entier"
 
-#: lexer.ll:299
+#: lexer.ll:300
 msgid "\\maininput not allowed outside init files"
 msgstr "\\maininput n'est pas permis en dehors des fichiers d'initialisation"
 
-#: lexer.ll:323
+#: lexer.ll:324
 #, c-format
 msgid "wrong or undefined identifier: `%s'"
 msgstr "identificateur erroné ou non défini : « %s »"
 
-#: lexer.ll:348
+#: lexer.ll:349
 msgid "string expected after \\include"
 msgstr "\\include doit être suivi d'une chaîne entre guillemets"
 
-#: lexer.ll:358
+#: lexer.ll:359
 msgid "end quote missing"
 msgstr "absence de guillemet fermant"
 
-#: lexer.ll:713
+#: lexer.ll:714
 msgid "EOF found inside a comment"
 msgstr "Fin de fichier (EOF) à l'intérieur du commentaire"
 
-#: lexer.ll:718
+#: lexer.ll:719
 msgid "EOF found inside string"
 msgstr "Fin de fichier (EOF) à l'intérieur d'une chaîne"
 
-#: lexer.ll:733
+#: lexer.ll:734
 msgid "Unfinished main input"
 msgstr "Fichier principal non fini"
 
-#: lexer.ll:804
+#: lexer.ll:805
 #, c-format
 msgid "invalid character: `%s'"
 msgstr "caractère invalide : « %s »"
 
-#: lexer.ll:924
+#: lexer.ll:925
 #, c-format
 msgid "unknown escaped string: `\\%s'"
 msgstr "chaîne d'échappement inconnue : « \\%s »"
 
-#: lexer.ll:944
+#: lexer.ll:945
 #, c-format
 msgid "undefined character or shorthand: %s"
 msgstr "caractère ou raccourci non défini : %s"
 
-#: lexer.ll:1235
+#: lexer.ll:1236
 msgid "non-UTF-8 input"
 msgstr "la source n'est pas en UTF-8"
 
-#: lexer.ll:1279
+#: lexer.ll:1280
 #, c-format
 msgid "Invalid version string \"%s\""
 msgstr "Numérotation de version \"%s\" invalide"
 
-#: lexer.ll:1284
+#: lexer.ll:1285
 #, c-format
 msgid "file too old: %s (oldest supported: %s)"
 msgstr ""
 "%s est plus qu'obsolète ;\n"
 "le plus ancien pouvant être supporté est %s"
 
-#: lexer.ll:1285
+#: lexer.ll:1286
 msgid "consider updating the input with the convert-ly script"
 msgstr "Envisagez la mise à jour de la source à l'aide du script convert-ly"
 
-#: lexer.ll:1291
+#: lexer.ll:1292
 #, c-format
 msgid "program too old: %s (file requires: %s)"
 msgstr "Programme plus qu'obsolète : %s (le fichier requiert %s)"
@@ -3528,24 +3548,34 @@ msgstr "Appel de « ~a »..."
 msgid "`~a' failed (~a)\n"
 msgstr "échec de « ~a » (~a)\n"
 
-#: backend-library.scm:94
+#: backend-library.scm:108
 #, scheme-format
 msgid "Converting to `~a'...\n"
 msgstr "Conversion à « ~a »...\n"
 
 #. Do not try to guess the name of the png file,
 #. GS produces PNG files like BASE-page%d.png.
-#: backend-library.scm:103
+#: backend-library.scm:118
 #, scheme-format
 msgid "Converting to ~a..."
 msgstr "Conversion à « ~a »..."
 
-#: backend-library.scm:141
+#: backend-library.scm:134
+#, scheme-format
+msgid "Copying to `~a'...\n"
+msgstr "Copie vers « ~a »...\n"
+
+#: backend-library.scm:200
+#, scheme-format
+msgid "Deleting `~a'...\n"
+msgstr "Suppression de « ~a »...\n"
+
+#: backend-library.scm:219
 #, scheme-format
 msgid "Writing header field `~a' to `~a'..."
 msgstr "écriture du champ d'entête « ~a » dans « ~a »..."
 
-#: backend-library.scm:190
+#: backend-library.scm:268
 #, scheme-format
 msgid "missing stencil expression `~S'"
 msgstr "absence d'expression stencil « ~S »"
@@ -3609,62 +3639,62 @@ msgstr "Impossible de redéfinir la classe d'événement « ~S »"
 msgid "Undefined parent event class `~S'"
 msgstr "Classe d'événement parente « ~a » non définie"
 
-#: define-markup-commands.scm:1062
+#: define-markup-commands.scm:1098
 msgid "no systems found in \\score markup, does it have a \\layout block?"
 msgstr ""
 "pas de système trouvé dans le bloc \\score du « markup » ;\n"
 "  contient-il un bloc \\layout ?"
 
-#: define-markup-commands.scm:2886
+#: define-markup-commands.scm:2922
 #, scheme-format
 msgid "Cannot find glyph ~a"
 msgstr "impossible de trouver le glyphe « ~a »"
 
-#: define-markup-commands.scm:3362
+#: define-markup-commands.scm:3398
 #, scheme-format
 msgid "no brace found for point size ~S "
 msgstr "il n'y a pas d'accolade qui fasse ~S points"
 
-#: define-markup-commands.scm:3363
+#: define-markup-commands.scm:3399
 #, scheme-format
 msgid "defaulting to ~S pt"
 msgstr "application de la taille par défaut (~S pt)"
 
-#: define-markup-commands.scm:3615
+#: define-markup-commands.scm:3643
 #, scheme-format
 msgid "not a valid duration string: ~a"
 msgstr "chaîne de durée invalide : ~a"
 
-#: define-markup-commands.scm:3826
+#: define-markup-commands.scm:3854
 #, scheme-format
 msgid "not a valid duration string: ~a - ignoring"
 msgstr "chaîne de durée invalide : ~a -- ignorée"
 
-#: define-music-types.scm:797
+#: define-music-types.scm:803
 #, scheme-format
 msgid "symbol expected: ~S"
 msgstr "symbole requis : ~S"
 
-#: define-music-types.scm:800
+#: define-music-types.scm:806
 #, scheme-format
 msgid "cannot find music object: ~S"
 msgstr "impossible de trouver l'objet de type musique : ~S"
 
-#: define-music-types.scm:820
+#: define-music-types.scm:826
 #, scheme-format
 msgid "bad make-music argument: ~S"
 msgstr "argument de make-music erronné : ~S"
 
-#: define-note-names.scm:972
+#: define-note-names.scm:1000
 msgid "Select note names language."
 msgstr "Sélection de la langue des noms de note."
 
-#: define-note-names.scm:978
+#: define-note-names.scm:1006
 #, scheme-format
 msgid "Using `~a' note names..."
 msgstr "Utilisation de « ~a » pour le nom des notes..."
 
-#: define-note-names.scm:981
+#: define-note-names.scm:1009
 #, scheme-format
 msgid "Could not find language `~a'.  Ignoring."
 msgstr ""
@@ -3710,12 +3740,12 @@ msgstr ""
 "impossible de trouver une description de la propriété « ~S »\n"
 " (~S)"
 
-#: flag-styles.scm:162
+#: flag-styles.scm:155
 #, scheme-format
 msgid "flag stroke `~a' or `~a' not found"
 msgstr "type de crochet inconnu : « ~a » ou « ~a »"
 
-#: framework-eps.scm:108
+#: framework-eps.scm:112
 #, scheme-format
 msgid "Writing ~a..."
 msgstr "Écriture de « ~a »..."
@@ -3740,7 +3770,7 @@ msgstr "imposible de réaliser l'intégration ~S=~S"
 msgid "do not know how to embed font ~s ~s ~s"
 msgstr "impossible d'intégrer les fontes ~s ~s ~s"
 
-#: framework-ps.scm:729
+#: framework-ps.scm:723
 msgid ""
 "\n"
 "The PostScript backend does not support the\n"
@@ -3788,20 +3818,20 @@ msgstr "Erreur de définition de ligature : attendait (~S,~S), ~S trouvé."
 msgid "Error in beam quanting.  Expected ~S 0, found ~S."
 msgstr "Erreur de définition de ligature : attendait ~S 0, repéré ~S."
 
-#: lily-library.scm:350
+#: lily-library.scm:333
 msgid "Music unsuitable for context-mod"
 msgstr "Inadéquation entre la musique et le context-mod"
 
-#: lily-library.scm:405
+#: lily-library.scm:388
 #, scheme-format
 msgid "Cannot find context-def \\~a"
 msgstr "Impossible de repérer un context-def (définition de contexte) \\~a"
 
-#: lily-library.scm:421
+#: lily-library.scm:404
 msgid "Music unsuitable for output-def"
 msgstr "Inadéquation entre la musique et le output-def"
 
-#: lily-library.scm:921
+#: lily-library.scm:904
 msgid ""
 "Find the index between @var{start} and @var{end} (an integer)\n"
 "which produces the closest match to @var{target-val} if\n"
@@ -3811,53 +3841,53 @@ msgstr ""
 "(nombre entier) qui soit le plus proche de @var{valeur-cible}\n"
 "lorsqu'appliqué à la fonction @var{appelant}."
 
-#: lily-library.scm:1015
+#: lily-library.scm:998
 #, scheme-format
 msgid "unknown unit: ~S"
 msgstr "unité inconnue : ~S"
 
-#: lily-library.scm:1040
+#: lily-library.scm:1023
 #, scheme-format
 msgid "no \\version statement found, please add~afor future compatibility"
 msgstr ""
 "déclaration de \\version absente ;\n"
 "  ajoutez ~a pour une compatibilité future"
 
-#: lily.scm:75
+#: lily.scm:93
 msgid "call-after-session used after session start"
 msgstr "call-after-session utilisé après le début de la session"
 
-#: lily.scm:93
+#: lily.scm:111
 msgid "define-session used after session start"
 msgstr "define-session utilisé après le début de la session"
 
-#: lily.scm:399
+#: lily.scm:417
 msgid "Using (ice-9 curried-definitions) module\n"
 msgstr "Utilisation du module (ice-9 curried-definitions)\n"
 
-#: lily.scm:402
+#: lily.scm:420
 msgid "Guile 1.8\n"
 msgstr "Guile 1.8\n"
 
-#: lily.scm:459
+#: lily.scm:477
 #, scheme-format
 msgid "cannot find: ~A"
 msgstr "impossible de trouver « ~A »"
 
-#: lily.scm:886
+#: lily.scm:903
 msgid "Success: compilation successfully completed"
 msgstr "Compilation menée à son terme, avec succès."
 
-#: lily.scm:887
+#: lily.scm:904
 msgid "Compilation completed with warnings or errors"
 msgstr "Compilation menée à son terme, avec des avertissements ou erreurs."
 
-#: lily.scm:948
+#: lily.scm:965
 #, scheme-format
 msgid "job ~a terminated with signal: ~a"
 msgstr "le travail « ~a » s'est terminé avec le signal ~a"
 
-#: lily.scm:951
+#: lily.scm:968
 #, scheme-format
 msgid ""
 "logfile ~a (exit ~a):\n"
@@ -3866,38 +3896,33 @@ msgstr ""
 "fichier journal « ~a » (sortie ~a) :\n"
 "~a"
 
-#: lily.scm:973 lily.scm:1062
+#: lily.scm:990 lily.scm:1079
 #, scheme-format
 msgid "failed files: ~S"
 msgstr "erreur sur les fichiers ~S"
 
-#: lily.scm:1053
+#: lily.scm:1070
 #, scheme-format
 msgid "Redirecting output to ~a..."
 msgstr "Redirection de la sortie vers « ~a »..."
 
-#: lily.scm:1072 ps-to-png.scm:66
+#: lily.scm:1089
 #, scheme-format
 msgid "Invoking `~a'...\n"
 msgstr "Appel de « ~a »...\n"
 
-#: ly-syntax-constructors.scm:66
+#: ly-syntax-constructors.scm:27
 #, scheme-format
 msgid "~a function cannot return ~a"
 msgstr "La fonction ~a ne peut retourner ~a."
 
-#: ly-syntax-constructors.scm:76
+#: ly-syntax-constructors.scm:60
 #, scheme-format
 msgid "wrong type for argument ~a.  Expecting ~a, found ~s"
 msgstr ""
 "type d'argument erroné pour ~a.\n"
 " Attendait ~a, ~s trouvé"
 
-#: ly-syntax-constructors.scm:200
-#, scheme-format
-msgid "Invalid property operation ~a"
-msgstr "Opération de propriété invalide : ~a"
-
 #: markup-macros.scm:331
 #, scheme-format
 msgid "Wrong number of arguments.  Expect: ~A, found ~A: ~S"
@@ -3941,69 +3966,79 @@ msgstr "hauteur d'inversion absente de la gamme : rien à transposer"
 msgid "negative replication count; ignoring"
 msgstr "compteur de réplication négatif : rien à transposer"
 
-#: music-functions.scm:311
+#: music-functions.scm:319
 #, scheme-format
 msgid "invalid tremolo repeat count: ~a"
 msgstr "nombre de répétition en trémolo invalide : ~a"
 
-#: music-functions.scm:340
+#: music-functions.scm:348
 #, scheme-format
 msgid "unknown repeat type `~S': must be volta, unfold, percent, or tremolo"
 msgstr "type de répétition « ~S » inconnu : doit être volta, unfold, percent ou tremolo"
 
-#: music-functions.scm:344
+#: music-functions.scm:352
 msgid "More alternatives than repeats.  Junking excess alternatives"
 msgstr ""
 "Plus d'alternatives que de répétitions.\n"
 " Escamotage des alternatives surnuméraires."
 
-#: music-functions.scm:480
+#: music-functions.scm:487
 #, scheme-format
 msgid "bad grob property path ~a"
 msgstr "chemin d'accès au « grob » erroné : ~a"
 
-#: music-functions.scm:779
+#: music-functions.scm:511
+#, scheme-format
+msgid "bad context property ~a"
+msgstr "propriété de contexte ~a erronée"
+
+#: music-functions.scm:534
+#, scheme-format
+msgid "bad music property ~a"
+msgstr "propriété musicale ~a erronée"
+
+#: music-functions.scm:840
 msgid "Bad chord repetition"
 msgstr "Mauvaise répétition d'accord"
 
-#: music-functions.scm:884
+#: music-functions.scm:945
 #, scheme-format
 msgid "music expected: ~S"
 msgstr "~S requiert de la musique"
 
-#: music-functions.scm:1226
+#: music-functions.scm:1295
 #, scheme-format
 msgid "cannot find quoted music: `~S'"
 msgstr "impossible de trouver la citation de musique « ~S »"
 
-#: music-functions.scm:1366
+#: music-functions.scm:1432
 msgid "Add @var{octave-shift} to the octave of @var{pitch}."
 msgstr "Ajoute @var{octave-shift} à l'octave de @var{hauteur}."
 
-#: music-functions.scm:1429
+#: music-functions.scm:1495
 #, scheme-format
 msgid "Unknown octaveness type: ~S "
 msgstr "Octave inconnue : « ~S »"
 
-#: music-functions.scm:1430
+#: music-functions.scm:1496
 msgid "Defaulting to 'any-octave."
 msgstr "Application de la valeur par défaut 'any-octave."
 
-#: music-functions.scm:1822
+#: music-functions.scm:1888
 #, scheme-format
 msgid "unknown accidental style: ~S"
 msgstr "style d'altération inconnu : ~S"
 
-#: music-functions.scm:2040
+#: music-functions.scm:2098
 msgid "Missing duration"
 msgstr "Durée absente"
 
-#: music-functions.scm:2549
+#: music-functions.scm:2626
 #, scheme-format
 msgid "not a symbol list: ~a"
 msgstr "n'est pas une liste de symboles : ~a"
 
-#: music-functions.scm:2552
+#: music-functions.scm:2629
 #, scheme-format
 msgid "conflicting tag group ~a"
 msgstr "groupe de balises (tag) ~a conflictuel"
@@ -4032,23 +4067,23 @@ msgstr "Un glyphe doit avoir une valeur unicode"
 msgid "cannot find SVG font ~S"
 msgstr "fonte SVG « ~S » introuvable."
 
-#: paper.scm:122
+#: paper.scm:121
 msgid "set-global-staff-size: not in toplevel scope"
 msgstr "set-global-staff-size n'est pas à un niveau de portée globale"
 
-#: paper.scm:322
+#: paper.scm:321
 #, scheme-format
 msgid "This is not a \\layout {} object, ~S"
 msgstr "~S n'est pas un objet de \\layout {}"
 
-#: paper.scm:330
+#: paper.scm:329
 #, scheme-format
 msgid "Unknown paper size: ~a"
 msgstr "Format de papier inconnu : ~a"
 
 #. TODO: should raise (generic) exception with throw, and catch
 #. that in parse-scm.cc
-#: paper.scm:349
+#: paper.scm:348
 msgid "Must use #(set-paper-size .. ) within \\paper { ... }"
 msgstr "#(set-paper-size ..) doit être dans la section \\paper { ... }"
 
@@ -4062,19 +4097,24 @@ msgstr "type de clef inconnu : « ~a »"
 msgid "supported clefs: ~a"
 msgstr "clefs reconnues : ~a"
 
-#: parser-ly-from-scheme.scm:74
+#: parser-ly-from-scheme.scm:73
 msgid "error in #{ ... #}"
 msgstr "erreur dans #{ ... #}"
 
-#: part-combiner.scm:748
+#: part-combiner.scm:894
 #, scheme-format
 msgid "quoted music `~a' is empty"
 msgstr "il n'y a rien à reproduire dans « ~a »"
 
-#: ps-to-png.scm:70
+#: ps-to-png.scm:72 ps-to-png.scm:75
+#, scheme-format
+msgid "Copying `~a' to `~a'..."
+msgstr "Copie de « ~a » en « ~a »..."
+
+#: ps-to-png.scm:77 ps-to-png.scm:79
 #, scheme-format
-msgid "~a exited with status: ~S"
-msgstr "~a s'est terminé avec le statut ~S"
+msgid "Deleting `~a'..."
+msgstr "Suppression de « ~a »..."
 
 #: to-xml.scm:190
 #, scheme-format
index 5f23b17f1242be1ee6c2cbc1638524540ac51906..01ed7f9a841d68f9044ebdf393d5121a428c9b81 100644 (file)
--- a/po/it.po
+++ b/po/it.po
@@ -4,22 +4,22 @@
 #
 # Tineke de Munnik <jantien@xs4all.nl>, 1998.
 # Maurizio Umberto Puxeddu <umbpux@tin.it>, 1999
-# Federico Bruni <fedelogy@gmail.com>, 2009-2012, 2012, 2013, 2015.
+# Federico Bruni <fede@inventati.org>, 2009-2012, 2012, 2013, 2015.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: lilypond 2.19.16\n"
+"Project-Id-Version: lilypond 2.19.26\n"
 "Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs\n"
-"POT-Creation-Date: 2015-02-28 14:31+0000\n"
-"PO-Revision-Date: 2015-03-02 20:06+0100\n"
-"Last-Translator: Federico Bruni <fedelogy@gmail.com>\n"
+"POT-Creation-Date: 2015-08-27 10:48+0100\n"
+"PO-Revision-Date: 2015-09-02 05:46+0200\n"
+"Last-Translator: Federico Bruni <fede@inventati.org>\n"
 "Language-Team: Italian <tp@lists.linux.it>\n"
 "Language: it\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n!=1);\n"
-"X-Generator: Gtranslator 2.91.6\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Gtranslator 2.91.7\n"
 
 #: book_base.py:26
 #, python-format
@@ -170,7 +170,7 @@ msgstr "\\textstyle deprecato, nuova sintassi per \\key"
 
 #: convertrules.py:82 convertrules.py:1856 convertrules.py:2032
 #: convertrules.py:2175 convertrules.py:2506 convertrules.py:2801
-#: convertrules.py:3151 convertrules.py:3385 convertrules.py:3697
+#: convertrules.py:3151 convertrules.py:3388 convertrules.py:3700
 msgid "bump version for release"
 msgstr "aumentare il numero di versione per il rilascio"
 
@@ -590,10 +590,10 @@ msgstr "Elimina oldaddlyrics"
 #: convertrules.py:2820
 msgid ""
 "oldaddlyrics is no longer supported. \n"
-"         Use addlyrics or lyrsicsto instead.\n"
+"         Use addlyrics or lyricsto instead.\n"
 msgstr ""
 "oldaddlyrics non è più supportato.\n"
-"         Usa addlyrics o lyrsicsto al suo posto.\n"
+"         Usare addlyrics o lyrsicsto al suo posto.\n"
 
 #: convertrules.py:2826
 msgid ""
@@ -833,15 +833,15 @@ msgstr "consistent-broken-slope viene ora gestito attraverso la callback delle p
 msgid "input/regression/beam-broken-classic.ly shows how broken beams are now handled.\n"
 msgstr "input/regression/beam-broken-classic.ly mostra come vengono gestite ora le travature spezzate.\n"
 
-#: convertrules.py:3369
+#: convertrules.py:3372
 msgid "beamExceptions controls whole-measure beaming."
 msgstr "beamExceptions controlla la disposizione delle travature sull'intera misura."
 
-#: convertrules.py:3606
+#: convertrules.py:3609
 msgid "Flag.transparent and Flag.color inherit from Stem"
 msgstr "Flag.transparent e Flag.color ereditano da Stem"
 
-#: convertrules.py:3672
+#: convertrules.py:3675
 msgid "Staff-padding now controls the distance to the baseline, not the nearest point."
 msgstr "La spaziatura del rigo (padding) ora controlla la distanza rispetto alla linea di base, non più rispetto al punto più vicino."
 
@@ -947,12 +947,12 @@ msgstr "Si è inserita un'ottava di alterazione di tonalità per un numero di al
 msgid "Unable to find instrument for ID=%s\n"
 msgstr "Impossibile trovare lo strumento con ID=%s\n"
 
-#: abc2ly.py:1386 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044
+#: abc2ly.py:1389 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044
 #, python-format
 msgid "%s [OPTION]... FILE"
 msgstr "%s [OPZIONE]... FILE"
 
-#: abc2ly.py:1387
+#: abc2ly.py:1390
 #, python-format
 msgid ""
 "abc2ly converts ABC music files (see\n"
@@ -961,29 +961,29 @@ msgstr ""
 "abc2ly converte file musicali ABC (si veda\n"
 "%s) in input LilyPond.\n"
 
-#: abc2ly.py:1395 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231
-#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:183
+#: abc2ly.py:1398 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231
+#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:184
 msgid "show version number and exit"
 msgstr "mostra il numero di versione ed esce"
 
-#: abc2ly.py:1398 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140
-#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:162
+#: abc2ly.py:1401 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140
+#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:163
 msgid "show this help and exit"
 msgstr "mostra questo messaggio di aiuto ed esce"
 
-#: abc2ly.py:1401 etf2ly.py:1209 midi2ly.py:1071
+#: abc2ly.py:1404 etf2ly.py:1209 midi2ly.py:1071
 msgid "write output to FILE"
 msgstr "scrive l'output in FILE"
 
-#: abc2ly.py:1404
+#: abc2ly.py:1407
 msgid "be strict about success"
 msgstr "è severo rispetto all'esito"
 
-#: abc2ly.py:1407
+#: abc2ly.py:1410
 msgid "preserve ABC's notion of beams"
 msgstr "preserva la nozione di travatura di ABC"
 
-#: abc2ly.py:1410
+#: abc2ly.py:1413
 msgid "suppress progress messages"
 msgstr "sopprime i messaggi di avanzamento"
 
@@ -991,8 +991,8 @@ msgstr "sopprime i messaggi di avanzamento"
 #. "Report bugs in English via %s",
 #. or if there is a LilyPond users list or forum in your language
 #. "Report bugs in English via %s or in YOUR_LANG via URI"
-#: abc2ly.py:1413 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258
-#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:317
+#: abc2ly.py:1416 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258
+#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:318
 #, c-format, python-format
 msgid "Report bugs via %s"
 msgstr "Segnalare i bug in inglese attraverso %s"
@@ -1043,7 +1043,7 @@ msgid "Print log messages according to LOGLEVEL (NONE, ERROR, WARNING, PROGRESS
 msgstr "Mostra i messaggi di log in base a LOGLEVEL (NONE, ERROR, WARNING, PROGRESS (default), DEBUG)"
 
 #: convert-ly.py:111 lilypond-book.py:163 lilypond-book.py:181
-#: musicxml2ly.py:2629 main.cc:176
+#: musicxml2ly.py:2629 main.cc:177
 msgid "LOGLEVEL"
 msgstr "LOGLEVEL"
 
@@ -1075,7 +1075,7 @@ msgid "make a numbered backup [default: filename.ext~]"
 msgstr "crea un file di backup numerato (predefinito: nomefile.est~)"
 
 #: convert-ly.py:152 etf2ly.py:1212 lilypond-book.py:234 midi2ly.py:1096
-#: main.cc:185
+#: main.cc:186
 msgid "show warranty and copyright"
 msgstr "mostra la garanzia e il copyright"
 
@@ -1096,17 +1096,17 @@ msgstr "Fermarsi all'ultima regola riuscita"
 msgid "Processing `%s'... "
 msgstr "Elaborazione di «%s»... "
 
-#: convert-ly.py:368
+#: convert-ly.py:366
 #, python-format
 msgid "%s: Unable to open file"
 msgstr "%s: Impossibile aprire il file"
 
-#: convert-ly.py:374
+#: convert-ly.py:372
 #, python-format
 msgid "%s: Unable to determine version.  Skipping"
 msgstr "%s: Impossibile determinare la versione. Tralasciato"
 
-#: convert-ly.py:380
+#: convert-ly.py:378
 #, python-format
 msgid ""
 "%s: Invalid version string `%s' \n"
@@ -1115,7 +1115,7 @@ msgstr ""
 "%s: Stringa di versione non valida `%s' \n"
 "Le stringhe di versione valide sono composte da tre numeri separati da punti, ad esempio «2.8.12»"
 
-#: convert-ly.py:386
+#: convert-ly.py:384
 #, python-format
 msgid "There was %d error."
 msgid_plural "There were %d errors."
@@ -1136,7 +1136,7 @@ msgstr ""
 "etf2ly converte un sottoinsieme di ETF in un file LilyPond pronto da usare.\n"
 
 #: etf2ly.py:1210 midi2ly.py:1067 midi2ly.py:1072 musicxml2ly.py:2659
-#: main.cc:168 main.cc:180
+#: main.cc:169 main.cc:181
 msgid "FILE"
 msgstr "FILE"
 
@@ -1174,7 +1174,7 @@ msgid "add DIR to include path"
 msgstr "aggiunge DIR al percorso di inclusione"
 
 #: lilypond-book.py:143 lilypond-book.py:150 lilypond-book.py:169
-#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:167
+#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:168
 msgid "DIR"
 msgstr "DIR"
 
@@ -1184,10 +1184,10 @@ msgstr "formatta l'output di Texinfo in modo che Info cerchi le immagini in DIR"
 
 #: lilypond-book.py:155
 msgid "PAD"
-msgstr "PAD"
+msgstr "SPAZIATURA"
 
 #: lilypond-book.py:157
-msgid "pad left side of music to align music inspite of uneven bar numbers (in mm)"
+msgid "pad left side of music to align music in spite of uneven bar numbers (in mm)"
 msgstr "aumenta il lato sinistro della musica (in mm) per allinearla nonostante il numero irregolare di battute"
 
 #: lilypond-book.py:162
@@ -1726,7 +1726,7 @@ msgstr "avvertimento soppresso: %s"
 msgid "accidental typesetting list must begin with context-name: %s"
 msgstr "la lista tipografica delle alterazioni deve iniziare con context-name: %s"
 
-#: accidental-engraver.cc:210
+#: accidental-engraver.cc:207
 #, c-format
 msgid "procedure or context-name expected for accidental rule, found %s"
 msgstr "si aspettava una procedura o context-name per la regola di alterazione accidentale, si è trovato %s"
@@ -1740,7 +1740,7 @@ msgstr "Non si è trovato il nome del glifo per l'alterazione %s"
 msgid "natural alteration glyph not found"
 msgstr "alterazione naturale del glifo non trovata"
 
-#: all-font-metrics.cc:149
+#: all-font-metrics.cc:159
 #, c-format
 msgid "cannot find font: `%s'"
 msgstr "impossibile trovare il tipo di carattere: «%s»"
@@ -1753,11 +1753,6 @@ msgstr "l'argomento di \\applycontext non è una procedura"
 msgid "no heads for arpeggio found?"
 msgstr "non sono state trovate teste per l'arpeggio?"
 
-#: auto-change-iterator.cc:74 change-iterator.cc:72
-#, c-format
-msgid "cannot change, already in translator: %s"
-msgstr "impossibile cambiare, già nel traduttore: %s"
-
 #: axis-group-engraver.cc:149
 msgid "Axis_group_engraver: vertical group already has a parent"
 msgstr "Axis_group_engraver: il gruppo verticale ha già un genitore"
@@ -1770,12 +1765,12 @@ msgstr "ci sono due Axis_group_engravers?"
 msgid "removing this vertical group"
 msgstr "eliminazione di questo gruppo verticale"
 
-#: axis-group-interface.cc:714
+#: axis-group-interface.cc:716
 #, c-format
 msgid "\"%s\" is not a valid outside-staff-placement-directive"
 msgstr "non si può posizionare un oggetto fuori dal rigo con \"%s\" (outside-staff-placement-directive)"
 
-#: axis-group-interface.cc:786
+#: axis-group-interface.cc:788
 msgid "an outside-staff object should have a direction, defaulting to up"
 msgstr "un oggetto esterno al rigo dovrebbe avere una direzione, si imposta in su come da impostazione predefinita"
 
@@ -1805,11 +1800,11 @@ msgid "beam was started here"
 msgstr "la travatura è iniziata qui"
 
 #. We are completely screwed.
-#: beam-quanting.cc:839
+#: beam-quanting.cc:850
 msgid "no viable initial configuration found: may not find good beam slope"
 msgstr "nessuna configurazione iniziale fattibile trovata: si potrebbe non trovare una buona inclinazione delle travature"
 
-#: beam.cc:181
+#: beam.cc:183
 msgid "removing beam with no stems"
 msgstr "rimozione delle travature senza gambi"
 
@@ -1819,22 +1814,24 @@ msgid "cannot change `%s' to `%s'"
 msgstr "impossibile cambiare «%s» in «%s»"
 
 #. FIXME: constant error message.
-#: change-iterator.cc:93
+#: change-iterator.cc:67
 msgid "cannot find context to switch to"
 msgstr "impossibile trovare il contesto su cui spostarsi"
 
+#. No enclosing context was found because the iterator's immediate
+#. context is the kind that was sought.
 #. We could change the current translator's id, but that would make
 #. errors hard to catch.
 #.
 #. last->translator_id_string () = get_change
 #. ()->change_to_id_string ();
-#: change-iterator.cc:102
+#: change-iterator.cc:78
 #, c-format
 msgid "not changing to same context type: %s"
 msgstr "non passare allo stesso tipo di contesto: %s"
 
-#. FIXME: uncomprehensable message
-#: change-iterator.cc:106
+#. FIXME: incomprehensible message
+#: change-iterator.cc:82
 msgid "none of these in my family"
 msgstr "nessuno di questi nella mia famiglia"
 
@@ -1873,22 +1870,22 @@ msgstr "impossibile trovare interruzioni di linea che soddisfino i vincoli"
 msgid "need symbol arguments for \\override and \\revert"
 msgstr "sono necessari argomenti simbolici per \\override e \\revert"
 
-#: context.cc:143
+#: context.cc:144
 #, c-format
 msgid "cannot find or create new `%s'"
 msgstr "impossibile trovare o creare un nuovo «%s»"
 
-#: context.cc:222
+#: context.cc:223
 #, c-format
 msgid "cannot find or create `%s' called `%s'"
 msgstr "impossibile trovare o creare «%s» chiamato «%s»"
 
-#: context.cc:419
+#: context.cc:416
 #, c-format
 msgid "cannot find or create: `%s'"
 msgstr "impossibile trovare o creare: «%s»"
 
-#: context.cc:433
+#: context.cc:430
 #, c-format
 msgid "cannot find or create new Bottom = \"%s\""
 msgstr "impossibile trovare o creare un nuovo Bottom = «%s»"
@@ -1898,20 +1895,20 @@ msgstr "impossibile trovare o creare un nuovo Bottom = «%s»"
 msgid "custos `%s' not found"
 msgstr "custos «%s» non trovato"
 
-#: dispatcher.cc:83
+#: dispatcher.cc:82
 msgid "Event class should be a list"
 msgstr "La classe evento dovrebbe essere una lista"
 
-#: dispatcher.cc:166
+#: dispatcher.cc:165
 #, c-format
 msgid "Junking event: %s"
 msgstr "Eliminazione dell'evento: %s"
 
-#: dispatcher.cc:271
+#: dispatcher.cc:279
 msgid "Attempting to remove nonexisting listener."
 msgstr "Tentativo di togliere un ascoltatore non esistente."
 
-#: dispatcher.cc:297
+#: dispatcher.cc:305
 msgid "Already listening to dispatcher, ignoring request"
 msgstr "Già in ascolto del controllore, si ignora la richiesta"
 
@@ -1920,7 +1917,7 @@ msgstr "Già in ascolto del controllore, si ignora la richiesta"
 msgid "dot `%s' not found"
 msgstr "punto «%s» non trovato"
 
-#: dynamic-engraver.cc:168
+#: dynamic-engraver.cc:169
 #, c-format
 msgid ""
 "unknown crescendo style: %s\n"
@@ -1929,7 +1926,7 @@ msgstr ""
 "stile di crescendo sconosciuto: %s\n"
 "si usa la forcella predefinita."
 
-#: dynamic-engraver.cc:233 slur-proto-engraver.cc:119
+#: dynamic-engraver.cc:234 slur-proto-engraver.cc:119
 #, c-format
 msgid "unterminated %s"
 msgstr "%s non terminato"
@@ -1957,22 +1954,22 @@ msgstr "episema non terminato"
 msgid "unterminated extender"
 msgstr "estensore non terminato"
 
-#: flag.cc:134
+#: flag.cc:133
 #, c-format
 msgid "flag `%s' not found"
 msgstr "non si trova la coda uncinata «%s»"
 
-#: flag.cc:154
+#: flag.cc:153
 #, c-format
 msgid "flag stroke `%s' not found"
 msgstr "non si trova il tratto «%s» della coda uncinata"
 
-#: font-config-scheme.cc:151 font-config.cc:53
+#: font-config-scheme.cc:151 font-config.cc:82
 #, c-format
 msgid "failed adding font directory: %s"
 msgstr "errore nell'aggiungere la directory dei tipi di carattere: %s"
 
-#: font-config-scheme.cc:153 font-config.cc:55
+#: font-config-scheme.cc:153 font-config.cc:84
 #, c-format
 msgid "Adding font directory: %s"
 msgstr "Si aggiunge la directory dei tipi di carattere: %s"
@@ -1991,7 +1988,17 @@ msgstr "Si aggiunge il file dei tipi di carattere: %s"
 msgid "Initializing FontConfig..."
 msgstr "Inizializzazione di FontConfig..."
 
-#: font-config.cc:58
+#: font-config.cc:70
+#, c-format
+msgid "failed to add fontconfig configuration file `%s'"
+msgstr "errore nell'aggiungere il file di configurazione di fontconfig: «%s»"
+
+#: font-config.cc:73
+#, c-format
+msgid "Adding fontconfig configuration file: %s"
+msgstr "Si aggiunge il file di configurazione di fontconfig: %s"
+
+#: font-config.cc:86
 msgid "Building font database..."
 msgstr "Creazione del database dei tipi di carattere..."
 
@@ -2055,12 +2062,12 @@ msgstr "Interfaccia «%s» sconosciuta"
 msgid "Grob `%s' has no interface for property `%s'"
 msgstr "Il grob «%s» non ha un'interfaccia per la proprietà «%s»"
 
-#: grob-property.cc:35
+#: grob-property.cc:33
 #, c-format
 msgid "%d: %s"
 msgstr "%d: %s"
 
-#: grob.cc:481
+#: grob.cc:492
 #, c-format
 msgid "ignored infinite %s-offset"
 msgstr "%s-offset infinito ignorato"
@@ -2089,7 +2096,7 @@ msgstr "eliminazione di un trattino non terminato"
 msgid "unterminated hyphen; removing"
 msgstr "trattino non terminato; eliminazione"
 
-#: includable-lexer.cc:71 lily-guile.cc:91 lily-parser-scheme.cc:108
+#: includable-lexer.cc:71 lily-guile.cc:92 lily-parser-scheme.cc:108
 #, c-format
 msgid "cannot find file: `%s'"
 msgstr "impossibile trovare il file: «%s»"
@@ -2099,11 +2106,11 @@ msgstr "impossibile trovare il file: «%s»"
 msgid "(search path: `%s')"
 msgstr "(percorso di ricerca: «%s»)"
 
-#: input.cc:138 source-file.cc:177 source-file.cc:192
+#: input.cc:138 source-file.cc:180 source-file.cc:195
 msgid "position unknown"
 msgstr "posizione sconosciuta"
 
-#: key-engraver.cc:198
+#: key-engraver.cc:197
 msgid "Incomplete keyAlterationOrder for key signature"
 msgstr "keyAlterationOrder incompleto per l'armatura di chiave"
 
@@ -2144,21 +2151,21 @@ msgstr "pausa ignorata: la legatura non può contenere una pausa"
 msgid "ligature was started here"
 msgstr "la legatura è iniziata qui"
 
-#: lily-guile.cc:93
+#: lily-guile.cc:94
 #, c-format
 msgid "(load path: `%s')"
 msgstr "(percorso di caricamento: «%s»)"
 
-#: lily-guile.cc:412
+#: lily-guile.cc:413
 #, c-format
 msgid "cannot find property type-check for `%s' (%s)."
 msgstr "impossibile trovare la proprietà type-check per «%s» (%s)."
 
-#: lily-guile.cc:415
+#: lily-guile.cc:416
 msgid "perhaps a typing error?"
 msgstr "forse un errore di digitazione?"
 
-#: lily-guile.cc:422
+#: lily-guile.cc:423
 msgid "skipping assignment"
 msgstr "assegnazione saltata"
 
@@ -2167,20 +2174,33 @@ msgstr "assegnazione saltata"
 msgid "type check for `%s' failed; value `%s' must be of type `%s'"
 msgstr "controllo del tipo per «%s» fallito; il valore «%s» deve essere del tipo «%s»"
 
-#: lily-lexer.cc:249
+#. Uh oh.  unsmob<T> delivered 0, yet
+#. unsmob<T> delivers true.  This means that unsmob<T> is a
+#. matching check from a base class of T, but var is of an
+#. incompatible derived type.
+#: lily-guile.cc:462
+msgid "Wrong kind of "
+msgstr "Tipo errato di"
+
+#: lily-lexer.cc:251
 msgid "include files are not allowed in safe mode"
 msgstr "l'inclusione di file non è permessa in modalità sicura"
 
-#: lily-lexer.cc:276
+#: lily-lexer.cc:278
 #, c-format
 msgid "identifier name is a keyword: `%s'"
 msgstr "Il nome dell'identificatore è una parola chiave: «%s»"
 
-#: lily-lexer.cc:297 lily-lexer.cc:310
+#: lily-lexer.cc:299 lily-lexer.cc:312
 #, c-format
 msgid "%s:EOF"
 msgstr "%s:EOF"
 
+#: lily-modules.cc:81
+#, c-format
+msgid "Uninitialized variable `%s' in module (%s)"
+msgstr "Variabile «%s» non inizializzata nel modulo (%s)"
+
 #: lily-parser-scheme.cc:80
 #, c-format
 msgid "Changing working directory to: `%s'"
@@ -2201,19 +2221,19 @@ msgstr "impossibile trovare il file di init: «%s»"
 msgid "Processing `%s'"
 msgstr "Elaborazione di «%s»"
 
-#: lily-parser-scheme.cc:209
+#: lily-parser-scheme.cc:210
 msgid "ly:parser-parse-string is only valid with a new parser.  Use ly:parser-include-string instead."
 msgstr "ly:parser-parse-string è valido solo con un nuovo parser.  Usare ly:parser-include-string al suo posto."
 
-#: lily-parser-scheme.cc:240
+#: lily-parser-scheme.cc:241
 msgid "ly:parse-string-expression is only valid with a new parser.  Use ly:parser-include-string instead."
 msgstr "ly:parse-string-expression è valido solo con un nuovo parser.  Usare ly:parser-include-string al suo posto."
 
-#: lily-parser.cc:107
+#: lily-parser.cc:106
 msgid "Parsing..."
 msgstr "Analisi..."
 
-#: lookup.cc:181
+#: lookup.cc:178
 #, c-format
 msgid "Not drawing a box with negative dimension, %.2f by %.2f."
 msgstr "Il riquadro con dimensioni negative, %.2f per %.2f, non verrà disegnato."
@@ -2222,12 +2242,12 @@ msgstr "Il riquadro con dimensioni negative, %.2f per %.2f, non verrà disegnato
 msgid "argument of \\lyricsto should contain Lyrics context"
 msgstr "l'argomento di \\lyricsto deve contenere il contesto Lyrics"
 
-#: lyric-combine-music-iterator.cc:349
+#: lyric-combine-music-iterator.cc:344
 #, c-format
 msgid "cannot find %s `%s'"
 msgstr "impossibile trovare %s «%s»"
 
-#: main.cc:105
+#: main.cc:106
 #, c-format
 msgid ""
 "This program is free software.  It is covered by the GNU General Public\n"
@@ -2239,7 +2259,7 @@ msgstr ""
 "License che permette di modificarlo o distribuirne copie rispettando certe\n"
 "condizioni. Per maggiori informazioni, invocare «%s --warranty».\n"
 
-#: main.cc:111
+#: main.cc:112
 msgid ""
 "    This program is free software; you can redistribute it and/or\n"
 "modify it under the terms of the GNU General Public License as \n"
@@ -2271,11 +2291,11 @@ msgstr ""
 "Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n"
 "Boston, MA 02111-1307, USA.\n"
 
-#: main.cc:149
+#: main.cc:150
 msgid "SYM[=VAL]"
 msgstr "SIMBOLO[=VALORE]"
 
-#: main.cc:150
+#: main.cc:151
 msgid ""
 "set Scheme option SYM to VAL (default: #t).\n"
 "Use -dhelp for help."
@@ -2283,45 +2303,45 @@ msgstr ""
 "imposta l'opzione di Scheme SIMBOLO a VALORE (predefinito: #t).\n"
 "Usare -dhelp per ottenere aiuto."
 
-#: main.cc:154
+#: main.cc:155
 msgid "EXPR"
 msgstr "ESPRESSIONE"
 
-#: main.cc:154
+#: main.cc:155
 msgid "evaluate scheme code"
 msgstr "valuta il codice scheme"
 
 #. Bug in option parser: --output =foe is taken as an abbreviation
 #. for --output-format.
-#: main.cc:157
+#: main.cc:158
 msgid "FORMATs"
 msgstr "FORMATO"
 
-#: main.cc:157
+#: main.cc:158
 msgid "dump FORMAT,...  Also as separate options:"
 msgstr "scarica FORMATO,...  Anche come opzioni separate:"
 
-#: main.cc:158
+#: main.cc:159
 msgid "generate PDF (default)"
 msgstr "genera PDF (predefinito)"
 
-#: main.cc:159
+#: main.cc:160
 msgid "generate PNG"
 msgstr "genera PNG"
 
-#: main.cc:160
+#: main.cc:161
 msgid "generate PostScript"
 msgstr "genera PostScript"
 
-#: main.cc:161
+#: main.cc:162
 msgid "generate big PDF files"
 msgstr "genera grandi file PDF"
 
-#: main.cc:164
+#: main.cc:165
 msgid "FIELD"
 msgstr "CAMPO"
 
-#: main.cc:164
+#: main.cc:165
 msgid ""
 "dump header field FIELD to file\n"
 "named BASENAME.FIELD"
@@ -2329,19 +2349,19 @@ msgstr ""
 "scrive il campo di intestazione CAMPO sul\n"
 "file chiamato BASENAME.CAMPO"
 
-#: main.cc:167
+#: main.cc:168
 msgid "add DIR to search path"
 msgstr "aggiunge DIRECTORY ai percorsi di ricerca"
 
-#: main.cc:168
+#: main.cc:169
 msgid "use FILE as init file"
 msgstr "usa FILE come file di inizializzazione"
 
-#: main.cc:171
+#: main.cc:172
 msgid "USER, GROUP, JAIL, DIR"
 msgstr "UTENTE, GRUPPO, GABBIA, DIRECTORY"
 
-#: main.cc:171
+#: main.cc:172
 msgid ""
 "chroot to JAIL, become USER:GROUP\n"
 "and cd into DIR"
@@ -2349,7 +2369,7 @@ msgstr ""
 "chroot a GABBIA, diventa UTENTE:GRUPPO\n"
 "ed entra in DIRECTORY"
 
-#: main.cc:176
+#: main.cc:177
 msgid ""
 "print log messages according to LOGLEVEL.  Possible values are:\n"
 "NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (default) and DEBUG."
@@ -2357,24 +2377,24 @@ msgstr ""
 "mostra i messaggi di log in base a LOGLEVEL.  I valori possibili sono:\n"
 "NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (default) e DEBUG."
 
-#: main.cc:180
+#: main.cc:181
 msgid "write output to FILE (suffix will be added)"
 msgstr "scrive l'output su FILE (verrà aggiunto un suffisso)"
 
-#: main.cc:181
+#: main.cc:182
 msgid "relocate using directory of lilypond program"
 msgstr "trasferisce alla directory del programma lilypond"
 
-#: main.cc:182
+#: main.cc:183
 msgid "no progress, only error messages (equivalent to loglevel=ERROR)"
 msgstr "nessun progresso, solo messaggi di errore (equivalente al loglevel=ERROR)"
 
-#: main.cc:184
+#: main.cc:185
 msgid "be verbose (equivalent to loglevel=DEBUG)"
 msgstr "output dettagliato (equivalente al loglevel=DEBUG)"
 
 #. Do not update the copyright years here, run `make grand-replace'
-#: main.cc:263
+#: main.cc:264
 #, c-format
 msgid ""
 "Copyright (c) %s by\n"
@@ -2384,84 +2404,84 @@ msgstr ""
 "%s e altri."
 
 #. No version number or newline here.  It confuses help2man.
-#: main.cc:301
+#: main.cc:302
 #, c-format
 msgid "Usage: %s [OPTION]... FILE..."
 msgstr "Uso: %s [OPZIONE]... [FILE]..."
 
-#: main.cc:303
+#: main.cc:304
 msgid "Typeset music and/or produce MIDI from FILE."
 msgstr "Stampa partitura oppure crea MIDI da FILE."
 
-#: main.cc:305
+#: main.cc:306
 msgid "LilyPond produces beautiful music notation."
 msgstr "LilyPond produce bella notazione musicale."
 
-#: main.cc:307
+#: main.cc:308
 #, c-format
 msgid "For more information, see %s"
 msgstr "Per maggiori informazioni si veda %s"
 
-#: main.cc:309
+#: main.cc:310
 msgid "Options:"
 msgstr "Opzioni:"
 
-#: main.cc:376
+#: main.cc:377
 #, c-format
 msgid "expected %d arguments with jail, found: %u"
 msgstr "previsti gli argomenti %d per la gabbia, trovati: %u"
 
-#: main.cc:390
+#: main.cc:391
 #, c-format
 msgid "no such user: %s"
 msgstr "non esiste questo utente: %s"
 
-#: main.cc:392
+#: main.cc:393
 #, c-format
 msgid "cannot get user id from user name: %s: %s"
 msgstr "impossibile acquisire l'id dell'utente dal nome utente: %s: %s"
 
-#: main.cc:407
+#: main.cc:408
 #, c-format
 msgid "no such group: %s"
 msgstr "non esiste questo gruppo: %s"
 
-#: main.cc:409
+#: main.cc:410
 #, c-format
 msgid "cannot get group id from group name: %s: %s"
 msgstr "impossibile acquisire l'id del gruppo dal nome del gruppo: %s:%s"
 
-#: main.cc:417
+#: main.cc:418
 #, c-format
 msgid "cannot chroot to: %s: %s"
 msgstr "non si può fare il chroot a: %s: %s"
 
-#: main.cc:424
+#: main.cc:425
 #, c-format
 msgid "cannot change group id to: %d: %s"
 msgstr "non si può cambiare l'id del gruppo in: %d: %s"
 
-#: main.cc:430
+#: main.cc:431
 #, c-format
 msgid "cannot change user id to: %d: %s"
 msgstr "non si può cambiare l'id dell'utente in: %d: %s"
 
-#: main.cc:436
+#: main.cc:437
 #, c-format
 msgid "cannot change working directory to: %s: %s"
 msgstr "non si può passare alla directory di lavoro: %s: %s"
 
-#: main.cc:825
+#: main.cc:826
 #, c-format
 msgid "exception caught: %s"
 msgstr "ricevuta un'eccezione: %s"
 
 #. FIXME: constant error message.
-#: mark-engraver.cc:156
+#: mark-engraver.cc:150
 msgid "rehearsalMark must have integer value"
 msgstr "rehearsalMark deve avere un valore intero"
 
-#: mark-engraver.cc:162
+#: mark-engraver.cc:156
 msgid "mark label must be a markup object"
 msgstr "l'etichetta del segno deve essere un oggetto di markup"
 
@@ -2513,7 +2533,7 @@ msgstr ""
 msgid "unexpected case fall-through"
 msgstr "caso inatteso e non interpretabile"
 
-#: midi-control-function-performer.cc:109 staff-performer.cc:152
+#: midi-control-function-performer.cc:107 staff-performer.cc:153
 #, c-format
 msgid "ignoring out-of-range value change for MIDI property `%s'"
 msgstr "si ignora il cambio in un valore fuori dai limiti per la proprietà MIDI «%s»"
@@ -2549,7 +2569,7 @@ msgstr "Calcolo delle interruzioni di pagina..."
 msgid "usable-duration-logs must be a non-empty list.  Falling back to whole rests."
 msgstr "usable-duration-logs deve essere una lista non vuota.  Si ricorre alle pause di semibreve."
 
-#: music.cc:149
+#: music.cc:150
 #, c-format
 msgid "octave check failed; expected \"%s\", found: \"%s\""
 msgstr "controllo dell'ottava fallito: previsto \"%s\", trovato: \"%s\""
@@ -2583,37 +2603,37 @@ msgstr "non si è trovata alcuna delle teste delle note «%s» o «%s»"
 msgid "NoteEvent without pitch"
 msgstr "NoteEvent senza altezza"
 
-#: open-type-font.cc:46
+#: open-type-font.cc:45
 #, c-format
 msgid "cannot allocate %lu bytes"
 msgstr "impossibile allocare %lu byte"
 
-#: open-type-font.cc:50
+#: open-type-font.cc:49
 #, c-format
 msgid "cannot load font table: %s"
 msgstr "impossibile caricare la tabella dei tipi di carattere: %s"
 
-#: open-type-font.cc:55
+#: open-type-font.cc:54
 #, c-format
 msgid "FreeType error: %s"
 msgstr "Errore FreeType: %s"
 
-#: open-type-font.cc:112
+#: open-type-font.cc:115
 #, c-format
 msgid "unsupported font format: %s"
 msgstr "formato di tipo di carattere non supportato: %s"
 
-#: open-type-font.cc:114
+#: open-type-font.cc:117
 #, c-format
 msgid "error reading font file %s: %s"
 msgstr "errore nella lettura del file del tipo di carattere %s: %s"
 
-#: open-type-font.cc:189
+#: open-type-font.cc:192
 #, c-format
 msgid "FT_Get_Glyph_Name () Freetype error: %s"
 msgstr "errore di Freetype in FT_Get_Glyph_Name (): %s"
 
-#: open-type-font.cc:337 pango-font.cc:257
+#: open-type-font.cc:340 pango-font.cc:258
 #, c-format
 msgid "FT_Get_Glyph_Name () error: %s"
 msgstr "errore in FT_Get_Glyph_Name (): %s"
@@ -2651,16 +2671,16 @@ msgstr "tentando %d sistemi"
 msgid "best score for this sys-count: %f"
 msgstr "miglior punteggio per questo numero di sistemi: %f"
 
-#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:248
+#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:249
 #: paper-score.cc:156
 msgid "Drawing systems..."
 msgstr "Disegno dei sistemi..."
 
-#: output-def.cc:230
+#: output-def.cc:229
 msgid "margins do not fit with line-width, setting default values"
 msgstr "i margini non corrispondono con la larghezza del rigo, si impostano i valori predefiniti"
 
-#: output-def.cc:237
+#: output-def.cc:236
 msgid "systems run off the page due to improper paper settings, setting default values"
 msgstr "i sistemi escono fuori dalla pagina a causa di errate impostazioni del foglio, si impostano i valori predefiniti"
 
@@ -2677,68 +2697,68 @@ msgstr "min-systems-per-page è maggiore di max-systems-per-page, si ignorano en
 msgid "page %d has been compressed"
 msgstr "la pagina %d è stata compressa"
 
-#: page-layout-problem.cc:402
+#: page-layout-problem.cc:400
 msgid "A page layout problem has been initiated that cannot accommodate footnotes."
 msgstr "Si è creato un problema di formattazione della pagina che impedisce di ospitare le note a pié di pagina."
 
-#: page-layout-problem.cc:731
+#: page-layout-problem.cc:729
 msgid "ragged-bottom was specified, but page must be compressed"
 msgstr "è stato specificato ragged-bottom, ma la pagina deve essere compressa"
 
-#: page-layout-problem.cc:734
+#: page-layout-problem.cc:732
 #, c-format
 msgid "compressing over-full page by %.1f staff-spaces"
 msgstr "compressione di una pagina strapiena di %.1f spazi rigo"
 
-#: page-layout-problem.cc:1199
+#: page-layout-problem.cc:1197
 msgid "staff-affinities should only decrease"
 msgstr "staff-affinities deve solo diminuire"
 
-#: page-turn-page-breaking.cc:168
+#: page-turn-page-breaking.cc:169
 #, c-format
 msgid "page-turn-page-breaking: breaking from %d to %d"
 msgstr "page-turn-page-breaking: interruzione da %d a %d"
 
-#: page-turn-page-breaking.cc:217
+#: page-turn-page-breaking.cc:218
 msgid "cannot fit the first page turn onto a single page.  Consider setting first-page-number to an even number."
 msgstr "impossibile far entrare il primo cambio di pagina in una pagina singola.  Si consideri la possibilità di impostare first-page-number su un numero pari."
 
-#: page-turn-page-breaking.cc:230
+#: page-turn-page-breaking.cc:231
 #, c-format
 msgid "Calculating page and line breaks (%d possible page breaks)..."
 msgstr "Calcolo delle interruzioni di pagina e di linea (%d possibili interruzioni di pagina)..."
 
-#: page-turn-page-breaking.cc:300
+#: page-turn-page-breaking.cc:301
 #, c-format
 msgid "break starting at page %d"
 msgstr "l'interruzione comincia alla pagina %d"
 
-#: page-turn-page-breaking.cc:301
+#: page-turn-page-breaking.cc:302
 #, c-format
 msgid "\tdemerits: %f"
 msgstr "\tdemeriti: %f"
 
-#: page-turn-page-breaking.cc:302
+#: page-turn-page-breaking.cc:303
 #, c-format
 msgid "\tsystem count: %d"
 msgstr "\tnumero dei sistemi: %d"
 
-#: page-turn-page-breaking.cc:303
+#: page-turn-page-breaking.cc:304
 #, c-format
 msgid "\tpage count: %d"
 msgstr "\tnumero delle pagine: %d"
 
-#: page-turn-page-breaking.cc:304
+#: page-turn-page-breaking.cc:305
 #, c-format
 msgid "\tprevious break: %d"
 msgstr "\tinterruzione precedente: %d"
 
-#: pango-font.cc:246
+#: pango-font.cc:247
 #, c-format
 msgid "no glyph for character U+%0X in font `%s'"
 msgstr "manca il glifo per il carattere U+%0X del tipo \"%s\""
 
-#: pango-font.cc:273
+#: pango-font.cc:274
 #, c-format
 msgid ""
 "Glyph has no name, but font supports glyph naming.\n"
@@ -2747,21 +2767,21 @@ msgstr ""
 "Il glifo non ha un nome, ma il tipo di carattere permette di dare un nome al glifo.\n"
 "Si salta il glifo U+%0X, file %s"
 
-#: pango-font.cc:323
+#: pango-font.cc:324
 #, c-format
 msgid "no PostScript font name for font `%s'"
 msgstr "nessun nome di tipo di carattere PostScript per «%s»"
 
-#: pango-font.cc:373
+#: pango-font.cc:374
 msgid "FreeType face has no PostScript font name"
 msgstr "Il tipo FreeType non ha un nome per il tipo di carattere PostScript"
 
-#: paper-book.cc:201
+#: paper-book.cc:200
 #, c-format
 msgid "program option -dprint-pages not supported by backend `%s'"
 msgstr "l'opzione -dprint-pages del programma non è supportata dal backend «%s»"
 
-#: paper-book.cc:220
+#: paper-book.cc:219
 #, c-format
 msgid "program option -dpreview not supported by backend `%s'"
 msgstr "l'opzione -dpreview del programma non è supportata dal backend «%s»"
@@ -2784,7 +2804,7 @@ msgstr "Conto degli elementi %d (spanner %d)."
 msgid "Preprocessing graphical objects..."
 msgstr "Pre-elaborazione degli oggetti grafici..."
 
-#: parse-scm.cc:128
+#: parse-scm.cc:124
 msgid "GUILE signaled an error for the expression beginning here"
 msgstr "GUILE ha segnalato un errore per l'espressione che inizia qui"
 
@@ -2797,11 +2817,11 @@ msgstr "Fallita la conversione della stringa \"%s\" in UTF-16be: %s"
 msgid "unterminated percent repeat"
 msgstr "ripetizione percentuale non terminata"
 
-#: performance.cc:55
+#: performance.cc:76
 msgid "Track..."
 msgstr "Traccia..."
 
-#: performance.cc:90
+#: performance.cc:126
 #, c-format
 msgid "MIDI output to `%s'..."
 msgstr "L'output MIDI è inviato a «%s»..."
@@ -2836,25 +2856,25 @@ msgstr "non è il nome di un grob, «%s»"
 msgid "Failed octave check, got: "
 msgstr "Il controllo dell'ottava è fallito, si è ottenuto:"
 
-#: relocate.cc:52
+#: relocate.cc:56
 #, c-format
 msgid "Setting %s to %s"
 msgstr "Si imposta %s su %s"
 
 #. this warning should only be printed in debug mode!
-#: relocate.cc:73
+#: relocate.cc:77
 #, c-format
 msgid "no such file: %s for %s"
 msgstr "file inesistente: %s per %s"
 
 #. this warning should only be printed in debug mode!
 #. this warning should only be printed in debug mode
-#: relocate.cc:84 relocate.cc:102
+#: relocate.cc:88 relocate.cc:106
 #, c-format
 msgid "no such directory: %s for %s"
 msgstr "directory inesistente: %s per %s"
 
-#: relocate.cc:93
+#: relocate.cc:97
 #, c-format
 msgid "%s=%s (prepend)\n"
 msgstr "%s=%s (prefisso)\n"
@@ -2884,7 +2904,7 @@ msgstr "Rilocazione: è assoluta: argv0=%s\n"
 msgid "Relocation : from cwd: argv0=%s\n"
 msgstr "Rilocazione: da cwd: argv0=%s\n"
 
-#: relocate.cc:194
+#: relocate.cc:196
 #, c-format
 msgid ""
 "Relocation: from PATH=%s\n"
@@ -2893,30 +2913,30 @@ msgstr ""
 "Rilocazione: da PATH=%s\n"
 "argv0=%s\n"
 
-#: relocate.cc:220
+#: relocate.cc:222
 msgid "LILYPONDPREFIX is obsolete, use LILYPOND_DATADIR"
 msgstr "LILYPONDPREFIX è obsoleto, usare LILYPOND_DATADIR"
 
-#: relocate.cc:345
+#: relocate.cc:347
 #, c-format
 msgid "Relocation file: %s"
 msgstr "File di rilocazione: %s"
 
-#: relocate.cc:349 source-file.cc:65
+#: relocate.cc:351 source-file.cc:65
 #, c-format
 msgid "cannot open file: `%s'"
 msgstr "impossibile aprire il file: «%s»"
 
-#: relocate.cc:379
+#: relocate.cc:381
 #, c-format
 msgid "Unknown relocation command %s"
 msgstr "Comando di rilocazione sconosciuto %s"
 
-#: rest-collision.cc:153
+#: rest-collision.cc:154
 msgid "cannot resolve rest collision: rest direction not set"
 msgstr "impossibile risolvere la collisione di pause: direzione delle pause non impostata"
 
-#: rest-collision.cc:164 rest-collision.cc:273
+#: rest-collision.cc:165 rest-collision.cc:274
 msgid "too many colliding rests"
 msgstr "troppe collisioni tra pause"
 
@@ -2925,33 +2945,33 @@ msgstr "troppe collisioni tra pause"
 msgid "rest `%s' not found"
 msgstr "pausa «%s» non trovata"
 
-#: score-engraver.cc:79
+#: score-engraver.cc:77
 #, c-format
 msgid "cannot find `%s'"
 msgstr "impossibile trovare «%s»"
 
-#: score-engraver.cc:81
+#: score-engraver.cc:79
 msgid "Music font has not been installed properly."
 msgstr "Il tipo di carattere musicale non è stato installato correttamente."
 
-#: score-engraver.cc:83
+#: score-engraver.cc:81
 #, c-format
 msgid "Search path `%s'"
 msgstr "Percorso di ricerca «%s»"
 
-#: score-engraver.cc:85
+#: score-engraver.cc:83
 msgid "Aborting"
 msgstr "Si sospende l'esecuzione"
 
-#: score.cc:160
+#: score.cc:161
 msgid "already have music in score"
 msgstr "musica già presente nello spartito"
 
-#: score.cc:161
+#: score.cc:163
 msgid "this is the previous music"
 msgstr "questa è la musica precedente"
 
-#: score.cc:166
+#: score.cc:169
 msgid "errors found, ignoring music expression"
 msgstr "trovati degli errori, si ignora l'espressione musicale"
 
@@ -2990,7 +3010,7 @@ msgstr "%s senza una causa"
 msgid "cannot end %s"
 msgstr "impossibile terminare %s"
 
-#: slur.cc:434
+#: slur.cc:436
 #, c-format
 msgid "Ignoring grob for slur: %s.  avoid-slur not set?"
 msgstr "Si ignora il grob per la legatura di portamento: %s. Non si è impostato avoid-slur?"
@@ -3025,18 +3045,18 @@ msgstr "forse l'input dovrebbe specificare le voci polifoniche"
 msgid "weird stem size, check for narrow beams"
 msgstr "strana dimensione del gambo, controllare di non avere travature strette"
 
-#: system.cc:201
+#: system.cc:202
 #, c-format
 msgid "Element count %d"
 msgstr "Numero degli elementi %d"
 
-#: system.cc:512
+#: system.cc:513
 #, c-format
 msgid "Grob count %d"
 msgstr "Numero degli oggetti grafici %d"
 
 #. TODO: Also print the arguments of the markup!
-#: text-interface.cc:138
+#: text-interface.cc:139
 #, c-format
 msgid "Markup depth exceeds maximal value of %d; Markup: %s"
 msgstr "La profondità di markup eccede il valore massimo di %d; Markup: %s"
@@ -3057,7 +3077,7 @@ msgstr "spanner testuale non terminato"
 msgid "unterminated tie"
 msgstr "legatura di valore non terminata"
 
-#: tie-engraver.cc:373
+#: tie-engraver.cc:377
 msgid "lonely tie"
 msgstr "legatura di valore solitaria"
 
@@ -3071,7 +3091,7 @@ msgstr "legatura di valore solitaria"
 msgid "strange time signature found: %d/%d"
 msgstr "si è incontrato uno strano segno di tempo: %d/%d"
 
-#: translator-ctors.cc:65
+#: translator-ctors.cc:68
 #, c-format
 msgid "unknown translator: `%s'"
 msgstr "traduttore sconosciuto: «%s»"
@@ -3081,17 +3101,17 @@ msgstr "traduttore sconosciuto: «%s»"
 msgid "fatal error.  Couldn't find type: %s"
 msgstr "errore fatale. Impossibile trovare il tipo: %s"
 
-#: translator-group.cc:188
+#: translator-group.cc:187
 #, c-format
 msgid "cannot find: `%s'"
 msgstr "impossibile trovare: «%s»"
 
-#: translator.cc:320
+#: translator.cc:310
 #, c-format
 msgid "Two simultaneous %s events, junking this one"
 msgstr "Due eventi %s simultanei, si butta via questo"
 
-#: translator.cc:321
+#: translator.cc:311
 #, c-format
 msgid "Previous %s event here"
 msgstr "L'evento %s precedente sta qui"
@@ -3156,206 +3176,206 @@ msgstr "è già presente uno spanner terminato"
 msgid "giving up"
 msgstr "rinuncia"
 
-#: parser.yy:463 parser.yy:847 parser.yy:928 parser.yy:1150
+#: parser.yy:476 parser.yy:947 parser.yy:1028 parser.yy:1248
 msgid "bad expression type"
 msgstr "tipo d'espressione non corretto"
 
-#: parser.yy:759 parser.yy:1361 parser.yy:1406
+#: parser.yy:859 parser.yy:1458 parser.yy:1503
 msgid "not a context mod"
 msgstr "non è una modalità di contesto"
 
-#: parser.yy:954
+#: parser.yy:1054
 msgid "Missing music in \\score"
 msgstr "Nessuna musica trovata in \\score"
 
-#: parser.yy:991
+#: parser.yy:1091
 msgid "\\paper cannot be used in \\score, use \\layout instead"
 msgstr "non si può usare \\paper dentro \\score, usare \\layout al suo posto"
 
-#: parser.yy:1027
+#: parser.yy:1126
 msgid "Spurious expression in \\score"
 msgstr "Espressione spuria in \\score"
 
-#: parser.yy:1057
+#: parser.yy:1156
 msgid "need \\paper for paper block"
 msgstr "è necessario \\paper per il blocco \"paper\""
 
-#: parser.yy:1234
+#: parser.yy:1331
 msgid "music expected"
 msgstr "attesa la musica"
 
-#: parser.yy:1244 parser.yy:1278
+#: parser.yy:1341 parser.yy:1375
 msgid "unexpected post-event"
 msgstr "«post-event» inatteso"
 
-#: parser.yy:1286
+#: parser.yy:1383
 msgid "Ignoring non-music expression"
 msgstr "Si ignora l'espressione non musicale"
 
-#: parser.yy:1587
+#: parser.yy:1691
 msgid "not a symbol"
 msgstr "non è un simbolo"
 
-#: parser.yy:2337 parser.yy:2451 parser.yy:2464 parser.yy:2473
+#: parser.yy:2491 parser.yy:2605 parser.yy:2618 parser.yy:2627
 msgid "bad grob property path"
 msgstr "percorso sbagliato alla proprietà del «grob»"
 
-#: parser.yy:2431
+#: parser.yy:2585
 msgid "only \\consists and \\remove take non-string argument."
 msgstr "solo \\consists e \\remove prendono un argomento diverso da una stringa"
 
-#: parser.yy:2492
+#: parser.yy:2646
 msgid "bad context property path"
 msgstr "percorso sbagliato alla proprietà di contesto"
 
-#: parser.yy:2593
+#: parser.yy:2733
 msgid "simple string expected"
 msgstr "attesa una stringa semplice"
 
-#: parser.yy:2611
+#: parser.yy:2750
 msgid "symbol expected"
 msgstr "simbolo atteso"
 
-#: parser.yy:2747
+#: parser.yy:2886
 msgid "not a rhythmic event"
 msgstr "non è un evento ritmico"
 
-#: parser.yy:2797
+#: parser.yy:2936
 msgid "post-event expected"
 msgstr "atteso un post-event"
 
-#: parser.yy:2806 parser.yy:2811
+#: parser.yy:2945 parser.yy:2950
 msgid "have to be in Lyric mode for lyrics"
 msgstr "bisogna essere in modo \"Lyric\" per i testi"
 
-#: parser.yy:2887
+#: parser.yy:3026
 msgid "expecting string or post-event as script definition"
 msgstr "ci si aspetta una stringa o un post-event come definizione dello script"
 
-#: parser.yy:2991
+#: parser.yy:3130
 msgid "not an articulation"
 msgstr "non è un'articolazione"
 
-#: parser.yy:3063 parser.yy:3106
+#: parser.yy:3202 parser.yy:3245
 msgid "not a duration"
 msgstr "non è una durata"
 
-#: parser.yy:3127
+#: parser.yy:3266
 msgid "bass number expected"
 msgstr "atteso un numero di basso"
 
-#: parser.yy:3219
+#: parser.yy:3358
 msgid "have to be in Note mode for notes"
 msgstr "bisogna essere in modo \"Note\" per le note"
 
-#: parser.yy:3258
+#: parser.yy:3397
 msgid "have to be in Chord mode for chords"
 msgstr "bisogna essere in modo \"Chord\" per gli accordi"
 
-#: parser.yy:3301
+#: parser.yy:3440
 msgid "markup outside of text script or \\lyricmode"
 msgstr "testo fuori da una scritta testuale o da \\lyricmode"
 
-#: parser.yy:3306
+#: parser.yy:3445
 msgid "unrecognized string, not in text script or \\lyricmode"
 msgstr "stringa non riconosciuta, non si trova in una scritta testuale o in \\lyricmode"
 
-#: parser.yy:3458 parser.yy:3467
+#: parser.yy:3597 parser.yy:3606
 msgid "not an unsigned integer"
 msgstr "non è un intero non negativo"
 
-#: parser.yy:3541
+#: parser.yy:3693
 msgid "not a markup"
 msgstr "non è un markup"
 
-#: lexer.ll:192
+#: lexer.ll:193
 msgid "stray UTF-8 BOM encountered"
 msgstr "si è incontrato un segno BOM UTF-8 isolato"
 
-#: lexer.ll:195
+#: lexer.ll:196
 msgid "Skipping UTF-8 BOM"
 msgstr "Si ignora il BOM UTF-8"
 
-#: lexer.ll:247
+#: lexer.ll:248
 #, c-format
 msgid "Renaming input to: `%s'"
 msgstr "Si rinomina l'input in: «%s»"
 
-#: lexer.ll:264
+#: lexer.ll:265
 msgid "quoted string expected after \\version"
 msgstr "\\version deve essere seguito da una stringa compresa tra virgolette"
 
-#: lexer.ll:268
+#: lexer.ll:269
 msgid "quoted string expected after \\sourcefilename"
 msgstr "\\sourcefilename deve essere seguito da una stringa compresa tra virgolette"
 
-#: lexer.ll:272
+#: lexer.ll:273
 msgid "integer expected after \\sourcefileline"
 msgstr "\\sourcefileline deve essere seguito da un intero"
 
-#: lexer.ll:299
+#: lexer.ll:300
 msgid "\\maininput not allowed outside init files"
 msgstr "\\maininput non permesso fuori dai file di inizializzazione"
 
-#: lexer.ll:323
+#: lexer.ll:324
 #, c-format
 msgid "wrong or undefined identifier: `%s'"
 msgstr "indentificatore errato o non definito: «%s»"
 
-#: lexer.ll:348
+#: lexer.ll:349
 msgid "string expected after \\include"
 msgstr "stringa prevista dopo \\include"
 
-#: lexer.ll:358
+#: lexer.ll:359
 msgid "end quote missing"
 msgstr "mancano le virgolette di chiusura"
 
-#: lexer.ll:713
+#: lexer.ll:714
 msgid "EOF found inside a comment"
 msgstr "fine del file (EOF) trovata in un commento"
 
-#: lexer.ll:718
+#: lexer.ll:719
 msgid "EOF found inside string"
 msgstr "fine del file (EOF) trovata in una stringa"
 
-#: lexer.ll:733
+#: lexer.ll:734
 msgid "Unfinished main input"
 msgstr "Input principale non finito"
 
-#: lexer.ll:804
+#: lexer.ll:805
 #, c-format
 msgid "invalid character: `%s'"
 msgstr "carattere non valido: «%s»"
 
-#: lexer.ll:924
+#: lexer.ll:925
 #, c-format
 msgid "unknown escaped string: `\\%s'"
 msgstr "stringa di escape sconosciuta: «\\%s»"
 
-#: lexer.ll:944
+#: lexer.ll:945
 #, c-format
 msgid "undefined character or shorthand: %s"
 msgstr "carattere o abbreviazione non riconosciuti: %s"
 
-#: lexer.ll:1235
+#: lexer.ll:1236
 msgid "non-UTF-8 input"
 msgstr "input non UTF-8"
 
-#: lexer.ll:1279
+#: lexer.ll:1280
 #, c-format
 msgid "Invalid version string \"%s\""
 msgstr "Stringa di versione \"%s\" non valida"
 
-#: lexer.ll:1284
+#: lexer.ll:1285
 #, c-format
 msgid "file too old: %s (oldest supported: %s)"
 msgstr "file troppo vecchio: %s (il più vecchio che si può gestire è: %s)"
 
-#: lexer.ll:1285
+#: lexer.ll:1286
 msgid "consider updating the input with the convert-ly script"
 msgstr "si consideri di aggiornare l'input con lo script convert-ly"
 
-#: lexer.ll:1291
+#: lexer.ll:1292
 #, c-format
 msgid "program too old: %s (file requires: %s)"
 msgstr "programma troppo vecchio: %s (il file richiede: %s)"
@@ -3374,24 +3394,34 @@ msgstr "Invocazione di «~a»..."
 msgid "`~a' failed (~a)\n"
 msgstr "«~a» fallito (~a)\n"
 
-#: backend-library.scm:94
+#: backend-library.scm:108
 #, scheme-format
 msgid "Converting to `~a'...\n"
 msgstr "Conversione a «~a»...\n"
 
 #. Do not try to guess the name of the png file,
 #. GS produces PNG files like BASE-page%d.png.
-#: backend-library.scm:103
+#: backend-library.scm:118
 #, scheme-format
 msgid "Converting to ~a..."
 msgstr "Conversione a ~a..."
 
-#: backend-library.scm:141
+#: backend-library.scm:134
+#, scheme-format
+msgid "Copying to `~a'...\n"
+msgstr "Copia su «~a»...\n"
+
+#: backend-library.scm:200
+#, scheme-format
+msgid "Deleting `~a'...\n"
+msgstr "Eliminazione di «~a»...\n"
+
+#: backend-library.scm:219
 #, scheme-format
 msgid "Writing header field `~a' to `~a'..."
 msgstr "Scrittura del campo di intestazione «~a» in «~a»..."
 
-#: backend-library.scm:190
+#: backend-library.scm:268
 #, scheme-format
 msgid "missing stencil expression `~S'"
 msgstr "manca l'espressione di stencil «~S»"
@@ -3447,60 +3477,60 @@ msgstr "Impossibile ridefinire la classe di evento «~S»"
 msgid "Undefined parent event class `~S'"
 msgstr "Classe di evento genitore «~S» sconosciuta"
 
-#: define-markup-commands.scm:1062
+#: define-markup-commands.scm:1098
 msgid "no systems found in \\score markup, does it have a \\layout block?"
 msgstr "non si è trovato alcun sistema nell'oggetto markup in cui è inserito \\score: contiene un blocco \\layout?"
 
-#: define-markup-commands.scm:2886
+#: define-markup-commands.scm:2922
 #, scheme-format
 msgid "Cannot find glyph ~a"
 msgstr "Impossibile trovare il glifo ~a"
 
-#: define-markup-commands.scm:3362
+#: define-markup-commands.scm:3398
 #, scheme-format
 msgid "no brace found for point size ~S "
 msgstr "non c'è una graffa che abbia una dimensione di ~S punti"
 
-#: define-markup-commands.scm:3363
+#: define-markup-commands.scm:3399
 #, scheme-format
 msgid "defaulting to ~S pt"
 msgstr "si applica la dimensione predefinita ~S pt"
 
-#: define-markup-commands.scm:3615
+#: define-markup-commands.scm:3643
 #, scheme-format
 msgid "not a valid duration string: ~a"
 msgstr "non è una durata valida per la stringa: ~a"
 
-#: define-markup-commands.scm:3826
+#: define-markup-commands.scm:3854
 #, scheme-format
 msgid "not a valid duration string: ~a - ignoring"
 msgstr "non è una durata valida per la stringa: ~a -- si ignora"
 
-#: define-music-types.scm:797
+#: define-music-types.scm:803
 #, scheme-format
 msgid "symbol expected: ~S"
 msgstr "simbolo atteso: ~S"
 
-#: define-music-types.scm:800
+#: define-music-types.scm:806
 #, scheme-format
 msgid "cannot find music object: ~S"
 msgstr "impossibile trovare l'oggetto musicale: ~S"
 
-#: define-music-types.scm:820
+#: define-music-types.scm:826
 #, scheme-format
 msgid "bad make-music argument: ~S"
 msgstr "argomento di make-music non valido: ~S"
 
-#: define-note-names.scm:972
+#: define-note-names.scm:1000
 msgid "Select note names language."
 msgstr "Selezione della lingua dei nomi delle note."
 
-#: define-note-names.scm:978
+#: define-note-names.scm:1006
 #, scheme-format
 msgid "Using `~a' note names..."
 msgstr "Utilizzo di \"~a\" per i nomi delle note..."
 
-#: define-note-names.scm:981
+#: define-note-names.scm:1009
 #, scheme-format
 msgid "Could not find language `~a'.  Ignoring."
 msgstr "Impossibile trovare il linguaggio \"~a\".  Si ignora."
@@ -3540,12 +3570,12 @@ msgstr "impossibile trovare la descrizione per la proprietà \"~S\" (~S)"
 msgid "cannot find description for property ~S (~S)"
 msgstr "impossibile trovare la descrizione per la proprietà ~S (~S)"
 
-#: flag-styles.scm:162
+#: flag-styles.scm:155
 #, scheme-format
 msgid "flag stroke `~a' or `~a' not found"
 msgstr "tipo di coda uncinata sconosciuto: «~a» o «~a»"
 
-#: framework-eps.scm:108
+#: framework-eps.scm:112
 #, scheme-format
 msgid "Writing ~a..."
 msgstr "Scrittura di ~a..."
@@ -3570,7 +3600,7 @@ msgstr "impossibile realizzare l'integrazione ~S=~S"
 msgid "do not know how to embed font ~s ~s ~s"
 msgstr "non so come inserire il tipo di carattere ~s ~s ~s"
 
-#: framework-ps.scm:729
+#: framework-ps.scm:723
 msgid ""
 "\n"
 "The PostScript backend does not support the\n"
@@ -3618,20 +3648,20 @@ msgstr "Errore nella definizione delle travature. Previste (~S,~S), trovate ~S."
 msgid "Error in beam quanting.  Expected ~S 0, found ~S."
 msgstr "Errore nella definizione delle travature.  Previste ~S 0, trovate ~S."
 
-#: lily-library.scm:350
+#: lily-library.scm:333
 msgid "Music unsuitable for context-mod"
 msgstr "Musica non adatta per context-mod"
 
-#: lily-library.scm:405
+#: lily-library.scm:388
 #, scheme-format
 msgid "Cannot find context-def \\~a"
 msgstr "Impossibile trovare context-def \\~a"
 
-#: lily-library.scm:421
+#: lily-library.scm:404
 msgid "Music unsuitable for output-def"
 msgstr "Musica non adatta per output-def"
 
-#: lily-library.scm:921
+#: lily-library.scm:904
 msgid ""
 "Find the index between @var{start} and @var{end} (an integer)\n"
 "which produces the closest match to @var{target-val} if\n"
@@ -3641,51 +3671,51 @@ msgstr ""
 "che produca l'abbinamento più vicino al @var{target-val} quando\n"
 "applicato alla funzione @var{getter}."
 
-#: lily-library.scm:1015
+#: lily-library.scm:998
 #, scheme-format
 msgid "unknown unit: ~S"
 msgstr "unità sconosciuta: ~S"
 
-#: lily-library.scm:1040
+#: lily-library.scm:1023
 #, scheme-format
 msgid "no \\version statement found, please add~afor future compatibility"
 msgstr "dichiarazione di \\version assente; si aggiunga ~a per compatibilità futura"
 
-#: lily.scm:75
+#: lily.scm:93
 msgid "call-after-session used after session start"
 msgstr "call-after-session usato dopo l'inizio di una sessione"
 
-#: lily.scm:93
+#: lily.scm:111
 msgid "define-session used after session start"
 msgstr "define-session usato dopo l'inizio di una sessione"
 
-#: lily.scm:399
+#: lily.scm:417
 msgid "Using (ice-9 curried-definitions) module\n"
 msgstr "Utilizzazione del modulo (ice-9 curried-definitions)\n"
 
-#: lily.scm:402
+#: lily.scm:420
 msgid "Guile 1.8\n"
 msgstr "Guile 1.8\n"
 
-#: lily.scm:459
+#: lily.scm:477
 #, scheme-format
 msgid "cannot find: ~A"
 msgstr "impossibile trovare ~A"
 
-#: lily.scm:886
+#: lily.scm:903
 msgid "Success: compilation successfully completed"
 msgstr "Successo: compilazione completata con successo"
 
-#: lily.scm:887
+#: lily.scm:904
 msgid "Compilation completed with warnings or errors"
 msgstr "Compilazione completata con avvertimenti o errori"
 
-#: lily.scm:948
+#: lily.scm:965
 #, scheme-format
 msgid "job ~a terminated with signal: ~a"
 msgstr "il lavoro ~a è terminato col segnale ~a"
 
-#: lily.scm:951
+#: lily.scm:968
 #, scheme-format
 msgid ""
 "logfile ~a (exit ~a):\n"
@@ -3694,36 +3724,31 @@ msgstr ""
 "file di registro ~a (uscita ~a):\n"
 "~a"
 
-#: lily.scm:973 lily.scm:1062
+#: lily.scm:990 lily.scm:1079
 #, scheme-format
 msgid "failed files: ~S"
 msgstr "errore nei file: ~S"
 
-#: lily.scm:1053
+#: lily.scm:1070
 #, scheme-format
 msgid "Redirecting output to ~a..."
 msgstr "Redirezione dell'output verso ~a..."
 
-#: lily.scm:1072 ps-to-png.scm:66
+#: lily.scm:1089
 #, scheme-format
 msgid "Invoking `~a'...\n"
 msgstr "Chiamata di «~a»...\n"
 
-#: ly-syntax-constructors.scm:66
+#: ly-syntax-constructors.scm:27
 #, scheme-format
 msgid "~a function cannot return ~a"
 msgstr "la funzione ~a non può restituire ~a"
 
-#: ly-syntax-constructors.scm:76
+#: ly-syntax-constructors.scm:60
 #, scheme-format
 msgid "wrong type for argument ~a.  Expecting ~a, found ~s"
 msgstr "tipo di argomento errato per ~a. Previsto ~a, trovato ~s"
 
-#: ly-syntax-constructors.scm:200
-#, scheme-format
-msgid "Invalid property operation ~a"
-msgstr "Operazione di proprietà non valida: ~a"
-
 #: markup-macros.scm:331
 #, scheme-format
 msgid "Wrong number of arguments.  Expect: ~A, found ~A: ~S"
@@ -3763,67 +3788,77 @@ msgstr "altezza da invertire non presente nella scala; si ignora"
 msgid "negative replication count; ignoring"
 msgstr "conto di riproduzione negativo; si ignora"
 
-#: music-functions.scm:311
+#: music-functions.scm:319
 #, scheme-format
 msgid "invalid tremolo repeat count: ~a"
 msgstr "numero di ripetizioni di tremolo non valido: ~a"
 
-#: music-functions.scm:340
+#: music-functions.scm:348
 #, scheme-format
 msgid "unknown repeat type `~S': must be volta, unfold, percent, or tremolo"
 msgstr "tipo di ripetizione «~S» sconosciuto: deve essere volta, unfold, percent o tremolo"
 
-#: music-functions.scm:344
+#: music-functions.scm:352
 msgid "More alternatives than repeats.  Junking excess alternatives"
 msgstr "Più alternative che ripetizioni.  Vengono tralasciate le alternative in eccesso"
 
-#: music-functions.scm:480
+#: music-functions.scm:487
 #, scheme-format
 msgid "bad grob property path ~a"
 msgstr "percorso sbagliato alla proprietà del «grob»: ~a"
 
-#: music-functions.scm:779
+#: music-functions.scm:511
+#, scheme-format
+msgid "bad context property ~a"
+msgstr "proprietà di contesto ~a sbagliata"
+
+#: music-functions.scm:534
+#, scheme-format
+msgid "bad music property ~a"
+msgstr "proprietà ~a della musica sbagliata"
+
+#: music-functions.scm:840
 msgid "Bad chord repetition"
 msgstr "Ripetizione di accordi sbagliata"
 
-#: music-functions.scm:884
+#: music-functions.scm:945
 #, scheme-format
 msgid "music expected: ~S"
 msgstr "musica attesa: ~S"
 
-#: music-functions.scm:1226
+#: music-functions.scm:1295
 #, scheme-format
 msgid "cannot find quoted music: `~S'"
 msgstr "impossibile trovare la musica citata: «~S»"
 
-#: music-functions.scm:1366
+#: music-functions.scm:1432
 msgid "Add @var{octave-shift} to the octave of @var{pitch}."
 msgstr "Aggiungere @var{octave-shift} all'ottava di @var{altezza}."
 
-#: music-functions.scm:1429
+#: music-functions.scm:1495
 #, scheme-format
 msgid "Unknown octaveness type: ~S "
 msgstr "Tipo di ottava sconosciuto: ~S "
 
-#: music-functions.scm:1430
+#: music-functions.scm:1496
 msgid "Defaulting to 'any-octave."
 msgstr "Applicazione del valore predefinito 'any-octave."
 
-#: music-functions.scm:1822
+#: music-functions.scm:1888
 #, scheme-format
 msgid "unknown accidental style: ~S"
 msgstr "stile di alterazione sconosciuto: ~S"
 
-#: music-functions.scm:2040
+#: music-functions.scm:2098
 msgid "Missing duration"
 msgstr "Durata mancante"
 
-#: music-functions.scm:2549
+#: music-functions.scm:2626
 #, scheme-format
 msgid "not a symbol list: ~a"
 msgstr "non è una lista di simboli: ~a"
 
-#: music-functions.scm:2552
+#: music-functions.scm:2629
 #, scheme-format
 msgid "conflicting tag group ~a"
 msgstr "gruppo di etichette (tag) ~a in conflitto"
@@ -3852,23 +3887,23 @@ msgstr "Un glifo deve avere un valore unicode"
 msgid "cannot find SVG font ~S"
 msgstr "impossibile trovare il tipo di carattere SVG ~S"
 
-#: paper.scm:122
+#: paper.scm:121
 msgid "set-global-staff-size: not in toplevel scope"
 msgstr "set-global-staff-size: non è nell'ambito di livello più alto"
 
-#: paper.scm:322
+#: paper.scm:321
 #, scheme-format
 msgid "This is not a \\layout {} object, ~S"
 msgstr "Questo non è un oggetto \\layout {}, ~S"
 
-#: paper.scm:330
+#: paper.scm:329
 #, scheme-format
 msgid "Unknown paper size: ~a"
 msgstr "Dimensione del foglio sconosciuta: ~a"
 
 #. TODO: should raise (generic) exception with throw, and catch
 #. that in parse-scm.cc
-#: paper.scm:349
+#: paper.scm:348
 msgid "Must use #(set-paper-size .. ) within \\paper { ... }"
 msgstr "Si deve usare #(set-paper-size .. ) all'interno di \\paper { ... }"
 
@@ -3882,19 +3917,24 @@ msgstr "tipo di chiave sconosciuto «~a»"
 msgid "supported clefs: ~a"
 msgstr "chiavi supportate: ~a"
 
-#: parser-ly-from-scheme.scm:74
+#: parser-ly-from-scheme.scm:73
 msgid "error in #{ ... #}"
 msgstr "errore in #{ ... #}"
 
-#: part-combiner.scm:748
+#: part-combiner.scm:894
 #, scheme-format
 msgid "quoted music `~a' is empty"
 msgstr "la musica quotata «~a» è vuota"
 
-#: ps-to-png.scm:70
+#: ps-to-png.scm:72 ps-to-png.scm:75
+#, scheme-format
+msgid "Copying `~a' to `~a'..."
+msgstr "Copia di «~a» su «~a»..."
+
+#: ps-to-png.scm:77 ps-to-png.scm:79
 #, scheme-format
-msgid "~a exited with status: ~S"
-msgstr "~a è terminato con stato ~S"
+msgid "Deleting `~a'..."
+msgstr "Eliminazione di di ~a..."
 
 #: to-xml.scm:190
 #, scheme-format
index 6bc2060218cfe6773cb9617eb87ebfc9d209faa5..b616c043bcb8b322d1473c04bbcf32cb5e1351eb 100644 (file)
@@ -6,10 +6,10 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: lilypond 2.19.24\n"
+"Project-Id-Version: lilypond 2.19.26\n"
 "Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu."
 "lilypond.bugs\n"
-"POT-Creation-Date: 2015-07-26 11:43+0100\n"
+"POT-Creation-Date: 2015-08-27 10:48+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -545,7 +545,7 @@ msgstr ""
 #: convertrules.py:2820
 msgid ""
 "oldaddlyrics is no longer supported. \n"
-"         Use addlyrics or lyrsicsto instead.\n"
+"         Use addlyrics or lyricsto instead.\n"
 msgstr ""
 
 #: convertrules.py:2826
@@ -889,41 +889,41 @@ msgstr ""
 msgid "Unable to find instrument for ID=%s\n"
 msgstr ""
 
-#: abc2ly.py:1386 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044
+#: abc2ly.py:1389 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044
 #, python-format
 msgid "%s [OPTION]... FILE"
 msgstr ""
 
-#: abc2ly.py:1387
+#: abc2ly.py:1390
 #, python-format
 msgid ""
 "abc2ly converts ABC music files (see\n"
 "%s) to LilyPond input.\n"
 msgstr ""
 
-#: abc2ly.py:1395 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231
+#: abc2ly.py:1398 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231
 #: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:184
 msgid "show version number and exit"
 msgstr ""
 
-#: abc2ly.py:1398 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140
+#: abc2ly.py:1401 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140
 #: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:163
 msgid "show this help and exit"
 msgstr ""
 
-#: abc2ly.py:1401 etf2ly.py:1209 midi2ly.py:1071
+#: abc2ly.py:1404 etf2ly.py:1209 midi2ly.py:1071
 msgid "write output to FILE"
 msgstr ""
 
-#: abc2ly.py:1404
+#: abc2ly.py:1407
 msgid "be strict about success"
 msgstr ""
 
-#: abc2ly.py:1407
+#: abc2ly.py:1410
 msgid "preserve ABC's notion of beams"
 msgstr ""
 
-#: abc2ly.py:1410
+#: abc2ly.py:1413
 msgid "suppress progress messages"
 msgstr ""
 
@@ -931,7 +931,7 @@ msgstr ""
 #. "Report bugs in English via %s",
 #. or if there is a LilyPond users list or forum in your language
 #. "Report bugs in English via %s or in YOUR_LANG via URI"
-#: abc2ly.py:1413 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258
+#: abc2ly.py:1416 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258
 #: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:318
 #, c-format, python-format
 msgid "Report bugs via %s"
@@ -1128,7 +1128,7 @@ msgstr ""
 
 #: lilypond-book.py:157
 msgid ""
-"pad left side of music to align music inspite of uneven bar numbers (in mm)"
+"pad left side of music to align music in spite of uneven bar numbers (in mm)"
 msgstr ""
 
 #: lilypond-book.py:162
@@ -1772,7 +1772,7 @@ msgstr ""
 msgid "not changing to same context type: %s"
 msgstr ""
 
-#. FIXME: uncomprehensable message
+#. FIXME: incomprehensible message
 #: change-iterator.cc:82
 msgid "none of these in my family"
 msgstr ""
@@ -1894,22 +1894,22 @@ msgstr ""
 msgid "unterminated extender"
 msgstr ""
 
-#: flag.cc:134
+#: flag.cc:133
 #, c-format
 msgid "flag `%s' not found"
 msgstr ""
 
-#: flag.cc:154
+#: flag.cc:153
 #, c-format
 msgid "flag stroke `%s' not found"
 msgstr ""
 
-#: font-config-scheme.cc:151 font-config.cc:48
+#: font-config-scheme.cc:151 font-config.cc:82
 #, c-format
 msgid "failed adding font directory: %s"
 msgstr ""
 
-#: font-config-scheme.cc:153 font-config.cc:50
+#: font-config-scheme.cc:153 font-config.cc:84
 #, c-format
 msgid "Adding font directory: %s"
 msgstr ""
@@ -1928,17 +1928,17 @@ msgstr ""
 msgid "Initializing FontConfig..."
 msgstr ""
 
-#: font-config.cc:57
+#: font-config.cc:70
 #, c-format
-msgid "failed adding fontconfig configuration file: %s"
+msgid "failed to add fontconfig configuration file `%s'"
 msgstr ""
 
-#: font-config.cc:60
+#: font-config.cc:73
 #, c-format
 msgid "Adding fontconfig configuration file: %s"
 msgstr ""
 
-#: font-config.cc:63
+#: font-config.cc:86
 msgid "Building font database..."
 msgstr ""
 
@@ -2054,12 +2054,12 @@ msgstr ""
 msgid "Incomplete keyAlterationOrder for key signature"
 msgstr ""
 
-#: key-signature-interface.cc:78
+#: key-signature-interface.cc:77
 #, c-format
 msgid "No glyph found for alteration: %s"
 msgstr ""
 
-#: key-signature-interface.cc:88
+#: key-signature-interface.cc:87
 msgid "alteration not found"
 msgstr ""
 
@@ -2136,6 +2136,11 @@ msgstr ""
 msgid "%s:EOF"
 msgstr ""
 
+#: lily-modules.cc:81
+#, c-format
+msgid "Uninitialized variable `%s' in module (%s)"
+msgstr ""
+
 #: lily-parser-scheme.cc:80
 #, c-format
 msgid "Changing working directory to: `%s'"
@@ -2172,7 +2177,7 @@ msgstr ""
 msgid "Parsing..."
 msgstr ""
 
-#: lookup.cc:181
+#: lookup.cc:178
 #, c-format
 msgid "Not drawing a box with negative dimension, %.2f by %.2f."
 msgstr ""
@@ -2735,11 +2740,11 @@ msgstr ""
 msgid "unterminated percent repeat"
 msgstr ""
 
-#: performance.cc:55
+#: performance.cc:76
 msgid "Track..."
 msgstr ""
 
-#: performance.cc:90
+#: performance.cc:126
 #, c-format
 msgid "MIDI output to `%s'..."
 msgstr ""
@@ -2774,25 +2779,25 @@ msgstr ""
 msgid "Failed octave check, got: "
 msgstr ""
 
-#: relocate.cc:52
+#: relocate.cc:56
 #, c-format
 msgid "Setting %s to %s"
 msgstr ""
 
 #. this warning should only be printed in debug mode!
-#: relocate.cc:73
+#: relocate.cc:77
 #, c-format
 msgid "no such file: %s for %s"
 msgstr ""
 
 #. this warning should only be printed in debug mode!
 #. this warning should only be printed in debug mode
-#: relocate.cc:84 relocate.cc:102
+#: relocate.cc:88 relocate.cc:106
 #, c-format
 msgid "no such directory: %s for %s"
 msgstr ""
 
-#: relocate.cc:93
+#: relocate.cc:97
 #, c-format
 msgid "%s=%s (prepend)\n"
 msgstr ""
@@ -3098,115 +3103,115 @@ msgstr ""
 msgid "giving up"
 msgstr ""
 
-#: parser.yy:476 parser.yy:907 parser.yy:988 parser.yy:1208
+#: parser.yy:476 parser.yy:947 parser.yy:1028 parser.yy:1248
 msgid "bad expression type"
 msgstr ""
 
-#: parser.yy:819 parser.yy:1418 parser.yy:1463
+#: parser.yy:859 parser.yy:1458 parser.yy:1503
 msgid "not a context mod"
 msgstr ""
 
-#: parser.yy:1014
+#: parser.yy:1054
 msgid "Missing music in \\score"
 msgstr ""
 
-#: parser.yy:1051
+#: parser.yy:1091
 msgid "\\paper cannot be used in \\score, use \\layout instead"
 msgstr ""
 
-#: parser.yy:1086
+#: parser.yy:1126
 msgid "Spurious expression in \\score"
 msgstr ""
 
-#: parser.yy:1116
+#: parser.yy:1156
 msgid "need \\paper for paper block"
 msgstr ""
 
-#: parser.yy:1291
+#: parser.yy:1331
 msgid "music expected"
 msgstr ""
 
-#: parser.yy:1301 parser.yy:1335
+#: parser.yy:1341 parser.yy:1375
 msgid "unexpected post-event"
 msgstr ""
 
-#: parser.yy:1343
+#: parser.yy:1383
 msgid "Ignoring non-music expression"
 msgstr ""
 
-#: parser.yy:1643
+#: parser.yy:1691
 msgid "not a symbol"
 msgstr ""
 
-#: parser.yy:2443 parser.yy:2557 parser.yy:2570 parser.yy:2579
+#: parser.yy:2491 parser.yy:2605 parser.yy:2618 parser.yy:2627
 msgid "bad grob property path"
 msgstr ""
 
-#: parser.yy:2537
+#: parser.yy:2585
 msgid "only \\consists and \\remove take non-string argument."
 msgstr ""
 
-#: parser.yy:2598
+#: parser.yy:2646
 msgid "bad context property path"
 msgstr ""
 
-#: parser.yy:2694
+#: parser.yy:2733
 msgid "simple string expected"
 msgstr ""
 
-#: parser.yy:2711
+#: parser.yy:2750
 msgid "symbol expected"
 msgstr ""
 
-#: parser.yy:2847
+#: parser.yy:2886
 msgid "not a rhythmic event"
 msgstr ""
 
-#: parser.yy:2897
+#: parser.yy:2936
 msgid "post-event expected"
 msgstr ""
 
-#: parser.yy:2906 parser.yy:2911
+#: parser.yy:2945 parser.yy:2950
 msgid "have to be in Lyric mode for lyrics"
 msgstr ""
 
-#: parser.yy:2987
+#: parser.yy:3026
 msgid "expecting string or post-event as script definition"
 msgstr ""
 
-#: parser.yy:3091
+#: parser.yy:3130
 msgid "not an articulation"
 msgstr ""
 
-#: parser.yy:3163 parser.yy:3206
+#: parser.yy:3202 parser.yy:3245
 msgid "not a duration"
 msgstr ""
 
-#: parser.yy:3227
+#: parser.yy:3266
 msgid "bass number expected"
 msgstr ""
 
-#: parser.yy:3319
+#: parser.yy:3358
 msgid "have to be in Note mode for notes"
 msgstr ""
 
-#: parser.yy:3358
+#: parser.yy:3397
 msgid "have to be in Chord mode for chords"
 msgstr ""
 
-#: parser.yy:3401
+#: parser.yy:3440
 msgid "markup outside of text script or \\lyricmode"
 msgstr ""
 
-#: parser.yy:3406
+#: parser.yy:3445
 msgid "unrecognized string, not in text script or \\lyricmode"
 msgstr ""
 
-#: parser.yy:3558 parser.yy:3567
+#: parser.yy:3597 parser.yy:3606
 msgid "not an unsigned integer"
 msgstr ""
 
-#: parser.yy:3654
+#: parser.yy:3693
 msgid "not a markup"
 msgstr ""
 
@@ -3404,31 +3409,31 @@ msgstr ""
 msgid "Undefined parent event class `~S'"
 msgstr ""
 
-#: define-markup-commands.scm:1089
+#: define-markup-commands.scm:1098
 msgid "no systems found in \\score markup, does it have a \\layout block?"
 msgstr ""
 
-#: define-markup-commands.scm:2913
+#: define-markup-commands.scm:2922
 #, scheme-format
 msgid "Cannot find glyph ~a"
 msgstr ""
 
-#: define-markup-commands.scm:3389
+#: define-markup-commands.scm:3398
 #, scheme-format
 msgid "no brace found for point size ~S "
 msgstr ""
 
-#: define-markup-commands.scm:3390
+#: define-markup-commands.scm:3399
 #, scheme-format
 msgid "defaulting to ~S pt"
 msgstr ""
 
-#: define-markup-commands.scm:3642
+#: define-markup-commands.scm:3643
 #, scheme-format
 msgid "not a valid duration string: ~a"
 msgstr ""
 
-#: define-markup-commands.scm:3853
+#: define-markup-commands.scm:3854
 #, scheme-format
 msgid "not a valid duration string: ~a - ignoring"
 msgstr ""
@@ -3448,16 +3453,16 @@ msgstr ""
 msgid "bad make-music argument: ~S"
 msgstr ""
 
-#: define-note-names.scm:972
+#: define-note-names.scm:1000
 msgid "Select note names language."
 msgstr ""
 
-#: define-note-names.scm:978
+#: define-note-names.scm:1006
 #, scheme-format
 msgid "Using `~a' note names..."
 msgstr ""
 
-#: define-note-names.scm:981
+#: define-note-names.scm:1009
 #, scheme-format
 msgid "Could not find language `~a'.  Ignoring."
 msgstr ""
@@ -3497,7 +3502,7 @@ msgstr ""
 msgid "cannot find description for property ~S (~S)"
 msgstr ""
 
-#: flag-styles.scm:162
+#: flag-styles.scm:155
 #, scheme-format
 msgid "flag stroke `~a' or `~a' not found"
 msgstr ""
@@ -3563,32 +3568,32 @@ msgstr ""
 msgid "Error in beam quanting.  Expected ~S 0, found ~S."
 msgstr ""
 
-#: lily-library.scm:344
+#: lily-library.scm:333
 msgid "Music unsuitable for context-mod"
 msgstr ""
 
-#: lily-library.scm:399
+#: lily-library.scm:388
 #, scheme-format
 msgid "Cannot find context-def \\~a"
 msgstr ""
 
-#: lily-library.scm:415
+#: lily-library.scm:404
 msgid "Music unsuitable for output-def"
 msgstr ""
 
-#: lily-library.scm:915
+#: lily-library.scm:904
 msgid ""
 "Find the index between @var{start} and @var{end} (an integer)\n"
 "which produces the closest match to @var{target-val} if\n"
 "applied to function @var{getter}."
 msgstr ""
 
-#: lily-library.scm:1009
+#: lily-library.scm:998
 #, scheme-format
 msgid "unknown unit: ~S"
 msgstr ""
 
-#: lily-library.scm:1034
+#: lily-library.scm:1023
 #, scheme-format
 msgid "no \\version statement found, please add~afor future compatibility"
 msgstr ""
@@ -3659,11 +3664,6 @@ msgstr ""
 msgid "wrong type for argument ~a.  Expecting ~a, found ~s"
 msgstr ""
 
-#: ly-syntax-constructors.scm:229
-#, scheme-format
-msgid "Invalid property operation ~a"
-msgstr ""
-
 #: markup-macros.scm:331
 #, scheme-format
 msgid "Wrong number of arguments.  Expect: ~A, found ~A: ~S"
@@ -3727,48 +3727,53 @@ msgstr ""
 msgid "bad context property ~a"
 msgstr ""
 
-#: music-functions.scm:812
+#: music-functions.scm:534
+#, scheme-format
+msgid "bad music property ~a"
+msgstr ""
+
+#: music-functions.scm:840
 msgid "Bad chord repetition"
 msgstr ""
 
-#: music-functions.scm:917
+#: music-functions.scm:945
 #, scheme-format
 msgid "music expected: ~S"
 msgstr ""
 
-#: music-functions.scm:1267
+#: music-functions.scm:1295
 #, scheme-format
 msgid "cannot find quoted music: `~S'"
 msgstr ""
 
-#: music-functions.scm:1404
+#: music-functions.scm:1432
 msgid "Add @var{octave-shift} to the octave of @var{pitch}."
 msgstr ""
 
-#: music-functions.scm:1467
+#: music-functions.scm:1495
 #, scheme-format
 msgid "Unknown octaveness type: ~S "
 msgstr ""
 
-#: music-functions.scm:1468
+#: music-functions.scm:1496
 msgid "Defaulting to 'any-octave."
 msgstr ""
 
-#: music-functions.scm:1860
+#: music-functions.scm:1888
 #, scheme-format
 msgid "unknown accidental style: ~S"
 msgstr ""
 
-#: music-functions.scm:2069
+#: music-functions.scm:2098
 msgid "Missing duration"
 msgstr ""
 
-#: music-functions.scm:2578
+#: music-functions.scm:2626
 #, scheme-format
 msgid "not a symbol list: ~a"
 msgstr ""
 
-#: music-functions.scm:2581
+#: music-functions.scm:2629
 #, scheme-format
 msgid "conflicting tag group ~a"
 msgstr ""
index fd33dce1d162e6b3a0f0f12e59dd22398e8749ce..03670e02cc304b221be5a5730a412b948ca7a4a2 100644 (file)
@@ -2818,7 +2818,7 @@ def conv(str):
     if re.search(r'\\oldaddlyrics', str):
         stderr_write (NOT_SMART % "oldaddlyrics")
         stderr_write (_ ("oldaddlyrics is no longer supported. \n \
-        Use addlyrics or lyrsicsto instead.\n"))
+        Use addlyrics or lyricsto instead.\n"))
         stderr_write (UPDATE_MANUALLY)
         raise FatalConversionError ()
     return str
index 8649a67117190ed03523651b06dd0002d5e16859..fc8c86c5a3241095e2eaf408abccd3130442561a 100644 (file)
@@ -1146,9 +1146,11 @@ if the grob is visible.  A number sets the thickness of the outline as a
 multiple of the staff-line thickness.  For compatibility with former
 behavior (now available with @code{whiteout-box}) the value @code{#t} is
 treated as @code{3.0}.  Usually @code{#f} by default.")
-     (whiteout-box ,boolean? "If true, the grob is printed over a
-rounded rectangular white background to white-out underlying material,
-if the grob is visible.  Usually @code{#f} by default.")
+     (whiteout-box ,boolean-or-number? "If a number or true, the grob
+is printed over a rectangular white background to white-out underlying
+material, if the grob is visible.  A number indicates how far the
+outline extends beyond the bounding box of the grob as a multiple of
+the staff-line thickness.  Usually @code{#f} by default.")
      (width ,ly:dimension? "The width of a grob measured in staff
 space.")
      (word-space ,ly:dimension? "Space to insert between words in
index d7c0f22e469c0a6093288a4eaa8a58395b1eabc6..505ca246c7bf6e6489f47b9f4351e6ce9c2f58e3 100644 (file)
@@ -509,6 +509,16 @@ in the PDF backend.
 
     (ly:stencil-add (ly:make-stencil link-expr xextent yextent) stil)))
 
+(define-public (book-first-page layout props)
+  "Return the @code{'first-page-number} of the entire book"
+  (define (ancestor layout)
+    "Return the topmost layout ancestor"
+    (let ((parent (ly:output-def-parent layout)))
+      (if (not (ly:output-def? parent))
+          layout
+          (ancestor parent))))
+  (ly:output-def-lookup (ancestor layout) 'first-page-number))
+
 (define-markup-command (with-link layout props label arg)
   (symbol? markup?)
   #:category other
@@ -536,8 +546,7 @@ only works in the PDF backend.
                           (if (list? table)
                               (assoc-get label table)
                               #f))
-                        (first-page-number
-                          (ly:output-def-lookup layout 'first-page-number))
+                        (first-page-number (book-first-page layout props))
                         (current-page-number
                           (if table-page-number
                               (1+ (- table-page-number first-page-number))
@@ -734,19 +743,23 @@ Provide a white background for @var{arg}.
 (define-markup-command (whiteout-box layout props arg)
   (markup?)
   #:category other
+  #:properties ((thickness 0))
   "
-@cindex adding a rounded rectangular white background to text
+@cindex adding a rectangular white background to text
 
-Provide a rounded rectangular white background for @var{arg}.
+Provide a rectangular white background for @var{arg}.
 
 @lilypond[verbatim,quote]
 \\markup {
   \\combine
     \\filled-box #'(-1 . 10) #'(-3 . 4) #1
-    \\whiteout-box whiteout-box
+    \\override #'(thickness . 1.5) \\whiteout-box whiteout-box
 }
 @end lilypond"
-  (stencil-whiteout-box (interpret-markup layout props arg)))
+  (stencil-whiteout-box
+    (interpret-markup layout props arg)
+      (* thickness
+        (ly:output-def-lookup layout 'line-thickness))))
 
 (define-markup-command (pad-markup layout props amount arg)
   (number? markup?)
@@ -3495,18 +3508,10 @@ Supported flag-styles are @code{default}, @code{old-straight-flag},
            (thickness-offset (cons 0 (* -1 thickness dir)))
            (spacing (* -1 flag-spacing factor dir))
            (start (cons (- half-stem-thickness) (* half-stem-thickness dir)))
-           ;; The points of a round-filled-polygon need to be given in
-           ;; clockwise order, otherwise the polygon will be enlarged by
-           ;; blot-size*2!
-           (points (if stem-up
-                       (list start
-                             flag-end
-                             (offset-add flag-end thickness-offset)
-                             (offset-add start thickness-offset))
-                       (list start
-                             (offset-add start thickness-offset)
-                             (offset-add flag-end thickness-offset)
-                             flag-end)))
+           (points (list start
+                         flag-end
+                         (offset-add flag-end thickness-offset)
+                         (offset-add start thickness-offset)))
            (stencil (ly:round-filled-polygon points half-stem-thickness))
            ;; Log for 1/8 is 3, so we need to subtract 3
            (flag-stencil (buildflags stencil (- log 3) stencil spacing)))
index c1ee87bbf89b85d552ca5bb39e26fe2d043ae4c2..0b9cb54fbb713ff5a9df2601cb6c0667ab261a74 100644 (file)
@@ -1119,7 +1119,10 @@ Otherwise, return #f."
                                  elements ((music 'ContextSpeccedMusic
                                                   context-id "up"
                                                   context-type 'Staff
-                                                  element (music 'SimultaneousMusic elements (?ac-music)))
+                                                  element ?ac-music)
+                                           (music 'ContextSpeccedMusic
+                                                  context-id "up"
+                                                  context-type 'Staff)
                                            (music 'ContextSpeccedMusic
                                                   context-id "down"
                                                   context-type 'Staff))))
index 01fe315da0daf7c97c6a83e2d957319c4835c025..2b52f44cb23516eb2ce7924dda97ac37b376231c 100644 (file)
@@ -90,17 +90,10 @@ All lengths are scaled according to the font size of the note."
            (thickness-offset (cons 0 (* -1 thickness dir)))
            (spacing (* -1 flag-spacing factor dir ))
            (start (cons (- half-stem-thickness) (* half-stem-thickness dir)))
-           ;; The points of a round-filled-polygon need to be given in clockwise
-           ;; order, otherwise the polygon will be enlarged by blot-size*2!
-           (points (if stem-up
-                       (list start
-                             flag-end
-                             (offset-add flag-end thickness-offset)
-                             (offset-add start thickness-offset))
-                       (list start
-                             (offset-add start thickness-offset)
-                             (offset-add flag-end thickness-offset)
-                             flag-end)))
+           (points (list start
+                         flag-end
+                         (offset-add flag-end thickness-offset)
+                         (offset-add start thickness-offset)))
            (stencil (ly:round-filled-polygon points half-stem-thickness))
            ;; Log for 1/8 is 3, so we need to subtract 3
            (flag-stencil (buildflag stencil (- log 3) stencil spacing))
index cad14c9ec531cfd9b90a34712b3f4f45698a5087..5adf258831ce73c49593b1cecf0b2ed9a0775770 100644 (file)
@@ -251,8 +251,8 @@ used.  This is used to select the proper design size for the text fonts.
 ; 'typewriter.
 ;
 ; Note that 'LilyPond Serif', 'LilyPond Sans Serif' and 'Lilypond Monospace'
-; are aliases that are defined in mf/lilypond-fonts.conf.in (source file)
-; or fonts/lilypond-fonts.conf (installed file).
+; are aliases that are defined in mf/00-lilypond-fonts.conf.in (source file)
+; or fonts/00-lilypond-fonts.conf (installed file).
 
 (define*-public (set-global-fonts #:key 
   (music "emmentaler")
index 96c584d34f384cc110dd4278ceecf8b23dfb34a3..60d7bb3fc04caf32994f3d55b48f24879fb63848 100644 (file)
       (if val
           (format port "/~a (~a)\n" field (metadata-encode (markup->string val (list header)))))))
   (display "[ " port)
-  (metadata-lookup-output 'pdfcomposer 'composer "Author")
+  (metadata-lookup-output 'pdfauthor 'author "Author")
   (format port "/Creator (LilyPond ~a)\n" (lilypond-version))
   (metadata-lookup-output 'pdftitle 'title "Title")
   (metadata-lookup-output 'pdfsubject 'subject "Subject")
index 041d180c04ddb6d624283e729b3937c1bc66274e..85cfbb9b3679c0a01677e288c9a4d28e6f0c44f1 100644 (file)
@@ -44,7 +44,15 @@ to end-point."
 
 (define (get-numeric-from-key keystring)
   "Get the numeric value from a key of the form k:val"
-  (string->number (substring keystring 2 (string-length keystring))))
+  (let* ((entry (substring keystring 2 (string-length keystring)))
+         (numeric-entry (string->number entry)))
+    ;; throw an error, if `entry' can't be transformed into a number
+    (if numeric-entry
+        numeric-entry
+        (ly:error
+          "Unhandled entry in fret-diagram \"~a\" in \"~a\""
+          entry
+          keystring))))
 
 (define (numerify mylist)
   "Convert string values to numeric or character"
@@ -245,7 +253,11 @@ with magnification @var{mag} of the string @var{text}."
              ((or (eq? my-code 'open)(eq? my-code 'mute))
               (set! xo-list (cons* my-item xo-list)))
              ((eq? my-code 'barre)
-              (set! barre-list (cons* (cdr my-item) barre-list)))
+              (if (every number? (cdr my-item))
+                  (set! barre-list (cons* (cdr my-item) barre-list))
+                  (ly:error
+                    "barre-indications should contain only numbers: ~a"
+                    (cdr my-item))))
              ((eq? my-code 'capo)
               (set! capo-fret (cadr my-item)))
              ((eq? my-code 'place-fret)
@@ -923,7 +935,9 @@ a fret-indication list with the appropriate values"
          (output-list '())
          (new-props '())
          (details (merge-details 'fret-diagram-details props '()))
-         (items (string-split definition-string #\;)))
+         ;; remove whitespace-characters from definition-string
+         (cleared-string (remove-whitespace definition-string))
+         (items (string-split cleared-string #\;)))
     (let parse-item ((myitems items))
       (if (not (null? (cdr myitems)))
           (let ((test-string (car myitems)))
@@ -959,7 +973,15 @@ a fret-indication list with the appropriate values"
                        (set! details
                              (acons 'dot-position dot-position details))))
               (else
-               (let ((this-list (string-split test-string #\-)))
+               (let* ((this-list (string-split test-string #\-))
+                      (fret-number (string->number (car this-list))))
+                 ;; If none of the above applies, `fret-number' needs to be a
+                 ;; number. Throw an error, if not.
+                 (if (not fret-number)
+                   (ly:error
+                     "Unhandled entry in fret-diagrams \"~a\" in \"~a\""
+                     (car this-list)
+                     test-string))
                  (if (string->number (cadr this-list))
                      (set! output-list
                            (cons-fret
@@ -968,11 +990,11 @@ a fret-indication list with the appropriate values"
                      (if (equal? (cadr this-list) "x" )
                          (set! output-list
                                (cons-fret
-                                (list 'mute (string->number (car this-list)))
+                                (list 'mute fret-number)
                                 output-list))
                          (set! output-list
                                (cons-fret
-                                (list 'open (string->number (car this-list)))
+                                (list 'open fret-number)
                                 output-list)))))))
             (parse-item (cdr myitems)))))
     ;; add the modified details
index a6c93774d3a8a581af2666d5f67bf828ec4db495..9365f0a034f42294cc47dfe290c738a77fb0841f 100644 (file)
@@ -132,6 +132,7 @@ spacing after the divider).
            stencils)))
 
 ;; Parse the harp pedal definition string into list of directions (-1/0/1), #\o and #\|
+;; Whitespace is removed from definition string before the procedure applies.
 (define (harp-pedals-parse-string definition-string)
   "Parse a harp pedals diagram string and return a list containing 1, 0, -1, #\\o or #\\|"
   (map (lambda (c)
@@ -141,7 +142,7 @@ spacing after the divider).
            ((#\-) 0)
            ((#\| #\o) c)
            (else c)))
-       (string->list definition-string)))
+       (string->list (remove-whitespace definition-string))))
 
 
 ;; Analyze the pedal-list: Return (pedalcount . (divider positions))
index d413aceca5a3fb3dc670aec491f991a1b4355486..c5bf8cc59de12066e1f4bbf7e6aa88e321ef883e 100644 (file)
@@ -786,6 +786,12 @@ as rectangular coordinates @ode{(x-length . y-length)}."
 (define-public (string-startswith s prefix)
   (equal? prefix (substring s 0 (min (string-length s) (string-length prefix)))))
 
+(define-public (remove-whitespace strg)
+"Remove characters satisfying @code{char-whitespace?} from string @var{strg}"
+  (string-delete
+    strg
+    char-whitespace?))
+
 (define-public (string-encode-integer i)
   (cond
    ((= i  0) "o")
@@ -1022,3 +1028,10 @@ print a warning and set an optional @var{default}."
    (ly:format "~a:1" input-file-name)
    (_ "no \\version statement found, please add~afor future compatibility")
    (format #f "\n\n\\version ~s\n\n" (lilypond-version))))
+
+(define-public (output-module? module)
+  "Returns @code{#t} if @var{module} belongs to an output module
+usually carrying context definitions (@code{\\midi} or
+@code{\\layout})."
+  (or (module-ref module 'is-midi #f)
+      (module-ref module 'is-layout #f)))
index 09ab0fc8f243dbf991f096da29c2b5f1259fa4fd..6c50ec51280e614796229fd565401b9474d16d07 100644 (file)
@@ -236,11 +236,11 @@ interpreted, returns a list of stencils instead of a single one"
 ;;;;;;;;;;;;;;;;;;;;;;
 ;;; markup type predicates
 
-(define (markup-function? x)
+(define-public (markup-function? x)
   (and (markup-command-signature x)
        (not (object-property x 'markup-list-command))))
 
-(define (markup-list-function? x)
+(define-public (markup-list-function? x)
   (and (markup-command-signature x)
        (object-property x 'markup-list-command)))
 
index a3ca13f3fdeb2a340e6783b1fd4907c6b252d515..3564a709b398456fe9e3bb8a388a5a5a2eb73418 100644 (file)
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;
 
+;;; Adapted from the handle-metadata function in framework-ps.scm
+(define (performance-name-from-header header)
+  (define (metadata-lookup-output overridevar fallbackvar)
+    (let* ((overrideval (ly:modules-lookup (list header) overridevar))
+           (fallbackval (ly:modules-lookup (list header) fallbackvar))
+           (val (if overrideval overrideval fallbackval)))
+      (if val (ly:encode-string-for-pdf (markup->string val)) "")))
+  (if (null? header)
+      ""
+      (metadata-lookup-output 'midititle 'title)))
+
 (define-public (write-performances-midis performances basename . rest)
   (let ((midi-ext (ly:get-option 'midi-extension)))
     (let
       ((perfs performances)
        (count (if (null? rest) 0 (car rest))))
       (if (pair? perfs)
-          (begin
+          (let ((perf (car perfs)))
             (ly:performance-write
-             (car perfs)
+             perf
              (if (> count 0)
                  (format #f "~a-~a.~a" basename count midi-ext)
-                 (format #f "~a.~a" basename midi-ext)))
+                 (format #f "~a.~a" basename midi-ext))
+             (performance-name-from-header (ly:performance-header perf)))
             (loop (cdr perfs) (1+ count)))))))
index 8b3647923d37e0c7b9a3d5bbfb538e1062d6ff74..fd3d4ddb00c9cceb92925170bbad370ab6be73fe 100644 (file)
@@ -513,6 +513,29 @@ error (using optionally @code{location})."
            location)
           #f))))
 
+(define-safe-public (check-music-path path #:optional location #:key default)
+  "Check a music property path specification @var{path}, a symbol
+list (or a single symbol), for validity and possibly complete it.
+Returns the completed specification, or @code{#f} when rising an
+error (using optionally @code{location})."
+  (let* ((path (if (symbol? path) (list path) path)))
+    ;; A Guile 1.x bug specific to optargs precludes moving the
+    ;; defines out of the let
+    (define (property? s)
+      (object-property s 'music-type?))
+    (define (unspecial? s)
+      (not (property? s)))
+    (or (case (length path)
+          ((1) (and (property? (car path)) (cons default path)))
+          ((2) (and (unspecial? (car path)) (property? (cadr path)) path))
+          (else #f))
+        (begin
+          (ly:parser-error
+           (format #f (_ "bad music property ~a")
+                   path)
+           location)
+          #f))))
+
 (define-public (make-grob-property-set grob gprop val)
   "Make a @code{Music} expression that sets @var{gprop} to @var{val} in
 @var{grob}.  Does a pop first, i.e., this is not an override."
@@ -614,18 +637,23 @@ in @var{grob}."
           (make-grob-property-revert 'NoteColumn 'horizontal-shift)))))
 
 
-(define-safe-public (context-spec-music m context #:optional id)
-  "Add \\context CONTEXT = ID to M."
+(define-safe-public (context-spec-music m context #:optional id mods)
+  "Add \\context @var{context} = @var{id} \\with @var{mods} to @var{m}."
   (let ((cm (make-music 'ContextSpeccedMusic
                         'element m
                         'context-type context)))
     (if (string? id)
         (set! (ly:music-property cm 'context-id) id))
+    (if mods
+        (set! (ly:music-property cm 'property-operations)
+              (if (ly:context-mod? mods)
+                  (ly:get-context-mods mods)
+                  mods)))
     cm))
 
-(define-public (descend-to-context m context)
+(define-safe-public (descend-to-context m context #:optional id mods)
   "Like @code{context-spec-music}, but only descending."
-  (let ((cm (context-spec-music m context)))
+  (let ((cm (context-spec-music m context id mods)))
     (ly:music-set-property! cm 'descend-only #t)
     cm))
 
index f73b08163052b0567d0f2628887bbd8bd552dd19..fb2809e9fd2fee40c1d98660f7f10ac5ccf4711d 100644 (file)
@@ -737,15 +737,17 @@ we make between 0 and 2*pi."
               `(delay-stencil-evaluation ,(delay whiteout-expr)))
             stil)))))
 
-(define-public (stencil-whiteout-box stencil)
+(define*-public (stencil-whiteout-box stencil
+                 #:optional (thickness 0) (blot 0) (color white))
+  "@var{thickness} is how far in staff-spaces the white outline
+extends past the extents of @var{stencil}."
   (let*
-      ((x-ext (ly:stencil-extent stencil X))
-       (y-ext (ly:stencil-extent stencil Y)))
+   ((x-ext (interval-widen (ly:stencil-extent stencil X) thickness))
+    (y-ext (interval-widen (ly:stencil-extent stencil Y) thickness)))
 
-    (ly:stencil-add
-     (stencil-with-color (ly:round-filled-box x-ext y-ext 0.0)
-                         white)
-     stencil)))
+   (ly:stencil-add
+    (stencil-with-color (ly:round-filled-box x-ext y-ext blot) color)
+    stencil)))
 
 (define-public (arrow-stencil-maker start? end?)
   "Return a function drawing a line from current point to @code{destination},
diff --git a/scripts/auxiliar/pfx2ttf-mono.fontforge b/scripts/auxiliar/pfx2ttf-mono.fontforge
deleted file mode 100644 (file)
index 7b80494..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-Open($1);
-MergeKern($2)
-
-
-# The AFM files of `New Century Schoolbook' family as distributed within the
-# urw-fonts-1.0.7pre41.tar.bz2 archive contain a bunch of ligatures which
-# shouldn't be active by default:
-#
-#   T + M -> trademark
-#   N + o -> afii61352
-#   i + j -> ij
-#   I + J -> IJ
-#
-# This font bundle is shipped by Fedora Core 6 and other GNU/Linux
-# distributions; we simply remove those ligatures.
-
-# Monospace font shouldn't have these ligature.
-#
-#   f + i -> fi
-#   f + l -> fl
-
-SelectIf("trademark", "trademark", \
-         "afii61352", "afii61352", \
-         "ij", "ij", \
-         "IJ", "IJ", \
-        "fi", "fi", \
-        "fl", "fl");
-if (Strtol($version) < 20070501)
-  RemoveATT("Ligature", "*", "*");
-else
-  RemovePosSub("*");
-endif
-
-Generate($3 + $fontname + ".otf");
-
-# EOF
diff --git a/scripts/auxiliar/pfx2ttf.fontforge b/scripts/auxiliar/pfx2ttf.fontforge
deleted file mode 100644 (file)
index 7d87fae..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-Open($1);
-MergeKern($2)
-
-
-# The AFM files of `New Century Schoolbook' family as distributed within the
-# urw-fonts-1.0.7pre41.tar.bz2 archive contain a bunch of ligatures which
-# shouldn't be active by default:
-#
-#   T + M -> trademark
-#   N + o -> afii61352
-#   i + j -> ij
-#   I + J -> IJ
-#
-# This font bundle is shipped by Fedora Core 6 and other GNU/Linux
-# distributions; we simply remove those ligatures.
-
-SelectIf("trademark", "trademark", \
-         "afii61352", "afii61352", \
-         "ij", "ij", \
-         "IJ", "IJ");
-if (Strtol($version) < 20070501)
-  RemoveATT("Ligature", "*", "*");
-else
-  RemovePosSub("*");
-endif
-
-Generate($3 + $fontname + ".otf");
-
-# EOF
index 33e9f76f3d153eb615905d23806412d89c7316d2..cab59d91483783e43cfd6f24fca7d0baaa039135 100644 (file)
@@ -68,14 +68,6 @@ template = '''\input texinfo
 
 @finalout @c we do not want black boxes.
 
-@c Trick to use with proper font mappings the same NCSB fonts as
-@c LilyPond instead of those provided by TeX distribution
-@tex
-\\ifpdf
-  \\pdfmapfile{=lilypond.map}
-\\fi
-@end tex
-
 @c fool ls-latex
 @ignore
 @author %%(author)s
index 73b1cd9464006a9628bd5e288c0b4b03d2b29909..16f1241af0791fa9e36b327242d4ef16da712f62 100644 (file)
@@ -154,7 +154,7 @@ def get_option_parser ():
     p.add_option ('--left-padding',
                   metavar=_ ("PAD"),
                   dest="padding_mm",
-                  help=_ ("pad left side of music to align music inspite of uneven bar numbers (in mm)"),
+                  help=_ ("pad left side of music to align music in spite of uneven bar numbers (in mm)"),
                   type="float",
                   default=3.0)
 
index 5fa66c910f3f1f752e8ddf2c5fe8177766736db8..51a54a43aa8f9a4b67e00f2cc862097aabb44f32 100644 (file)
@@ -14,5 +14,3 @@ local-uninstall:
        -rmdir $(DESTDIR)$(local_lilypond_datadir)/tex
 
 all: $(INSTALLATION_FILES)
-
-local-WWW-1: $(outdir)/lilypond.map
diff --git a/tex/lilypond.map.in b/tex/lilypond.map.in
deleted file mode 100644 (file)
index 1e6e178..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-pncr8r CenturySchL-Roma <@NCSB_DIR@/c059013l.pfb
-pncb8r CenturySchL-Bold <@NCSB_DIR@/c059016l.pfb
-pncri8r CenturySchL-Ital <@NCSB_DIR@/c059033l.pfb
-pncbi8r CenturySchL-BoldItal <@NCSB_DIR@/c059036l.pfb
index a616aac5de51e96a20229b37b258d934e164e725..11838b48b00231c822c801362f720c407c52f598 100644 (file)
@@ -1,17 +1,15 @@
 % texinfo.tex -- TeX macros to handle Texinfo files.
-%
+% 
 % Load plain if necessary, i.e., if running under initex.
 \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
 %
-\def\texinfoversion{2015-04-30.19}
+\def\texinfoversion{2015-08-17.16}
 %
 % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
 % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
 % 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015
 % Free Software Foundation, Inc.
 %
-% Modified version used in LilyPond, changed in 2012.
-%
 % This texinfo.tex file is free software: you can redistribute it and/or
 % modify it under the terms of the GNU General Public License as
 % published by the Free Software Foundation, either version 3 of the
 % @errormsg{MSG}.  Do the index-like expansions on MSG, but if things
 % aren't perfect, it's not the end of the world, being an error message,
 % after all.
-%
+% 
 \def\errormsg{\begingroup \indexnofonts \doerrormsg}
 \def\doerrormsg#1{\errmessage{#1}}
 
 % described on page 260 of The TeXbook.  It involves outputting two
 % marks for the sectioning macros, one before the section break, and
 % one after.  I won't pretend I can describe this better than DEK...
+%
 \def\domark{%
   \toks0=\expandafter{\lastchapterdefs}%
   \toks2=\expandafter{\lastsectiondefs}%
 % Avoid "undefined control sequence" errors.
 \def\lastchapterdefs{}
 \def\lastsectiondefs{}
+\def\lastsection{}
 \def\prevchapterdefs{}
 \def\prevsectiondefs{}
 \def\lastcolordefs{}
@@ -1107,7 +1107,7 @@ where each line of input produces a line of output.}
 % for display in the outlines, and in other places.  Thus, we have to
 % double any backslashes.  Otherwise, a name like "\node" will be
 % interpreted as a newline (\n), followed by o, d, e.  Not good.
-%
+% 
 % See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and
 % related messages.  The final outcome is that it is up to the TeX user
 % to double the backslashes and otherwise make the string valid, so
@@ -1348,7 +1348,7 @@ output) for that.)}
       % their "best" equivalent, based on the @documentencoding.  Too
       % much work for too little return.  Just use the ASCII equivalents
       % we use for the index sort strings.
-      %
+      % 
       \indexnofonts
       \setupdatafile
       % We can have normal brace characters in the PDF outlines, unlike
@@ -1884,6 +1884,7 @@ end
 % Section fonts (14.4pt).
 \def\secnominalsize{14pt}
 \setfont\secrm\rmbshape{12}{\magstep1}{OT1}
+\setfont\secrmnotbold\rmshape{12}{\magstep1}{OT1}
 \setfont\secit\itbshape{10}{\magstep2}{OT1IT}
 \setfont\secsl\slbshape{10}{\magstep2}{OT1}
 \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
@@ -2319,7 +2320,7 @@ end
 }
 
 % Commands to set the quote options.
-%
+% 
 \parseargdef\codequoteundirected{%
   \def\temp{#1}%
   \ifx\temp\onword
@@ -2360,7 +2361,7 @@ end
 % If we are in a monospaced environment, however, 1) always use \ttsl,
 % and 2) do not add an italic correction.
 \def\dosmartslant#1#2{%
-  \ifusingtt
+  \ifusingtt 
     {{\ttsl #2}\let\next=\relax}%
     {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}%
   \next
@@ -2508,14 +2509,14 @@ end
   \gdef\codedash{\futurelet\next\codedashfinish}
   \gdef\codedashfinish{%
     \normaldash % always output the dash character itself.
-    %
+    % 
     % Now, output a discretionary to allow a line break, unless
     % (a) the next character is a -, or
     % (b) the preceding character is a -.
     % E.g., given --posix, we do not want to allow a break after either -.
     % Given --foo-bar, we do want to allow a break between the - and the b.
     \ifx\next\codedash \else
-      \ifx\codedashprev\codedash
+      \ifx\codedashprev\codedash 
       \else \discretionary{}{}{}\fi
     \fi
     % we need the space after the = for the case when \next itself is a
@@ -2596,7 +2597,7 @@ end
       \ifpdf
         \ifurefurlonlylink
           % PDF plus option to not display url, show just arg
-          \unhbox0
+          \unhbox0             
         \else
           % PDF, normally display both arg and url for consistency,
           % visibility, if the pdf is eventually used to print, etc.
@@ -2666,7 +2667,7 @@ end
 % One more complication: by default we'll break after the special
 % characters, but some people like to break before the special chars, so
 % allow that.  Also allow no breaking at all, for manual control.
-%
+% 
 \parseargdef\urefbreakstyle{%
   \def\txiarg{#1}%
   \ifx\txiarg\wordnone
@@ -2881,13 +2882,10 @@ end
 \def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi}
 \def\finishsup#1{$\ptexsp{\hbox{\selectfonts\lllsize #1}}$}%
 
-% ctrl is no longer a Texinfo command, but leave this definition for fun.
-\def\ctrl #1{{\tt \rawbackslash \hat}#1}
-
 % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}.
 % Ignore unless FMTNAME == tex; then it is like @iftex and @tex,
 % except specified as a normal braced arg, so no newlines to worry about.
-%
+% 
 \def\outfmtnametex{tex}
 %
 \long\def\inlinefmt#1{\doinlinefmt #1,\finish}
@@ -2895,7 +2893,7 @@ end
   \def\inlinefmtname{#1}%
   \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi
 }
-%
+% 
 % @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if
 % FMTNAME is tex, else ELSE-TEXT.
 \long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish}
@@ -2911,7 +2909,7 @@ end
 % *right* brace they would have to use a command anyway, so they may as
 % well use a command to get a left brace too.  We could re-use the
 % delimiter character idea from \verb, but it seems like overkill.
-%
+% 
 \long\def\inlineraw{\tex \doinlineraw}
 \long\def\doinlineraw#1{\doinlinerawtwo #1,\finish}
 \def\doinlinerawtwo#1,#2,\finish{%
@@ -3024,11 +3022,16 @@ end
   \TeX
 }
 
-% Some math mode symbols.
-\def\bullet{$\ptexbullet$}
-\def\geq{\ifmmode \ge\else $\ge$\fi}
-\def\leq{\ifmmode \le\else $\le$\fi}
-\def\minus{\ifmmode -\else $-$\fi}
+% Some math mode symbols.  Define \ensuremath to switch into math mode
+% unless we are already there.  Expansion tricks may not be needed here,
+% but safer, and can't hurt.
+\def\ensuremath{\ifmmode \expandafter\asis \else\expandafter\ensuredmath \fi}
+\def\ensuredmath#1{$\relax#1$}
+%
+\def\bullet{\ensuremath\ptexbullet}
+\def\geq{\ensuremath\ge}
+\def\leq{\ensuremath\le}
+\def\minus{\ensuremath-}
 
 % @dots{} outputs an ellipsis using the current font.
 % We do .5em per period so that it has the same spacing in the cm
@@ -3192,8 +3195,15 @@ end
 \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E}
 \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e}
 %
-% Use the ec* fonts (cm-super in outline format) for non-CM glyphs.
-\def\ecfont{%
+% Use the European Computer Modern fonts (cm-super in outline format)
+% for non-CM glyphs.  That is ec* for regular text and tc* for the text
+% companion symbols (LaTeX TS1 encoding).  Both are part of the ec
+% package and follow the same conventions.
+% 
+\def\ecfont{\etcfont{e}}
+\def\tcfont{\etcfont{t}}
+%
+\def\etcfont#1{%
   % We can't distinguish serif/sans and italic/slanted, but this
   % is used for crude hacks anyway (like adding French and German
   % quotes to documents typeset with CM, where we lose kerning), so
@@ -3202,14 +3212,14 @@ end
   \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%
   \ifmonospace
     % typewriter:
-    \font\thisecfont = ectt\ecsize \space at \nominalsize
+    \font\thisecfont = #1ctt\ecsize \space at \nominalsize
   \else
     \ifx\curfontstyle\bfstylename
       % bold:
-      \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize
+      \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize
     \else
       % regular:
-      \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize
+      \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize
     \fi
   \fi
   \thisecfont
@@ -3328,7 +3338,7 @@ end
 % inside a \vbox, and fonts need to be set appropriately first.  Because
 % it is always used for titles, nothing else, we call \rmisbold.  \par
 % should be specified before the end of the \vbox, since a vbox is a group.
-%
+% 
 \def\raggedtitlesettings{%
   \rmisbold
   \hyphenpenalty=10000
@@ -3942,7 +3952,7 @@ end
 }
 
 % multitable-only commands.
-%
+% 
 % @headitem starts a heading row, which we typeset in bold.  Assignments
 % have to be global since we are inside the implicit group of an
 % alignment entry.  \everycr below resets \everytab so we don't have to
@@ -4256,12 +4266,12 @@ end
 % variable's value contains other Texinfo commands, it's almost certain
 % it will fail (although perhaps we could fix that with sufficient work
 % to do a one-level expansion on the result, instead of complete).
-%
+% 
 % Unfortunately, this has the consequence that when _ is in the *value*
 % of an @set, it does not print properly in the roman fonts (get the cmr
 % dot accent at position 126 instead).  No fix comes to mind, and it's
 % been this way since 2003 or earlier, so just ignore it.
-%
+% 
 \def\expandablevalue#1{%
   \expandafter\ifx\csname SET#1\endcsname\relax
     {[No value for ``#1'']}%
@@ -4273,7 +4283,7 @@ end
 
 % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
 % with @set.
-%
+% 
 % To get the special treatment we need for `@end ifset,' we call
 % \makecond and then redefine.
 %
@@ -4306,7 +4316,7 @@ end
 % without the @) is in fact defined.  We can only feasibly check at the
 % TeX level, so something like `mathcode' is going to considered
 % defined even though it is not a Texinfo command.
-%
+% 
 \makecond{ifcommanddefined}
 \def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}}
 %
@@ -5014,10 +5024,39 @@ end
 % These macros are used by the sorted index file itself.
 % Change them to control the appearance of the index.
 
-\def\initial#1{{%
-  % Some minor font changes for the special characters.
-  \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
-  %
+\let\normalhyphen=-
+{\catcode`\/=13 \catcode`\-=13 \catcode`\^=13 \catcode`\~=13 \catcode`\_=13
+\catcode`\|=13 \catcode`\<=13 \catcode`\>=13 \catcode`\+=13 \catcode`\"=13
+\catcode`\$=3
+\gdef\initialfonts{%
+  \usemathbackslash
+  \secfonts
+  % Some changes for non-alphabetic characters.  Using the glyphs from the
+  % math fonts looks more consistent than the typewriter font used elsewhere
+  % for these characters.
+  % Can't get bold backslash so don't use bold forward slash
+  \catcode`\/=13
+  \def/{{\secrmnotbold \normalslash}}
+  \catcode`\-=13
+  \def-{{\normalhyphen\normalhyphen}}
+  \let^=\normalcaret
+  \let~=\normaltilde
+  \def\_{%
+    \leavevmode \kern.07em \vbox{\hrule width.33em height.06ex}\kern .07em }
+  \def|{$\vert$}
+  \def<{$\less$}
+  \def>{$\gtr$}
+  \def+{$\normalplus$}
+  \let"=\normaldoublequote
+}}
+
+\def\initial{%
+  \bgroup
+  \initialfonts
+  \initialx
+}
+
+\def\initialx#1{%
   % Remove any glue we may have, we'll be inserting our own.
   \removelastskip
   %
@@ -5038,7 +5077,8 @@ end
   % Do our best not to break after the initial.
   \nobreak
   \vskip .33\baselineskip plus .1\baselineskip
-}}
+  \egroup % \initialfonts
+}
 
 % \entry typesets a paragraph consisting of the text (#1), dot leaders, and
 % then page number (#2) flushed to the right margin.  It is used for index
@@ -5595,7 +5635,7 @@ end
 \let\top\unnumbered
 
 % Sections.
-%
+% 
 \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
 \def\seczzz#1{%
   \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
@@ -5618,7 +5658,7 @@ end
 }
 
 % Subsections.
-%
+% 
 % normally calls numberedsubseczzz:
 \outer\parseargdef\numberedsubsec{\numhead2{#1}}
 \def\numberedsubseczzz#1{%
@@ -5643,7 +5683,7 @@ end
 }
 
 % Subsubsections.
-%
+% 
 % normally numberedsubsubseczzz:
 \outer\parseargdef\numberedsubsubsec{\numhead3{#1}}
 \def\numberedsubsubseczzz#1{%
@@ -6689,7 +6729,7 @@ end
 
 % @indentedblock is like @quotation, but indents only on the left and
 % has no optional argument.
-%
+% 
 \makedispenvdef{indentedblock}{\indentedblockstart}
 %
 \def\indentedblockstart{%
@@ -6870,7 +6910,7 @@ end
 % typesetting commands (@smallbook, font changes, etc.) have to be done
 % beforehand -- and a) we want @copying to be done first in the source
 % file; b) letting users define the frontmatter in as flexible order as
-% possible is very desirable.
+% possible is desirable.
 %
 \def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
 \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
@@ -6986,7 +7026,7 @@ end
 % @deftypefnnewline on|off says whether the return type of typed functions
 % are printed on their own line.  This affects @deftypefn, @deftypefun,
 % @deftypeop, and @deftypemethod.
-%
+% 
 \parseargdef\deftypefnnewline{%
   \def\temp{#1}%
   \ifx\temp\onword
@@ -7167,7 +7207,7 @@ end
       \tclose{\temp}% typeset the return type
       \ifrettypeownline
         % put return type on its own line; prohibit line break following:
-        \hfil\vadjust{\nobreak}\break
+        \hfil\vadjust{\nobreak}\break  
       \else
         \space  % type on same line, so just followed by a space
       \fi
@@ -7303,6 +7343,11 @@ end
   }
 \fi
 
+% Used to remove a category 13 newline, added to the end of the last
+% line read in by \scantokens.
+{\catcode`\^^M=13 \gdef\gobblecr^^M{}}
+
+% Argument is macro body with arguments substituted
 \def\scanmacro#1{\begingroup
   \newlinechar`\^^M
   \let\xeatspaces\eatspaces
@@ -7317,15 +7362,14 @@ end
   % ... and for \example:
   \spaceisspace
   %
-  % The \empty here causes a following catcode 5 newline to be eaten as
-  % part of reading whitespace after a control sequence.  It does not
-  % eat a catcode 13 newline.  There's no good way to handle the two
-  % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX
-  % would then have different behavior).  See the Macro Details node in
-  % the manual for the workaround we recommend for macros and
-  % line-oriented commands.
-  %
-  \scantokens{#1\empty}%
+  \ifnum\catcode`\^^M=5
+    % The \empty here causes a following catcode 5 newline to be eaten as
+    % part of reading whitespace after a control sequence.
+    \scantokens{#1\empty}%
+  \else
+    \catcode`\^^M=13
+    \scantokens{#1\gobblecr}%
+  \fi
 \endgroup}
 
 \def\scanexp#1{%
@@ -7412,36 +7456,28 @@ end
 
 \def\macrobodyctxt{% used for @macro definitions
   \scanctxt
+  \catcode`\ =\other
   \catcode`\{=\other
   \catcode`\}=\other
   \catcode`\^^M=\other
   \usembodybackslash
 }
 
-% LilyPond CHANGE: The following definition has been reverted to the
-% original definition since it was problematic in the context of
-% indexing.
-
-\def\macroargctxt{% used when scanning invocations
+% Used when scanning braced macro arguments.  Note, however, that catcode
+% changes here are ineffectual if the macro invocation was nested inside
+% an argument to another Texinfo command.
+\def\macroargctxt{%
   \scanctxt
-%  \catcode`\\=0
-  \catcode`\\=\other
+  \catcode`\\=\active
 }
-% why catcode 0 for \ in the above?  To recognize \\ \{ \} as "escapes"
-% for the single characters \ { }.  Thus, we end up with the "commands"
-% that would be written @\ @{ @} in a Texinfo document.
-%
-% We already have @{ and @}.  For @\, we define it here, and only for
-% this purpose, to produce a typewriter backslash (so, the @\ that we
-% define for @math can't be used with @macro calls):
-%
+
 \def\\{\normalbackslash}%
-%
-% We would like to do this for \, too, since that is what makeinfo does.
-% But it is not possible, because Texinfo already has a command @, for a
-% cedilla accent.  Documents must use @comma{} instead.
-%
-% \anythingelse will almost certainly be an error of some kind.
+
+\def\macrolineargctxt{% used for whole-line arguments without braces
+  \scanctxt
+  \catcode`\{=\other
+  \catcode`\}=\other
+}
 
 % \mbodybackslash is the definition of \ in @macro bodies.
 % It maps \foo\ => \csname macarg.foo\endcsname => #N
@@ -7516,12 +7552,14 @@ end
 % This makes use of the obscure feature that if the last token of a
 % <parameter list> is #, then the preceding argument is delimited by
 % an opening brace, and that opening brace is not consumed.
+% 
 \def\getargs#1{\getargsxxx#1{}}
 \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
 \def\getmacname#1 #2\relax{\macname={#1}}
 \def\getmacargs#1{\def\argl{#1}}
 
-% For macro processing make @ a letter so that we can make Texinfo private macro names.
+% For macro processing make @ a letter so that we can make
+% private-to-Texinfo macro names.
 \edef\texiatcatcode{\the\catcode`\@}
 \catcode `@=11\relax
 
@@ -7530,7 +7568,7 @@ end
 % in the params list to some hook where the argument is to be expanded.  If
 % there are less than 10 arguments that hook is to be replaced by ##N where N
 % is the position in that list, that is to say the macro arguments are to be
-% defined `a la TeX in the macro body.
+% defined `a la TeX in the macro body.  
 %
 % That gets used by \mbodybackslash (above).
 %
@@ -7552,6 +7590,7 @@ end
 %
 % If you compile with TeX (not eTeX), and you have macros with 10 or more
 % arguments, no macro can have more than 256 arguments (else error).
+% 
 \def\parsemargdef#1;{%
   \paramno=0\def\paramlist{}%
   \let\hash\relax
@@ -7579,7 +7618,7 @@ end
 
 \def\parsemmanyargdef@@#1,{%
   \if#1;\let\next=\relax
-  \else
+  \else 
     \let\next=\parsemmanyargdef@@
     \edef\tempb{\eatspaces{#1}}%
     \expandafter\def\expandafter\tempa
@@ -7594,13 +7633,12 @@ end
 
 % These two commands read recursive and nonrecursive macro bodies.
 % (They're different since rec and nonrec macros end differently.)
-%
-
+% Set \temp to the body of the macro, and call \defmacro.
 \catcode `\@\texiatcatcode
-\long\def\parsemacbody#1@end macro%
-{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
-\long\def\parsermacbody#1@end rmacro%
-{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+{\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{%
+\xdef\temp{\eatcr{#1}}\endgroup\defmacro}}%
+{\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{%
+\xdef\temp{\eatcr{#1}}\endgroup\defmacro}}%
 \catcode `\@=11\relax
 
 \let\endargs@\relax
@@ -7609,7 +7647,7 @@ end
 \long\def\nillm@{\nil@}%
 
 % This macro is expanded during the Texinfo macro expansion, not during its
-% definition.  It gets all the arguments values and assigns them to macros
+% definition.  It gets all the arguments' values and assigns them to macros
 % macarg.ARGNAME
 %
 % #1 is the macro name
@@ -7631,7 +7669,8 @@ end
   \fi
 }
 
-%
+% Internal for \getargsval@.
+%  
 \def\getargvals@@{%
   \ifx\paramlist\nilm@
       % Some sanity check needed here that \argvaluelist is also empty.
@@ -7675,7 +7714,8 @@ end
 }
 
 % Replace arguments by their values in the macro body, and place the result
-% in macro \@tempa
+% in macro \@tempa.
+% 
 \def\macvalstoargs@{%
   %  To do this we use the property that token registers that are \the'ed
   % within an \edef  expand only once. So we are going to place all argument
@@ -7699,8 +7739,9 @@ end
   \expandafter\def\expandafter\@tempa\expandafter{\@tempc}%
   }
 
-\def\macargexpandinbody@{%
-  %% Define the named-macro outside of this group and then close this group.
+% Define the named-macro outside of this group and then close this group. 
+% 
+\def\macargexpandinbody@{% 
   \expandafter
   \endgroup
   \macargdeflist@
@@ -7737,14 +7778,17 @@ end
   \next
 }
 
-% Save the token stack pointer into macro #1
+% Save the token stack pointer into macro #1:
 \def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}}
-% Restore the token stack pointer from number in macro #1
-\def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax}
-% newtoks that can be used non \outer .
+%
+% Restore the token stack pointer from number in macro #1:
+\def\texirestoretoksstackpoint#1{\expandafter\mathchardef
+  \expandafter\@cclvi#1\relax}
+% Variant \newtoks that can be used non-\outer:
 \def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi}
 
-% Tailing missing arguments are set to empty
+% Tailing missing arguments are set to empty.
+% 
 \def\setemptyargvalues@{%
   \ifx\paramlist\nilm@
     \let\next\macargexpandinbody@
@@ -7774,8 +7818,9 @@ end
    \long\def#2{#4}%
 }
 
-% This defines a Texinfo @macro. There are eight cases: recursive and
-% nonrecursive macros of zero, one, up to nine, and many arguments.
+% This defines a Texinfo @macro.  \temp has the body of the macro in it.
+% There are eight cases: recursive and nonrecursive macros of zero, one,
+% up to nine, and many arguments.
 % Much magic with \expandafter here.
 % \xdef is used so that macro definitions will survive the file
 % they're defined in; @include reads the file inside a group.
@@ -7789,7 +7834,7 @@ end
         \noexpand\scanmacro{\temp}}%
     \or % 1
       \expandafter\xdef\csname\the\macname\endcsname{%
-         \bgroup\noexpand\macroargctxt
+         \bgroup
          \noexpand\braceorline
          \expandafter\noexpand\csname\the\macname xxx\endcsname}%
       \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
@@ -7809,7 +7854,7 @@ end
       \else % 10 or more
         \expandafter\xdef\csname\the\macname\endcsname{%
           \noexpand\getargvals@{\the\macname}{\argl}%
-        }%
+        }%    
         \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp
         \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble
       \fi
@@ -7822,7 +7867,7 @@ end
         \noexpand\scanmacro{\temp}\egroup}%
     \or % 1
       \expandafter\xdef\csname\the\macname\endcsname{%
-         \bgroup\noexpand\macroargctxt
+         \bgroup
          \noexpand\braceorline
          \expandafter\noexpand\csname\the\macname xxx\endcsname}%
       \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
@@ -7854,19 +7899,90 @@ end
     \fi
   \fi}
 
-\catcode `\@\texiatcatcode\relax
+\catcode `\@\texiatcatcode\relax % end private-to-Texinfo catcodes
 
 \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
 
-% \braceorline decides whether the next nonwhitespace character is a
-% {.  If so it reads up to the closing }, if not, it reads the whole
-% line.  Whatever was read is then fed to the next control sequence
-% as an argument (by \parsebrace or \parsearg).
-%
+
+{\catcode`\@=0 \catcode`\\=13
+@catcode`@_=11
+
+% Call #1 with a list of tokens #2, with any doubled backslashes in #2
+% compressed to one.
+@gdef@passargtomacro#1#2{%
+  @def@the_macro{#1}%
+  @def@pending_backslash{}%
+  @def@finish{@finish}%
+  @def@arg_result{}%
+  @let@next_token=@relax
+  @add_segment#2\@finish\%
+}
+
+% Input stream is just after a backslash.  If the next token is not a
+% backslash, process the rest of the argument; otherwise, remove the next
+% token.
+@gdef@look_ahead{%
+  @futurelet@next_token@look_aheadzzz}
+@gdef@look_aheadzzz{%
+  @ifx@next_token\%
+   @let@next=@gobble_and_check_finish 
+  @else
+   @let@next=@add_segment
+  @fi@next
+}
+
+% Double backslash found.  Add a single backslash here.
+@gdef@gobble_and_check_finish#1{%
+  @add_the_backslash
+  @def@pending_backslash{}%
+  @futurelet@next_token@add_segment
+}
+
+% append a backslash to \arg_result
+@gdef@add_the_backslash{%
+  @expandafter@gdef@expandafter@arg_result@expandafter{@arg_result\}%
+}
+
+% Input stream is either at the start of the argument, or just after a 
+% backslash sequence, either a lone backslash, or a doubled backslash.  
+% \next_token contains the first token in the input stream: if it is \finish, 
+% finish; otherwise, append to \arg_result the segment of the argument up until
+% the next backslash.  \pending_backslash contains a backslash to represent
+% a backslash just before the start of the input stream that has not been
+% added to \arg_result.
+@gdef@add_segment#1\{%
+@ifx@next_token@finish
+  @let@next=@call_the_macro%
+@else
+  @let@next=@look_ahead
+  %
+  % append to @arg_result
+  % token list registers might be better
+  @expandafter@expandafter@expandafter@gdef
+  @expandafter@expandafter@expandafter@arg_result
+  @expandafter@expandafter@expandafter{%
+  @expandafter@arg_result
+  @pending_backslash#1}%
+  @def@pending_backslash{\}%
+@fi@next}
+
+@gdef@call_the_macro{@expandafter@the_macro@expandafter{@arg_result}}
+
+}
+
+% \braceorline MAC is used for a one-argument macro MAC.  It checks
+% whether the next non-whitespace character is a {.  It sets the context
+% for reading the argument (slightly different in the two cases).  Then,
+% to read the argument, in the whole-line case, it then calls the regular
+% \parsearg MAC; in the lbrace case, it calls \passargtomacro MAC.
+% 
 \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
 \def\braceorlinexxx{%
-  \ifx\nchar\bgroup\else
-    \expandafter\parsearg
+  \ifx\nchar\bgroup
+    \macroargctxt
+    \expandafter\passargtomacro
+  \else
+    \macrolineargctxt\expandafter\parsearg
   \fi \macnamexxx}
 
 
@@ -7965,7 +8081,7 @@ end
 % automatically in xrefs, if the third arg is not explicitly specified.
 % This was provided as a "secret" @set xref-automatic-section-title
 % variable, now it's official.
-%
+% 
 \parseargdef\xrefautomaticsectiontitle{%
   \def\temp{#1}%
   \ifx\temp\onword
@@ -8091,24 +8207,24 @@ end
     \fi
   \else
     % node/anchor (non-float) references.
-    %
+    % 
     % If we use \unhbox to print the node names, TeX does not insert
     % empty discretionaries after hyphens, which means that it will not
     % find a line break at a hyphen in a node names.  Since some manuals
     % are best written with fairly long node names, containing hyphens,
     % this is a loss.  Therefore, we give the text of the node name
     % again, so it is as if TeX is seeing it for the first time.
-    %
+    % 
     \ifdim \wd\printedmanualbox > 0pt
       % Cross-manual reference with a printed manual name.
-      %
+      % 
       \crossmanualxref{\cite{\printedmanual\unskip}}%
     %
     \else\ifdim \wd\infofilenamebox > 0pt
       % Cross-manual reference with only an info filename (arg 4), no
       % printed manual name (arg 5).  This is essentially the same as
       % the case above; we output the filename, since we have nothing else.
-      %
+      % 
       \crossmanualxref{\code{\infofilename\unskip}}%
     %
     \else
@@ -8139,20 +8255,20 @@ end
 \endgroup}
 
 % Output a cross-manual xref to #1.  Used just above (twice).
-%
+% 
 % Only include the text "Section ``foo'' in" if the foo is neither
 % missing or Top.  Thus, @xref{,,,foo,The Foo Manual} outputs simply
 % "see The Foo Manual", the idea being to refer to the whole manual.
-%
+% 
 % But, this being TeX, we can't easily compare our node name against the
 % string "Top" while ignoring the possible spaces before and after in
 % the input.  By adding the arbitrary 7sp below, we make it much less
 % likely that a real node name would have the same width as "Top" (e.g.,
 % in a monospaced font).  Hopefully it will never happen in practice.
-%
+% 
 % For the same basic reason, we retypeset the "Top" at every
 % reference, since the current font is indeterminate.
-%
+% 
 \def\crossmanualxref#1{%
   \setbox\toprefbox = \hbox{Top\kern7sp}%
   \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}%
@@ -8598,7 +8714,7 @@ end
   %
   \ifimagevmode
     \medskip  % space after a standalone image
-  \fi
+  \fi  
   \ifx\centersub\centerV \egroup \fi
 \endgroup}
 
@@ -9022,17 +9138,17 @@ directory should work if nowhere else does.}
 \def\latonechardefs{%
   \gdef^^a0{\tie}
   \gdef^^a1{\exclamdown}
-  \gdef^^a2{\missingcharmsg{CENT SIGN}}
-  \gdef^^a3{{\pounds}}
-  \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
-  \gdef^^a5{\missingcharmsg{YEN SIGN}}
-  \gdef^^a6{\missingcharmsg{BROKEN BAR}}
+  \gdef^^a2{{\tcfont \char162}} % cent
+  \gdef^^a3{\pounds}
+  \gdef^^a4{{\tcfont \char164}} % currency
+  \gdef^^a5{{\tcfont \char165}} % yen
+  \gdef^^a6{{\tcfont \char166}} % broken bar
   \gdef^^a7{\S}
   \gdef^^a8{\"{}}
   \gdef^^a9{\copyright}
   \gdef^^aa{\ordf}
   \gdef^^ab{\guillemetleft}
-  \gdef^^ac{$\lnot$}
+  \gdef^^ac{\ensuremath\lnot}
   \gdef^^ad{\-}
   \gdef^^ae{\registeredsymbol}
   \gdef^^af{\={}}
@@ -9044,7 +9160,7 @@ directory should work if nowhere else does.}
   \gdef^^b4{\'{}}
   \gdef^^b5{$\mu$}
   \gdef^^b6{\P}
-  \gdef^^b7{\ifmmode\cdot\else $\cdot$\fi}
+  \gdef^^b7{\ensuremath\cdot}
   \gdef^^b8{\cedilla\ }
   \gdef^^b9{$^1$}
   \gdef^^ba{\ordm}
@@ -9307,7 +9423,7 @@ directory should work if nowhere else does.}
 % @U{xxxx} to produce U+xxxx, if we support it.
 \def\U#1{%
   \expandafter\ifx\csname uni:#1\endcsname \relax
-    \errhelp = \EMsimple
+    \errhelp = \EMsimple       
     \errmessage{Unicode character U+#1 not supported, sorry}%
   \else
     \csname uni:#1\endcsname
@@ -9336,7 +9452,7 @@ directory should work if nowhere else does.}
       \expandafter\expandafter\expandafter\expandafter
        \expandafter\expandafter\expandafter
        \gdef\UTFviiiTmp{#2}%
-      %
+      % 
       \expandafter\ifx\csname uni:#1\endcsname \relax \else
        \errmessage{Internal error, already defined: #1}%
       \fi
@@ -9385,7 +9501,7 @@ directory should work if nowhere else does.}
 % U+0080..U+00FF = https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)
 % U+0100..U+017F = https://en.wikipedia.org/wiki/Latin_Extended-A
 % U+0180..U+024F = https://en.wikipedia.org/wiki/Latin_Extended-B
-%
+% 
 % Many of our renditions are less than wonderful, and all the missing
 % characters are available somewhere.  Loading the necessary fonts
 % awaits user request.  We can't truly support Unicode without
@@ -9397,25 +9513,29 @@ directory should work if nowhere else does.}
 \def\utfeightchardefs{%
   \DeclareUnicodeCharacter{00A0}{\tie}
   \DeclareUnicodeCharacter{00A1}{\exclamdown}
+  \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent
   \DeclareUnicodeCharacter{00A3}{\pounds}
+  \DeclareUnicodeCharacter{00A4}{{\tcfont \char164}}% 0244=currency
+  \DeclareUnicodeCharacter{00A5}{{\tcfont \char165}}% 0245=yen
+  \DeclareUnicodeCharacter{00A6}{{\tcfont \char166}}% 0246=brokenbar
   \DeclareUnicodeCharacter{00A7}{\S}
   \DeclareUnicodeCharacter{00A8}{\"{ }}
   \DeclareUnicodeCharacter{00A9}{\copyright}
   \DeclareUnicodeCharacter{00AA}{\ordf}
   \DeclareUnicodeCharacter{00AB}{\guillemetleft}
-  \DeclareUnicodeCharacter{00AC}{\ifmmode\lnot\else $\lnot$\fi}
+  \DeclareUnicodeCharacter{00AC}{\ensuremath\lnot}
   \DeclareUnicodeCharacter{00AD}{\-}
   \DeclareUnicodeCharacter{00AE}{\registeredsymbol}
   \DeclareUnicodeCharacter{00AF}{\={ }}
 
   \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}
-  \DeclareUnicodeCharacter{00B1}{\ifmmode\pm\else $\pm$\fi}
+  \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}
   \DeclareUnicodeCharacter{00B2}{$^2$}
   \DeclareUnicodeCharacter{00B3}{$^3$}
   \DeclareUnicodeCharacter{00B4}{\'{ }}
   \DeclareUnicodeCharacter{00B5}{$\mu$}
   \DeclareUnicodeCharacter{00B6}{\P}
-  \DeclareUnicodeCharacter{00B7}{\ifmmode\cdot\else $\cdot$\fi}
+  \DeclareUnicodeCharacter{00B7}{\ensuremath\cdot}
   \DeclareUnicodeCharacter{00B8}{\cedilla{ }}
   \DeclareUnicodeCharacter{00B9}{$^1$}
   \DeclareUnicodeCharacter{00BA}{\ordm}
@@ -9449,7 +9569,7 @@ directory should work if nowhere else does.}
   \DeclareUnicodeCharacter{00D4}{\^O}
   \DeclareUnicodeCharacter{00D5}{\~O}
   \DeclareUnicodeCharacter{00D6}{\"O}
-  \DeclareUnicodeCharacter{00D7}{\ifmmode\times\else $\times$\fi}
+  \DeclareUnicodeCharacter{00D7}{\ensuremath\times}
   \DeclareUnicodeCharacter{00D8}{\O}
   \DeclareUnicodeCharacter{00D9}{\`U}
   \DeclareUnicodeCharacter{00DA}{\'U}
@@ -9483,7 +9603,7 @@ directory should work if nowhere else does.}
   \DeclareUnicodeCharacter{00F4}{\^o}
   \DeclareUnicodeCharacter{00F5}{\~o}
   \DeclareUnicodeCharacter{00F6}{\"o}
-  \DeclareUnicodeCharacter{00F7}{\ifmmode\div\else $\div$\fi}
+  \DeclareUnicodeCharacter{00F7}{\ensuremath\div}
   \DeclareUnicodeCharacter{00F8}{\o}
   \DeclareUnicodeCharacter{00F9}{\`u}
   \DeclareUnicodeCharacter{00FA}{\'u}
@@ -9552,7 +9672,7 @@ directory should work if nowhere else does.}
   \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}
   \DeclareUnicodeCharacter{0136}{\cedilla{K}}
   \DeclareUnicodeCharacter{0137}{\cedilla{k}}
-  \DeclareUnicodeCharacter{0138}{\ifmmode\kappa\else $\kappa$\fi}
+  \DeclareUnicodeCharacter{0138}{\ensuremath\kappa}  
   \DeclareUnicodeCharacter{0139}{\'L}
   \DeclareUnicodeCharacter{013A}{\'l}
   \DeclareUnicodeCharacter{013B}{\cedilla{L}}
@@ -9819,6 +9939,8 @@ directory should work if nowhere else does.}
   \DeclareUnicodeCharacter{201C}{\quotedblleft}
   \DeclareUnicodeCharacter{201D}{\quotedblright}
   \DeclareUnicodeCharacter{201E}{\quotedblbase}
+  \DeclareUnicodeCharacter{2020}{\ensuremath\dagger}
+  \DeclareUnicodeCharacter{2021}{\ensuremath\ddagger}
   \DeclareUnicodeCharacter{2022}{\bullet}
   \DeclareUnicodeCharacter{2026}{\dots}
   \DeclareUnicodeCharacter{2039}{\guilsinglleft}
@@ -9830,6 +9952,7 @@ directory should work if nowhere else does.}
 
   \DeclareUnicodeCharacter{2212}{\minus}
   \DeclareUnicodeCharacter{2217}{\point}
+  \DeclareUnicodeCharacter{2225}{\ensuremath\parallel}
   \DeclareUnicodeCharacter{2261}{\equiv}
 }% end of \utfeightchardefs
 
@@ -10157,8 +10280,8 @@ directory should work if nowhere else does.}
 \def\activedoublequote{{\tt\char34}}
 \let"=\activedoublequote
 \catcode`\~=\active \def\activetilde{{\tt\char126}} \let~ = \activetilde
-\chardef\hat=`\^
-\catcode`\^=\active \def\activehat{{\tt \hat}} \let^ = \activehat
+\chardef\hatchar=`\^
+\catcode`\^=\active \def\activehat{{\tt \hatchar}} \let^ = \activehat
 
 \catcode`\_=\active
 \def_{\ifusingtt\normalunderscore\_}
@@ -10181,9 +10304,9 @@ directory should work if nowhere else does.}
 \def\texinfochars{%
   \let< = \activeless
   \let> = \activegtr
-  \let~ = \activetilde
+  \let~ = \activetilde 
   \let^ = \activehat
-  \markupsetuplqdefault \markupsetuprqdefault
+  \markupsetuplqdefault \markupsetuprqdefault 
   \let\b = \strong
   \let\i = \smartitalic
   % in principle, all other definitions in \tex have to be undone too.
@@ -10236,6 +10359,8 @@ directory should work if nowhere else does.}
 @gdef@rawbackslash{@let\=@backslashcurfont}
 @gdef@otherbackslash{@let\=@realbackslash}
 
+@gdef@usemathbackslash{@def@backslashcurfont{@math{@backslash}}}
+
 % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
 % the literal character `\'.  Also revert - to its normal character, in
 % case the active - from code has slipped in.
index 3745ebbe5b55212c07e00e6a68e9bb74f724cc94..bde98db4c500025dd22c414596334269601966a0 100644 (file)
@@ -1,4 +1,4 @@
-% $Id: txi-de.tex,v 1.9 2008/10/16 17:13:10 karl Exp $
+% $Id$
 % txi-de.tex -- German translations for texinfo.tex.
 %
 % Copyright 1999, 2007, 2008 Free Software Foundation, Inc.
index 6d556b175828b3562369d08aec7f12158f4ef147..00dde4f8d9798abf3fb71b66fbc3d3c688c8e531 100644 (file)
@@ -1,4 +1,4 @@
-% $Id: txi-en.tex,v 1.7 2008/10/16 17:13:10 karl Exp $
+% $Id$
 % txi.en.tex -- English non-translations for texinfo.tex.  This is read
 % when a source document says @documentlanguage en (which might happen
 % after another @documentlanguage).  The actual values are the same as
@@ -25,6 +25,7 @@
 
 \gdef\putwordAppendix{Appendix}
 \gdef\putwordChapter{Chapter}
+\gdef\putworderror{error}
 \gdef\putwordfile{file}
 \gdef\putwordin{in}
 \gdef\putwordIndexIsEmpty{(Index is empty)}
index ace59e345d1c10f2e984c679458fe9e786e671fa..44bda3598096660cd25287cd1c9694b51c5ce559 100644 (file)
@@ -1,7 +1,7 @@
-% $Id: txi-es.tex,v 1.6 2008/10/16 17:13:10 karl Exp $
+% $Id$
 % txi-es.tex -- Spanish translations for texinfo.tex.
 %
-% Copyright (C) 1999, 2007, 2008 by Adrian Perez Jorge.
+% Copyright 1999, 2007, 2008, 2015 by Adrian Perez Jorge.
 % 
 % This txi-es.tex file is free software; you can redistribute it and/or
 % modify it under the terms of the GNU General Public License as
@@ -28,6 +28,7 @@
 \gdef\putwordIndexIsEmpty{(El \'Indice est\'a vac\'{\char16{}}o)}
 \gdef\putwordIndexNonexistent{(No existe el \'Indice)}
 \gdef\putwordInfo{Info}
+\gdef\putwordin{en}
 \gdef\putwordMethodon{M\'etodo de}
 \gdef\putwordNoTitle{Sin T\'{\char{16}}tulo}
 \gdef\putwordof{de}
index 4badeddcb809235240b3c9ab7a2c0be06cbd5edc..6e8a6bacb35f8638921e05146781fd8a4a357745 100644 (file)
@@ -1,4 +1,4 @@
-% $Id: txi-fr.tex,v 1.8 2008/10/21 23:51:37 karl Exp $
+% $Id$
 % txi-fr.tex -- French translations for texinfo.tex.
 %
 % Copyright (C) 1999, 2007, 2008 Free Software Foundation.
index bf5f05929a21d3dd0ef33df8f136803874569742..0722595b78d2b136d5b87377eb8cc9236bdc74b1 100644 (file)
@@ -1,3 +1,6 @@
+% $Id$
+% txi-hu.tex -- Hungarian translations for texinfo.tex.
+%
 % Copyright 1999, 2007, 2008 Free Software Foundation, Inc.
 % 
 % This program is free software; you can redistribute it and/or modify
index 06f4f1d6b4919464e658f556b75e2359bb5ba1de..ae2fed409e4dfc006c075b505221acdd1e481963 100644 (file)
@@ -1,4 +1,4 @@
-% $Id: txi-it.tex,v 1.7 2008/10/16 17:13:10 karl Exp $
+% $Id$
 % txi-it.tex -- Italian translations for texinfo.tex
 %
 % Copyright 1999, 2007, 2008 Free Software Foundation.
index e5263e18f1ce014bd5c73b623f5890ed55c5dfc0..a60edf4b5567047113ac1e720a7c0117bfda4d82 100644 (file)
@@ -1,4 +1,4 @@
-% $Id: txi-nl.tex,v 1.7 2008/10/16 17:13:10 karl Exp $
+% $Id$
 % txi-nl.tex -- Dutch translations for texinfo.tex.  
 %
 % Copyright 1999, 2007, 2008 Free Software Foundation.