@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
@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 *****
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' {
@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 {
Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон.
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' {
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' {
@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 {
Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон.
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' {
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' {
@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 {
Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон.
@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 {
Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон.
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' {
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' {
@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
@}
@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 @{
\name ImproVoice
@dots{}
@}
- \context @{
- \Staff
- \accepts "ImproVoice"
- @}
+ \inherit-acceptability "ImproVoice" "Voice"
@}
@end example
@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 {
Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон.
@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' {
%% 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"
(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
--- /dev/null
+\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 }
[@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.
@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
* 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}
-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 && \
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
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
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
[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,
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)
#define PATHSEP ':'
#endif
+#include <algorithm>
+
vector<string>
File_path::directories () const
{
return dirs_;
}
-#include <algorithm>
void
File_path::parse_path (const string &p)
{
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)
#ifndef DIRECTION_HH
#define DIRECTION_HH
+#include <algorithm>
#include "axis.hh"
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) \
return min (a, b);
}
-// String direction_string (Direction, Axis);
-
#endif // DIRECTION_HH
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 */
#ifndef RATIONAL_HH
#define RATIONAL_HH
+#include "compare.hh"
#include "flower-proto.hh"
#include "std-string.hh"
#include <limits.h>
#ifndef STD_STRING_HH
#define STD_STRING_HH
-#include "compare.hh"
#include "flower-proto.hh"
#if 0
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 */
#include "std-string.hh"
#include "string-convert.hh"
+#include "std-vector.hh"
string
to_string (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)
{
-#define STD_VECTOR 1
-
-#if !STD_VECTOR
-#define Array flower_vector
-#endif
-
#define HAVE_BOOST_LAMBDA 1
#include "std-vector.hh"
#define YAFFUT_MAIN
#include "yaffut.hh"
-#if !STD_VECTOR
-#define vector flower_vector
-#endif
-
using namespace std;
template<typename T>
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;
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]);
-#define STD_VECTOR 1
-
#define HAVE_BOOST_LAMBDA 1
#include "std-vector.hh"
#include "yaffut.hh"
-#if !STD_VECTOR
-#define vector flower_vector
-#endif
-
using namespace std;
FUNC (string_split_join)
-
\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 {
}
-\relative {
- c''1 \< \break c1\! \> \break c1\!
+\relative {
+ c''1 \< \break
+ c
+ c\> \break
+ c
+ c\!
}
--- /dev/null
+\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"
+}
-\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' {
--- /dev/null
+\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! }
+}
--- /dev/null
+\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 { }
+ }
+ }
+
+}
--- /dev/null
+\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 { }
+ }
+ }
+
+}
--- /dev/null
+\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- }
+}
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 = {
\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" }
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 {
}
+% 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 {
Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон.
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);
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);
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);
}
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
// 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);
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 ())
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)
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"));
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);
}
/* 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");
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.");
{
found->push_back (me);
- if (!has_interface (me))
+ if (!has_interface<Axis_group_interface> (me))
return;
extract_grob_set (me, "elements", elements);
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);
};
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;
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]);
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;
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);
}
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);
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_;
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 ()))
{
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");
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;
struct Clef_modifier
{
DECLARE_SCHEME_CALLBACK (calc_parent_alignment, (SCM));
- DECLARE_GROB_INTERFACE ();
};
MAKE_SCHEME_CALLBACK (Clef_modifier, calc_parent_alignment, 1)
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;
{
public:
DECLARE_SCHEME_CALLBACK (height, (SCM));
- DECLARE_GROB_INTERFACE ();
};
MAKE_SCHEME_CALLBACK (Cluster_beacon, height, 1);
#include "axis-group-interface.hh"
#include "item.hh"
+#include "translator.icc"
+
class Collision_engraver : public Engraver
{
Item *col_;
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))
col_ = 0;
}
-#include "translator.icc"
-
ADD_ACKNOWLEDGER (Collision_engraver, note_column);
ADD_TRANSLATOR (Collision_engraver,
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);
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;
stems.insert (s);
}
- else if (Note_head::has_interface (s))
+ else if (has_interface<Note_head> (s))
y = Interval (-1.1, 1.1);
else
{
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);
// 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);
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
}
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 ();
}
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_);
struct Enclosing_bracket
{
- DECLARE_GROB_INTERFACE ();
public:
DECLARE_SCHEME_CALLBACK (print, (SCM));
struct Figured_bass_continuation
{
- DECLARE_GROB_INTERFACE ();
public:
DECLARE_SCHEME_CALLBACK (print, (SCM));
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);
};
= 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 ()
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. */
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);
*/
#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
return doc_hash_table;
}
-#include <map>
-
map<void *, string> type_names;
void
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 ()
{
#include "item.hh"
#include "grid-line-interface.hh"
+#include "translator.icc"
+
class Grid_line_span_engraver : public Engraver
{
Item *spanline_;
lines_.resize (0);
}
-#include "translator.icc"
ADD_ACKNOWLEDGER (Grid_line_span_engraver, grid_point);
ADD_TRANSLATOR (Grid_line_span_engraver,
/* doc */
#include "grob.hh"
#include "warn.hh"
+#include "translator.icc"
+
struct Grob_pq_entry
{
Grob *grob_;
context ()->set_property ("busyGrobs", busy);
}
-#include "translator.icc"
ADD_ACKNOWLEDGER (Grob_pq_engraver, grob);
ADD_TRANSLATOR (Grob_pq_engraver,
/* doc */
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);
}
}
/* 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)
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);
}
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 ());
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>
{
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);
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));
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;
}
else
{
- if (Text_interface::has_interface (b))
+ if (has_interface<Text_interface> (b))
{
if (!e.is_empty ())
x_points[d] = e[-d] - d * padding;
if (neighbor_found)
{
- if (Hairpin::has_interface (adjacent))
+ if (has_interface<Hairpin> (adjacent))
{
/*
Handle back-to-back hairpins with a circle in the middle
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
DECLARE_SCHEME_CALLBACK (height, (SCM));
DECLARE_SCHEME_CALLBACK (remove_tied, (SCM));
- DECLARE_GROB_INTERFACE ();
static SCM get_stencil (Grob *me);
};
vector<Grob *> *real_acc);
DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM));
- DECLARE_GROB_INTERFACE ();
};
#endif /* ACCIDENTAL_PLACEMENT_HH */
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);
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 */
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
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 */
class Bar_line
{
public:
- DECLARE_GROB_INTERFACE ();
static bool non_empty_barline (Grob *me);
};
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 *);
{
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));
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
DECLARE_SCHEME_CALLBACK (finalis, (SCM));
DECLARE_SCHEME_CALLBACK (offset_callback, (SCM element));
- DECLARE_GROB_INTERFACE ();
};
#endif // BREATHING_SIGN_HH
{
public:
DECLARE_SCHEME_CALLBACK (after_line_breaking, (SCM));
- DECLARE_GROB_INTERFACE ();
};
#endif // CHORD_NAME_HH
{
DECLARE_SCHEME_CALLBACK (calc_glyph_name, (SCM));
DECLARE_SCHEME_CALLBACK (print, (SCM));
- DECLARE_GROB_INTERFACE ();
};
#endif /* CLEF_HH */
public:
DECLARE_SCHEME_CALLBACK (print, (SCM));
DECLARE_SCHEME_CALLBACK (calc_cross_staff, (SCM));
- DECLARE_GROB_INTERFACE ();
};
#endif // CLUSTER_HH
struct Custos
{
DECLARE_SCHEME_CALLBACK (print, (SCM));
- DECLARE_GROB_INTERFACE ();
private:
static void add_streepjes (Grob *me, int pos, int interspaces, Stencil *custos_);
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));
};
{
public:
DECLARE_SCHEME_CALLBACK (print, (SCM));
- DECLARE_GROB_INTERFACE ();
};
#endif // DOTS_HH
{
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);
};
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 */
class Gregorian_ligature
{
public:
- DECLARE_GROB_INTERFACE ();
static string prefixes_to_str (Grob *);
};
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 */
#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,
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 */
/* interfaces */
bool internal_has_interface (SCM intf);
- DECLARE_GROB_INTERFACE ();
/* offsets */
void translate_axis (Real, Axis);
/* 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 */
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 *> &);
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
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);
static Stencil make_enclosing_bracket (Grob *me, Grob *refpoint,
vector<Grob *> grobs,
Axis a, Direction dir);
- DECLARE_GROB_INTERFACE ();
};
#endif /* HORIZONTAL_BRACKET_HH */
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 ();
struct Kievan_ligature
{
DECLARE_SCHEME_CALLBACK (print, (SCM));
- DECLARE_GROB_INTERFACE ();
};
#endif /* KIEVAN_LIGATURE_HH */
class Lily_lexer;
class Lily_parser;
class Listener;
-class Lookup;
class Lyric_combine_music;
class Lyric_combine_music_iterator;
class Lyric_engraver;
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);
#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
class Lyric_extender
{
public:
- DECLARE_GROB_INTERFACE ();
DECLARE_SCHEME_CALLBACK (print, (SCM));
};
{
public:
DECLARE_SCHEME_CALLBACK (set_spacing_rods, (SCM));
- DECLARE_GROB_INTERFACE ();
DECLARE_SCHEME_CALLBACK (print, (SCM));
};
public:
DECLARE_SCHEME_CALLBACK (print, (SCM));
- DECLARE_GROB_INTERFACE ();
};
#endif /* MEASURE_GROUPING_SPANNER_HH */
class Melody_spanner
{
public:
- DECLARE_GROB_INTERFACE ();
static void add_stem (Grob *, Grob *);
DECLARE_SCHEME_CALLBACK (calc_neutral_stem_direction, (SCM));
};
{
DECLARE_SCHEME_CALLBACK (brew_ligature_primitive, (SCM));
DECLARE_SCHEME_CALLBACK (print, (SCM));
- DECLARE_GROB_INTERFACE ();
};
#endif /* MENSURAL_LIGATURE_HH */
class Multi_measure_rest
{
public:
- DECLARE_GROB_INTERFACE ();
DECLARE_SCHEME_CALLBACK (print, (SCM));
DECLARE_SCHEME_CALLBACK (height, (SCM));
DECLARE_SCHEME_CALLBACK (percent, (SCM));
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
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 *);
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 *);
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,
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 *);
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);
~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 */
{
public:
DECLARE_SCHEME_CALLBACK (calc_pure_relevant_grobs, (SCM));
- DECLARE_GROB_INTERFACE ();
};
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 *);
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 */);
static Item *get_dots (Grob *);
static int dot_count (Grob *);
DECLARE_SCHEME_CALLBACK (after_line_breaking, (SCM));
- DECLARE_GROB_INTERFACE ();
};
#endif // RHYTHMIC_HEAD_HH
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);
};
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));
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);
struct Semi_tie_column
{
- DECLARE_GROB_INTERFACE ();
DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM));
DECLARE_SCHEME_CALLBACK (calc_head_direction, (SCM));
struct Semi_tie
{
- DECLARE_GROB_INTERFACE ();
DECLARE_SCHEME_CALLBACK (calc_control_points, (SCM));
static bool less (Grob *s1, Grob *s2);
struct Separation_item
{
- DECLARE_GROB_INTERFACE ();
DECLARE_SCHEME_CALLBACK (calc_skylines, (SCM));
DECLARE_SCHEME_CALLBACK (print, (SCM));
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 *);
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);
};
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 *);
};
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 */
DECLARE_SCHEME_CALLBACK (set_springs, (SCM));
DECLARE_SCHEME_CALLBACK (calc_common_shortest_duration, (SCM));
- DECLARE_GROB_INTERFACE ();
};
#endif /* SPACING_SPANNER_HH */
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);
class Staff_grouper_interface
{
public:
- DECLARE_GROB_INTERFACE ();
static bool maybe_pure_within_group (Grob *, Grob *child, bool, int, int);
};
static Real next_notes_correction (Grob *, Grob *);
public:
- DECLARE_GROB_INTERFACE ();
static Spring get_spacing (Grob *, Grob *, Real);
static Interval bar_y_positions (Grob *);
};
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);
static Interval line_span (Grob *);
DECLARE_SCHEME_CALLBACK (print, (SCM));
DECLARE_SCHEME_CALLBACK (height, (SCM));
- DECLARE_GROB_INTERFACE ();
};
#endif // STAFF_SYMBOL_HH
{
public:
- DECLARE_GROB_INTERFACE ();
DECLARE_SCHEME_CALLBACK (calc_slope, (SCM));
DECLARE_SCHEME_CALLBACK (calc_width, (SCM));
DECLARE_SCHEME_CALLBACK (calc_y_offset, (SCM));
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 *);
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);
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;
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);
};
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));
{
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 *);
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 **);
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
{
DECLARE_SCHEME_CALLBACK (brew_ligature_primitive, (SCM));
DECLARE_SCHEME_CALLBACK (print, (SCM));
- DECLARE_GROB_INTERFACE ();
};
/*
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);
&& !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 ());
}
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);
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);
}
struct Key_signature_interface
{
DECLARE_SCHEME_CALLBACK (print, (SCM));
- DECLARE_GROB_INTERFACE ();
};
/*
#include "engraver.hh"
#include "staff-symbol.hh"
+#include "translator.icc"
+
class Ledger_line_engraver : public Engraver
{
Spanner *span_;
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,
{
DECLARE_SCHEME_CALLBACK (print, (SCM));
DECLARE_SCHEME_CALLBACK (set_spacing_rods, (SCM));
- DECLARE_GROB_INTERFACE ();
};
static void
struct Ledgered_interface
{
- DECLARE_GROB_INTERFACE ();
};
ADD_INTERFACE (Ledgered_interface,
--- /dev/null
+/*
+ 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 ();
+}
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));
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);
}
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);
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));
}
? 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);
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)
{
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);
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;
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 */
// 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;
}
{
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
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");
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
{
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");
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 ())
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;
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. */
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;
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);
}
}
struct Ottava_bracket
{
DECLARE_SCHEME_CALLBACK (print, (SCM));
- DECLARE_GROB_INTERFACE ();
};
/*
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);
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++)
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 ())
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 ();
(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);
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)
#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;
}
-
Performance::Performance (bool ports)
: midi_ (0),
- ports_ (ports)
+ ports_ (ports),
+ header_ (SCM_EOL)
{
}
}
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 ();
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);
}
void
-Performance::write_output (string out) const
+Performance::write_output (string out, const string &performance_name) const
{
if (out == "-")
out = "lelie.midi";
Midi_stream midi_stream (out);
message (_f ("MIDI output to `%s'...", out));
- output (midi_stream);
+ output (midi_stream, performance_name);
progress_indication ("\n");
}
#include "warn.hh"
#include "axis-group-interface.hh"
+#include "translator.icc"
+
/*
TODO:
}
}
-#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);
struct Piano_pedal_bracket
{
DECLARE_SCHEME_CALLBACK (print, (SCM));
- DECLARE_GROB_INTERFACE ();
};
MAKE_SCHEME_CALLBACK (Piano_pedal_bracket, print, 1);
#include "stream-event.hh"
#include "warn.hh"
+#include "translator.icc"
+
class Pitched_trill_engraver : public Engraver
{
public:
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);
#include "pure-from-neighbor-interface.hh"
#include "engraver.hh"
+#include "translator.icc"
+
class Pure_from_neighbor_engraver : public Engraver
{
vector<Grob *> pure_relevants_;
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 ());
}
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,
#include "version.hh"
#include "warn.hh"
+#ifdef __MINGW32__
+#include <winbase.h>
+#endif
+
#define FRAMEWORKDIR ".."
int
return -1;
}
-#ifdef __MINGW32__
-#include <winbase.h>
-#endif
-
static void
prefix_relocation (const string &prefix)
{
#include "stream-event.hh"
#include "warn.hh"
+#include "translator.icc"
+
class Rest_collision_engraver : public Engraver
{
protected:
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)
// 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);
rest_collision_ = 0;
}
-#include "translator.icc"
-
ADD_TRANSLATOR (Rest_collision_engraver,
/* doc */
"Handle collisions of rests.",
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"));
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);
/*
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);
}
struct Text_script
{
- DECLARE_GROB_INTERFACE ();
};
ADD_INTERFACE (Text_script,
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]);
}
{
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.
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);
(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");
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 *
{
Item *it = i.item ();
- if (Note_spacing::has_interface (it))
+ if (has_interface<Note_spacing> (it))
{
current_spacings_.note_spacings_.push_back (it);
return;
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]);
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"),
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);
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")))
: 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);
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;
// 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);
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_);
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))
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);
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);
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_;
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))
{
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++)
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, "");
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--;)
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);
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--;)
|| 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
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);
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);
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);
{
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_);
/*
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"));
{
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;
/*
#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.
note_columns_.clear ();
}
-#include "translator.icc"
-
ADD_ACKNOWLEDGER (Span_arpeggio_engraver, arpeggio);
ADD_ACKNOWLEDGER (Span_arpeggio_engraver, note_column);
ADD_TRANSLATOR (Span_arpeggio_engraver,
#include "pointer-group-interface.hh"
#include "lily-imports.hh"
+#include "translator.icc"
+
/**
Make bars that span multiple "staves". Catch bars, and span a
bars_.resize (0);
}
-#include "translator.icc"
-
ADD_ACKNOWLEDGER (Span_bar_engraver, bar_line);
ADD_TRANSLATOR (Span_bar_engraver,
/* doc */
#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
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,
#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 ()
*/
int Staff_performer::channel_count_ = 0;
int Staff_performer::staff_performer_count_ = 0;
-#include "translator.icc"
-
ADD_TRANSLATOR (Staff_performer,
/* doc */
"",
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);
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);
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");
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);
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;
*/
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);
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);
{
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);
}
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;
}
}
}
- while (flip (&d) != DOWN);
if (thick > 0.0)
{
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++)
{
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);
}
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));
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);
}
#include "staff-symbol.hh"
#include "system-start-delimiter.hh"
+#include "translator.icc"
+
struct Bracket_nesting_node
{
public:
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);
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);
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 ();
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]);
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");
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);
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 ());
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]);
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)
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)
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
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
// 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
)
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);
{
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);
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];
{
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);
%}
-\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"
%}
-\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"
% 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))))))))
\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")))))
\accepts "FiguredBass"
\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"
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"
\accepts "ChordNames"
\accepts "Devnull"
\accepts "DrumStaff"
+ \accepts "Dynamics"
\accepts "FiguredBass"
\accepts "FretBoards"
\accepts "GrandStaff"
\accepts "Lyrics"
\accepts "MensuralStaff"
\accepts "NoteNames"
+ \accepts "OneStaff"
\accepts "PetrucciStaff"
\accepts "PianoStaff"
\accepts "RhythmicStaff"
#(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?)
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)
(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.")
\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
#(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
--- /dev/null
+<?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>
--- /dev/null
+<?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>
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)
$< --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) \
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)
$(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)
+++ /dev/null
-<?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>
#
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"
#: 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"
#: 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"
"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"
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"
"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"
#. "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 ""
"(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"
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"
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"
"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."
"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"
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"
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)"
"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 ""
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"
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"
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"
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"
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"
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 »"
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."
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"
"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)"
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 »"
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..."
"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é"
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 »"
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."
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"
"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'"
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."
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"
"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"
"é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."
"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"
"é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"
"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."
"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"
"%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 »."
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"
"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 ""
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"
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"
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"
"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"
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"
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 »..."
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"
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"
"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"
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"
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 ""
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 ""
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"
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 »"
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"
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)"
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 »"
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 ""
"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 »..."
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"
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"
"(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"
"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"
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"
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 { ... }"
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
#
# 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
#: 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"
#: 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 ""
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."
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"
"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"
#. "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"
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"
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"
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"
"%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."
"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"
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"
#: 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
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"
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»"
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"
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"
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"
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"
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»"
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"
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"
"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"
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"
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..."
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"
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»"
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"
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"
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'"
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."
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"
"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"
"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."
"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"
"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"
"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."
"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"
"%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"
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»"
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\""
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"
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"
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"
"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»"
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"
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»..."
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"
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"
"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"
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"
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?"
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"
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"
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»"
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"
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)"
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»"
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."
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..."
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"
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"
"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"
"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"
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"
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 { ... }"
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
#, 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"
#: 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
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 ""
#. "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"
#: 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
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 ""
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 ""
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 ""
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 ""
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'"
msgid "Parsing..."
msgstr ""
-#: lookup.cc:181
+#: lookup.cc:178
#, c-format
msgid "Not drawing a box with negative dimension, %.2f by %.2f."
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 ""
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 ""
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 ""
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 ""
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 ""
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 ""
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 ""
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"
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 ""
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
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
(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
(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))
(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?)
(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)))
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))))
(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))
; '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")
(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")
(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"
((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)
(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)))
(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
(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
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)
((#\-) 0)
((#\| #\o) c)
(else c)))
- (string->list definition-string)))
+ (string->list (remove-whitespace definition-string))))
;; Analyze the pedal-list: Return (pedalcount . (divider positions))
(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")
(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)))
;;;;;;;;;;;;;;;;;;;;;;
;;; 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)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
+;;; 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)))))))
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."
(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))
`(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},
+++ /dev/null
-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
+++ /dev/null
-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
@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
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)
-rmdir $(DESTDIR)$(local_lilypond_datadir)/tex
all: $(INSTALLATION_FILES)
-
-local-WWW-1: $(outdir)/lilypond.map
+++ /dev/null
-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
% 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{}
% 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
% 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
% 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}
}
% Commands to set the quote options.
-%
+%
\parseargdef\codequoteundirected{%
\def\temp{#1}%
\ifx\temp\onword
% 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
\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
\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.
% 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
\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}
\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}
% *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{%
\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
\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
\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
% 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
}
% 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
% 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'']}%
% @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.
%
% 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}}}
%
% 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
%
% 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
\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
}
% Subsections.
-%
+%
% normally calls numberedsubseczzz:
\outer\parseargdef\numberedsubsec{\numhead2{#1}}
\def\numberedsubseczzz#1{%
}
% Subsubsections.
-%
+%
% normally numberedsubsubseczzz:
\outer\parseargdef\numberedsubsubsec{\numhead3{#1}}
\def\numberedsubsubseczzz#1{%
% @indentedblock is like @quotation, but indents only on the left and
% has no optional argument.
-%
+%
\makedispenvdef{indentedblock}{\indentedblockstart}
%
\def\indentedblockstart{%
% 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}}
% @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
\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
}
\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
% ... 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{%
\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
% 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
% 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).
%
%
% 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
\def\parsemmanyargdef@@#1,{%
\if#1;\let\next=\relax
- \else
+ \else
\let\next=\parsemmanyargdef@@
\edef\tempb{\eatspaces{#1}}%
\expandafter\def\expandafter\tempa
% 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
\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
\fi
}
-%
+% Internal for \getargsval@.
+%
\def\getargvals@@{%
\ifx\paramlist\nilm@
% Some sanity check needed here that \argvaluelist is also empty.
}
% 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
\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@
\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@
\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.
\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{%
\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
\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{%
\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}
% 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
\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
\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}%
%
\ifimagevmode
\medskip % space after a standalone image
- \fi
+ \fi
\ifx\centersub\centerV \egroup \fi
\endgroup}
\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{\={}}
\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}
% @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
\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
% 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
\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}
\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}
\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}
\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}}
\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}
\DeclareUnicodeCharacter{2212}{\minus}
\DeclareUnicodeCharacter{2217}{\point}
+ \DeclareUnicodeCharacter{2225}{\ensuremath\parallel}
\DeclareUnicodeCharacter{2261}{\equiv}
}% end of \utfeightchardefs
\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\_}
\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.
@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.
-% $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.
-% $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
\gdef\putwordAppendix{Appendix}
\gdef\putwordChapter{Chapter}
+\gdef\putworderror{error}
\gdef\putwordfile{file}
\gdef\putwordin{in}
\gdef\putwordIndexIsEmpty{(Index is empty)}
-% $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
\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}
-% $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.
+% $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
-% $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.
-% $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.