Heikki Junes <hjunes>
Heikki Junes <hjunes@gmail.com>
Heikki Junes <hjunes@hjunes-laptop.(none)>
+Heikki Tauriainen <g034737@welho.com>
Hu Haipeng <hhpmusic@163.com>
Ian Hulin <ian@hulin.org.uk>
James E. Bailey <derhindemith@googlemail.com>
* only show user-visible changes.
@end ignore
+@item
+Support for cross-staff stems on chords, using @code{crossStaff}
+and the @code{Span_stem_engraver}. This calculates the length of
+cross-staff stems automatically.
+@lilypondfile[quote]
+{cross-staff-stems.ly}
+
+@item
+The syntax of words (character sequences recognized without enclosing
+quotes) and commands (now always a backslash @samp{\} followed by a
+word) has been unified across all modes: it now consists of alphabetic
+characters, possibly enclosing isolated dashes @samp{-} and underlines
+@samp{_}.
+
+As one consequence, using unquoted text scripts like (literally!)
+@example
+@{ c-script c\f_script @}
+@end example
+will now tend to result in invalid music. Omitting quote marks
+for arbitrary text rather than keywords has never been good practice or
+even documented, and it is unlikely to have seen significant use.
+
+Staying with established conventions (like not using dashes or
+underlines for command names intended to be used inside of music)
+remains advisable. The reason for this change is more robust
+recognition of LilyPond's lexical units for LilyPond itself as well as
+external tools interpreting its syntax.
+
@item
Support for Kievan square notation:
@lilypond[quote,relative=1,verbatim]
premature evaluation. There are also @q{splicing} operators @code{$@@}
and @code{#@@} for interpreting the members of a list individually.
+@item
+To reduce the necessity for using @code{$}, Scheme expressions written
+with @code{#} are interpreted as music inside of music lists, and as
+markups or markup lists inside of markups.
+
@item
Support for jazz-like chords has been improved: Lydian and altered
chords are recognised; separators between chord modifiers are now
@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
+
@c ***** Displaying text *****
(ps), grobs (pgrob), and parsed music expressions (pmusic).
@example
-file lily/out/lilypond
+file ~/lilypond-git/build/out/bin/lilypond
b programming_error
b Grob::programming_error
@subheading Typical developer's edit/compile/test cycle
-TODO: is @code{[-j@var{X} CPU_COUNT=@var{X}]} useful for
-@code{test-baseline}, @code{check}, @code{clean},
-@code{test-redo}? Neil Puttock says it is useful for
-everything but @code{clean}, which is disk-limited.
-Need to check formally.
-
@itemize
@item
Initial test:
@example
make [-j@var{X}]
-make test-baseline
+make [-j@var{X} CPU_COUNT=@var{X}] test-baseline
make [-j@var{X} CPU_COUNT=@var{X}] check
@end example
@example
@emph{## edit source files, then...}
-make clean @emph{## only if needed (see below)}
-make [-j@var{X}] @emph{## only if needed (see below)}
-make test-redo @emph{## redo files differing from baseline}
-make [-j@var{X} CPU_COUNT=@var{X}] check @emph{## CPU_COUNT here?}
+make clean @emph{## only if needed (see below)}
+make [-j@var{X}] @emph{## only if needed (see below)}
+make [-j@var{X} CPU_COUNT=@var{X}] test-redo @emph{## redo files differing from baseline}
+make [-j@var{X} CPU_COUNT=@var{X}] check
@end example
@item
like those in the @file{scm/} and @file{ly/} directories, then
@command{make} is not needed before @command{make test-redo}.
-TODO: Fix the following paragraph. You can do @command{rm mf/out/*}
-instead of make clean, and you can probably do
-@command{make -C mf/ clean} as well, but I haven't checked it -- cds
-
Also, if you modify any font definitions in the @file{mf/}
directory then you must run @command{make clean} and
@command{make} before running @command{make test-redo}. This will
important differences that your change introduced, whether in the
layout, MIDI, performance or error reporting.
+You only need to use @command{make test-clean} to start from
+scratch, prior to running @command{make@tie{}test-baseline}. To
+check new modifications, all that is needed is to repeat
+@command{make@tie{}test-redo} and @command{make@tie{}test-check}
+(not forgetting @command{make} if needed).
+
Guide, node Updating translation committishes.
@end ignore
-@c \version "2.15.42"
+@c \version "2.15.43"
@c Translators: Till Paala
Das vorherige Beispiel könnte auch folgenderweise geschrieben werden:
@lilypond[quote,verbatim]
-"custom-tuning" = \stringTuning <c' g' d'' a''>
+custom-tuning = \stringTuning <c' g' d'' a''>
mynotes = {
c'4 e' g' c'' |
@lilypond[quote,verbatim,relative=2]
\time 3/4
-% By default we beam in one
-\repeat unfold 6 { a8 }
-% We can avoid beaming in one
-\set Timing.beamWholeMeasure = ##f
-\repeat unfold 6 { a8 }
+% by default we beam in (6) due to beamExceptions
+\repeat unfold 6 {a8} |
+% This will beam (1 1 1) due to beatLength
+\set Timing.beamExceptions = #'()
+\repeat unfold 6 {a8}
@end lilypond
In einigen Notenstichen der romantischen und klassischen Periode kann auch
@lilypond[quote,verbatim,relative=2]
\time 3/4
-% By default we avoid half-measure beams
r4. a8 a a |
-% We can allow half-measure beams
-\set Timing.beamHalfMeasure = ##t
+\set Timing.beamHalfMeasure = ##f
r4. a8 a a |
@end lilypond
Guide, node Updating translation committishes..
@end ignore
-@c \version "2.15.42"
+@c \version "2.15.43"
@node Instrumentos de cuerda con trastes
@section Instrumentos de cuerda con trastes
como sigue:
@lilypond[quote,verbatim]
-"custom-tuning" = \stringTuning <c' g' d'' a''>
+custom-tuning = \stringTuning <c' g' d'' a''>
mynotes = {
c'4 e' g' c'' |
@lilypond[quote,verbatim,relative=2]
\time 3/4
-% by default we beam in (3) due to beamExceptions
+% by default we beam in (6) due to beamExceptions
\repeat unfold 6 {a8} |
% This will beam (1 1 1) due to beatLength
\set Timing.beamExceptions = #'()
\clef bass
R1
\clef treble
- \new CueVoice { \set "instrumentCueName" = "flute" }
+ \new CueVoice { \set instrumentCueName = "flute" }
\cueDuring #"flute" #UP { R1 }
\clef bass
g4. b8 d2
bassoonNotes = \relative c {
\clef bass
R1
- \new CueVoice { \set "instrumentCueName" = "flute" }
+ \new CueVoice { \set instrumentCueName = "flute" }
\cueDuringWithClef #"flute" #UP #"treble" { R1 }
g4. b8 d2
}
R1
\tag #'part {
\clef treble
- \new CueVoice { \set "instrumentCueName" = "flute" }
+ \new CueVoice { \set instrumentCueName = "flute" }
}
\cueDuring #"flute" #UP { R1 }
\tag #'part \clef bass
\override Stem #'length = #(* 7.0 mag)
\override NoteHead #'font-size =
#(inexact->exact (* (/ 6.0 (log 2.0)) (log mag)))
- $music
+ #music
\revert Stem #'length
\revert NoteHead #'font-size
#})
"Draw a double box around text."
(interpret-markup layout props
#@{\markup \override #'(box-padding . 0.4) \box
- \override #'(box-padding . 0.6) \box @{ $text @}#@}))
+ \override #'(box-padding . 0.6) \box @{ #text @}#@}))
@end lisp
or, equivalently
(interpret-markup layout props
#@{\markup \override #`(box-padding . ,inter-box-padding) \box
\override #`(box-padding . ,box-padding) \box
- @{ $text @} #@}))
+ @{ #text @} #@}))
@end lisp
Again, the equivalent version using the markup macro would be:
(interpret-markup layout props
#{\markup \override #`(box-padding . ,inter-box-padding) \box
\override #`(box-padding . ,box-padding) \box
- { $text } #}))
+ { #text } #}))
\markup \double-box A
\markup \override #'(inter-box-padding . 0.8) \double-box A
#(define-markup-list-command (paragraph layout props args) (markup-list?)
#:properties ((par-indent 2))
(interpret-markup-list layout props
- #@{\markuplist \justified-lines @{ \hspace #par-indent $args @} #@}))
+ #@{\markuplist \justified-lines @{ \hspace #par-indent #args @} #@}))
@end example
consistent with the current Lilypond mode are accepted.
The immediate action of @code{$} can lead to surprises, @ref{Input
-variables and Scheme}. Using @code{#} where the parser supports it is
-usually preferable.
+variables and Scheme}. Using @code{#} where the parser supports it
+is usually preferable. Inside of music expressions, expressions
+created using @code{#} @emph{are} interpreted as music. However,
+they are @emph{not} copied before use. If they are part of some
+structure that might still get used, you may need to use
+@code{ly:music-deep-copy} explicitly.
@funindex $@@
@funindex #@@
@example
...
-@{ $@@newLa @}
+@{ #@@newLa @}
@end example
Here, every element of the list stored in @code{newLa} is taken in
sequence and inserted into the list, as if we had written
@example
-@{ $(first newLa) $(second newLa) @}
+@{ #(first newLa) #(second newLa) @}
@end example
Now in all of these forms, the Scheme code is evaluated while the
@example
@{
- $(with-output-to-file "display.txt"
+ #(with-output-to-file "display.txt"
(lambda () #@{ \displayMusic @{ c'4\f @} #@}))
@}
@end example
@lilypond[quote,verbatim,ragged-right]
tempoPadded = #(define-music-function (parser location padding tempotext)
- (number? string?)
+ (number? markup?)
#{
- \once \override Score.MetronomeMark #'padding = $padding
+ \once \override Score.MetronomeMark #'padding = #padding
\tempo \markup { \bold #tempotext }
#})
\relative c'' {
\tempo \markup { "Low tempo" }
c4 d e f g1
- \tempoPadded #4.0 #"High tempo"
+ \tempoPadded #4.0 "High tempo"
g4 f e d c1
}
@end lilypond
@lilypond[quote,verbatim,ragged-right]
pattern = #(define-music-function (parser location x y) (ly:music? ly:music?)
#{
- $x e8 a b $y b a e
+ #x e8 a b #y b a e
#})
\relative c''{
Guide, node Updating translation committishes..
@end ignore
-@c \version "2.15.42"
+@c \version "2.15.43"
@c Translators: Matthieu Jacquot
@c Translation checkers: Jean-Charles Malahieude
Nous pourrions donc écrire l'exemple précédent ainsi :
@lilypond[quote,verbatim]
-"custom-tuning" = \stringTuning <c' g' d'' a''>
+custom-tuning = \stringTuning <c' g' d'' a''>
mynotes = {
c'4 e' g' c'' |
@lilypond[quote,verbatim,relative=2]
\time 3/4
-% by default we beam in (3) due to beamExceptions
+% by default we beam in (6) due to beamExceptions
\repeat unfold 6 {a8} |
% This will beam (1 1 1) due to beatLength
\set Timing.beamExceptions = #'()
\clef bass
R1
\clef treble
- \new CueVoice { \set "instrumentCueName" = "flute" }
+ \new CueVoice { \set instrumentCueName = "flute" }
\cueDuring #"flute" #UP { R1 }
\clef bass
g4. b8 d2
bassoonNotes = \relative c {
\clef bass
R1
- \new CueVoice { \set "instrumentCueName" = "flute" }
+ \new CueVoice { \set instrumentCueName = "flute" }
\cueDuringWithClef #"flute" #UP #"treble" { R1 }
g4. b8 d2
}
R1
\tag #'part {
\clef treble
- \new CueVoice { \set "instrumentCueName" = "flute" }
+ \new CueVoice { \set instrumentCueName = "flute" }
}
\cueDuring #"flute" #UP { R1 }
\tag #'part \clef bass
Guide, node Updating translation committishes..
@end ignore
-@c \version "2.15.42"
+@c \version "2.15.43"
@c Translators: Yoshiki Sawada
@c Translation status: post-GDP
上記の例を、以下のように書き換えることができます:
@lilypond[quote,verbatim]
-"custom-tuning" = \stringTuning <c' g' d'' a''>
+custom-tuning = \stringTuning <c' g' d'' a''>
mynotes = {
c'4 e' g' c'' |
@c KEEP LY
@lilypond[quote,verbatim,relative=2]
\time 3/4
-% デフォルトでは beamExceptions のため、(3) の連桁になります
+% デフォルトでは beamExceptions のため、(6) の連桁になります
\repeat unfold 6 {a8} |
% 以下は beatLength のため、(1 1 1) の連桁になります
\set Timing.beamExceptions = #'()
(parser location padding)
(number?)
#{
- \once \override TextScript #'padding = $padding
+ \once \override TextScript #'padding = #padding
#})
\relative c''' {
)
fraction = #(define-music-function (parser location music) (ly:music?)
- #{ \tweak #'text #tuplet-number::calc-fraction-text $music #})
+ #{ \tweak #'text #tuplet-number::calc-fraction-text #music #})
triangle = #(define-music-function (parser location music) (ly:music?)
- #{ \once \set shapeNoteStyles = #'#(do do do do do do do) $music #})
+ #{ \once \set shapeNoteStyles = #'#(do do do do do do do) #music #})
semicircle = #(define-music-function (parser location music) (ly:music?)
- #{ \once \set shapeNoteStyles = #'#(re re re re re re re) $music #})
+ #{ \once \set shapeNoteStyles = #'#(re re re re re re re) #music #})
blackdiamond = #(define-music-function (parser location music) (ly:music?)
- #{ \once \set shapeNoteStyles = #'#(mi mi mi mi mi mi mi) $music #})
+ #{ \once \set shapeNoteStyles = #'#(mi mi mi mi mi mi mi) #music #})
tiltedtriangle = #(define-music-function (parser location music) (ly:music?)
- #{ \once \set shapeNoteStyles = #'#(fa fa fa fa fa fa fa) $music #})
+ #{ \once \set shapeNoteStyles = #'#(fa fa fa fa fa fa fa) #music #})
square = #(define-music-function (parser location music) (ly:music?)
- #{ \once \set shapeNoteStyles = #'#(la la la la la la la) $music #})
+ #{ \once \set shapeNoteStyles = #'#(la la la la la la la) #music #})
wedge = #(define-music-function (parser location music) (ly:music?)
- #{ \once \set shapeNoteStyles = #'#(ti ti ti ti ti ti ti) $music #})
+ #{ \once \set shapeNoteStyles = #'#(ti ti ti ti ti ti ti) #music #})
harmonic = #(define-music-function (parser location music) (ly:music?)
- #{ \once \set shapeNoteStyles = #'#(harmonic harmonic harmonic harmonic harmonic harmonic harmonic) $music #})
+ #{ \once \set shapeNoteStyles = #'#(harmonic harmonic harmonic harmonic harmonic harmonic harmonic) #music #})
cross = #(define-music-function (parser location music) (ly:music?)
- #{ \once \set shapeNoteStyles = #'#(cross cross cross cross cross cross cross) $music #})
+ #{ \once \set shapeNoteStyles = #'#(cross cross cross cross cross cross cross) #music #})
white = #(define-music-function (parser location music) (ly:music?)
- #{ \once \override NoteHead #'duration-log = #1 $music #})
+ #{ \once \override NoteHead #'duration-log = #1 #music #})
@knownissues
-Usually the order in which the engravers are specified
-does not matter, but in a few special cases the order
-is important, for example where one engraver writes
-a property and another reads it, or where one engraver
-creates a grob and another must process it. The order in
-which the engravers are specified is the order in which
-they are called to carry out their processing.
-
-The following orderings are important: the
-@code{Bar_engraver} must normally be first, and
-the @code{New_fingering_engraver} must come before
-the @code{Script_column_engraver}. There may be others
-with ordering dependencies.
+The order in which the engravers are specified is the order in
+which they are called to carry out their processing. Usually the
+order in which the engravers are specified does not matter, but in
+a few special cases the order is important, for example where one
+engraver writes a property and another reads it, or where one
+engraver creates a grob and another must process it.
+
+The following orderings are important:
+
+@itemize
+@item
+the @code{Bar_engraver} must normally be first,
+
+@item
+the @code{New_fingering_engraver} must come before the
+@code{Script_column_engraver},
+
+@item
+the @code{Timing_translator} must come before the
+@code{Bar_number_engraver}.
+
+@end itemize
+
+@seealso
+Installed Files:
+@file{ly/engraver-init.ly}.
+
@node Changing context default settings
@subsection Changing context default settings
@item @code{@var{@dots{}music@dots{}}}
@tab normal LilyPond input, using @code{$} (in places where only
Lilypond constructs are allowed) or @code{#} (to use it as a Scheme
-value or music function argument) to reference arguments
+value or music function argument or music inside of music lists) to
+reference arguments
(eg. @samp{#arg1}).
@end multitable
\tweak NoteHead #'text
\markup \musicglyph #"custodes.mensural.u0"
\tweak Stem #'stencil ##f
- $note
+ #note
#})
\relative c' { c4 d e f \custosNote g }
@cindex notes, ghost
@cindex notes, parenthesized
@cindex parentheses
+@cindex brackets
@funindex \parenthesize
@funindex parenthesize
Guide, node Updating translation committishes..
@end ignore
-@c \version "2.15.42"
+@c \version "2.15.43"
@node Fretted string instruments
@section Fretted string instruments
The previous example could also be written as follows:
@lilypond[quote,verbatim]
-"custom-tuning" = \stringTuning <c' g' d'' a''>
+custom-tuning = \stringTuning <c' g' d'' a''>
mynotes = {
c'4 e' g' c'' |
@node Default layout of book and score title blocks
@unnumberedsubsubsec Default layout of book and score title blocks
-The layout and formatting of title blocks are controlled by two
-@code{\paper} variables; @code{bookTitleMarkup} for the main
-@code{\header} title block and @code{scoreTitleMarkup} for individual
-@code{\header} blocks within a @code{\score}.
+This example demonstrates all @code{\header} variables:
-@lilypond[papersize=a6,quote,verbatim,noragged-right]
-\header {
- % The following fields are centered
- dedication = "Dedication"
- title = "Title"
- subtitle = "Subtitle"
- subsubtitle = "Subsubtitle"
- instrument = "Instrument"
-
- % The following fields are left-aligned on the left side
- poet = "Poet"
- meter = "Meter"
-
- % The following fields are right-aligned on the right side
- composer = "Composer"
- arranger = "Arranger"
-}
-
-\score {
- { s1 }
+@lilypond[papersize=a7,quote,verbatim,noragged-right]
+\book {
\header {
- % The following fields are placed at opposite ends of the same line
- piece = "Piece"
- opus = "Opus"
+ % The following fields are centered
+ dedication = "Dedication"
+ title = "Title"
+ subtitle = "Subtitle"
+ subsubtitle = "Subsubtitle"
+ % The following fields are evenly spread on one line
+ % the field "instrument" also appears on following pages
+ instrument = \markup \with-color #green "Instrument"
+ poet = "Poet"
+ composer = "Composer"
+ % The following fields are placed at opposite ends of the same line
+ meter = "Meter"
+ arranger = "Arranger"
+ % The following fields are centered at the bottom
+ tagline = "tagline goes at the bottom of the last page"
+ copyright = "copyright goes at the bottom of the first page"
+ }
+ \score {
+ { s1 }
+ \header {
+ % The following fields are placed at opposite ends of the same line
+ piece = "Piece 1"
+ opus = "Opus 1"
+ }
+ }
+ \score {
+ { s1 }
+ \header {
+ % The following fields are placed at opposite ends of the same line
+ piece = "Piece 2 on the same page"
+ opus = "Opus 2"
+ }
+ }
+ \pageBreak
+ \score {
+ { s1 }
+ \header {
+ % The following fields are placed at opposite ends of the same line
+ piece = "Piece 3 on a new page"
+ opus = "Opus 3"
+ }
}
}
@end lilypond
-@c Is the bit about \null markups true? -mp
+Note that
+@itemize
+@item
+The instrument name will be repeated on every page.
+
+@item
+Only @code{piece} and @code{opus} are printed in a @code{\score}
+when the paper variable @code{print-all-headers} is set to
+@code{##f} (the default).
+
+@item
+@c Is the bit about \null markups true? -mp
Text fields left unset in a @code{\header} block are replaced with
@code{\null} markups so that the space is not wasted.
+@item
The default settings for @code{scoreTitleMarkup} place the @code{piece}
and @code{opus} text fields at opposite ends of the same line.
+@end itemize
+
+To change the default layout see @ref{Custom layout for title blocks}.
+
@cindex breakbefore
Use the @code{breakbefore} variable inside a @code{\header} block
@rlearning{How LilyPond input files work},
Notation Reference:
+@ref{Custom layout for title blocks},
@ref{File structure}.
Installed Files:
@node Custom layout for title blocks
@unnumberedsubsubsec Custom layout for title blocks
+@cindex bookTitleMarkup
+@cindex scoreTitleMarkup
+@funindex bookTitleMarkup
+@funindex scoreTitleMarkup
+
@code{\markup} commands in the @code{\header} block are useful for
simple text formatting, but they do not allow precise control over the
placement of titles. To customize the placement of the text fields,
-use either or both of the following @code{\paper} variables:
+change either or both of the following @code{\paper} variables:
@itemize
@item @code{bookTitleMarkup}
@item @code{scoreTitleMarkup}
@end itemize
-These markup variables are discussed in
+The placement of titles when using the default values of these
+@code{\markup} variables is shown in the examples in
@ref{Default layout of book and score title blocks}.
The default settings for @code{scoreTitleMarkup} as defined in
@cindex cross staff chords
@funindex Stem
-@funindex cross-staff
-@funindex length
-@funindex flag-style
+@funindex \crossStaff
+@funindex \autoBeamOff
+@funindex Span_stem_engraver
-Chords that cross staves may be produced:
+Chords that cross staves may be produced using the
+@code{Span_stem_engraver}. Care must be taken to ensure that
+automatic beams do not beam the notes on one staff when it’s not
+required on the other.
-@lilypond[verbatim,quote]
-\new PianoStaff <<
- \new Staff {
- \relative c' {
- f8 e4 d8 d f e4
- }
- }
- \new Staff {
- \relative c' {
- << {
- \clef bass
- % stems may overlap the other staff
- \override Stem #'cross-staff = ##t
- % extend the stems to reach the other staff
- \override Stem #'length = #12
- % do not print extra flags
- \override Flag #'style = #'no-flag
- % prevent beaming as needed
- a8 g4 f8 f bes\noBeam g4
- }
- \\
- {
- f,2 bes4 c
- } >>
- }
- }
->>
-@end lilypond
+@lilypondfile[verbatim,quote]
+{cross-staff-stems.ly}
@snippets
@lilypondfile[verbatim,quote,texidoc,doctitle]
@lilypond[verbatim,quote]
forget = #(define-music-function (parser location music) (ly:music?) #{
\accidentalStyle "forget"
- $music
+ #music
\accidentalStyle "modern"
#})
{
@lilypond[quote,verbatim,relative=2]
\time 3/4
-% by default we beam in (3) due to beamExceptions
+% by default we beam in (6) due to beamExceptions
\repeat unfold 6 {a8} |
% This will beam (1 1 1) due to beatLength
\set Timing.beamExceptions = #'()
\MyCadenza c'1
}
\new Staff {
- $(mmrest-of-length MyCadenza)
+ #(mmrest-of-length MyCadenza)
c'1
- $(skip-of-length MyCadenza)
+ #(skip-of-length MyCadenza)
c'1
}
>>
\clef bass
R1
\clef treble
- \new CueVoice { \set "instrumentCueName" = "flute" }
+ \new CueVoice { \set instrumentCueName = "flute" }
\cueDuring #"flute" #UP { R1 }
\clef bass
g4. b8 d2
bassoonNotes = \relative c {
\clef bass
R1
- \new CueVoice { \set "instrumentCueName" = "flute" }
+ \new CueVoice { \set instrumentCueName = "flute" }
\cueDuringWithClef #"flute" #UP #"treble" { R1 }
g4. b8 d2
}
R1
\tag #'part {
\clef treble
- \new CueVoice { \set "instrumentCueName" = "flute" }
+ \new CueVoice { \set instrumentCueName = "flute" }
}
\cueDuring #"flute" #UP { R1 }
\tag #'part \clef bass
\header {
lsrtags = "staff-notation, tweaks-and-overrides, contexts-and-engravers"
- texidoc = "This file demonstrates a scheme engraver that
-connects stems across staves. The stem length need not be specified, as
-the code takes care of the variable distance between noteheads and staves."
+ texidoc = "
+This snippet shows the use of the @code{Span_stem_engraver}
+and @code{\\crossStaff} to connect stems across staves automatically.
+The stem length need not be specified, as the variable distance
+between noteheads and staves is calculated automatically.
+"
doctitle = "Cross staff stems"
} % begin verbatim
\new PianoStaff <<
\new Staff {
<b d'>4 r d'16\> e'8. g8 r\!
+ e'8 f' g'4 e'2
}
- \new Staff {
- \clef bass
+ \new Staff {
+ \clef bass
\voiceOne
\autoBeamOff
\crossStaff { <e g>4 e, g16 a8. c8} d
+ \autoBeamOn
+ g8 f g4 c2
}
>>
}
\header {
lsrtags = "staff-notation, tweaks-and-overrides, contexts-and-engravers"
- texidoc = "This file demonstrates a scheme engraver that
-connects stems across staves. The stem length need not be specified, as
-the code takes care of the variable distance between noteheads and staves."
+ texidoc = "
+This snippet shows the use of the @code{Span_stem_engraver}
+and @code{\crossStaff} to connect stems across staves automatically.
+The stem length need not be specified, as the variable distance
+between noteheads and staves is calculated automatically.
+"
doctitle = "Cross staff stems"
}
\new PianoStaff <<
\new Staff {
<b d'>4 r d'16\> e'8. g8 r\!
+ e'8 f' g'4 e'2
}
- \new Staff {
- \clef bass
+ \new Staff {
+ \clef bass
\voiceOne
\autoBeamOff
\crossStaff { <e g>4 e, g16 a8. c8} d
+ \autoBeamOn
+ g8 f g4 c2
}
>>
}
@newsItem
-@subsubheading Release candidate withdrawn @emph{July 11, 2012}
-
-We have discovered a regression since 2.14.2, so lilypond 2.15.41
-is no longer a candidate for the 2.16.0 release. However, please
-continue testing it -- we would like to discover (and fix!) any
-more regressions as soon as possible. If you discover any
-problems, please send us @ref{Bug reports}.
-
-@newsEnd
-
-
-@newsItem
-@subsubheading Release candidate 8 of 2.16 - LilyPond 2.15.41 released! @emph{July 4, 2012}
+@subsubheading LilyPond 2.15.42 released! @emph{August 02, 2012}
-LilyPond 2.15.41 is out; this is the eighth release candidate of
-the upcoming 2.16 stable release. All users are invited to
-experiment with this version. New features since 2.14.2 are
-listed in the @qq{Changes} manual on the website section about
-@ref{Development}.
+We are happy to announce the release of LilyPond 2.15.42. This
+release contains the usual number of bugfixes.
-There are no known Critical issues with this release. If no
-Critical bugs are found, then the official 2.16.0 release will be
-on 18 July 2012. If you discover any problems, please send us
-@ref{Bug reports}.
+It is strongly recommended that normal users do @strong{not} use
+this release, and instead use the stable 2.14 version. Please
+note that due to a few Critical bugs, this is not the next release
+candidate.
@newsEnd
@newsItem
-@subsubheading LilyPond 2.15.40 released! @emph{June 05, 2012}
+@subsubheading The LilyPond Report #27. @emph{August 2, 2012}
-We are happy to announce the release of LilyPond 2.15.40. This
-release contains the usual number of bugfixes.
+The @emph{LilyPond Report} is back, with some interesting insights on
+new Scheme-related features recently added by our community’s only paid
+developer David Kastrup (thanks to your
+@uref{http://lilypond.org/sponsoring.html, continuing donations}). Also
+to be found in this issue are an overview of some lesser-known LilyPond
+companion projects, and a handful of more shallow factoids.
-It is strongly recommended that normal users do @strong{not} use
-this release, and instead use the stable 2.14 version. Please
-note that due to a few Critical bugs, this is not the next release
-candidate.
+Come
+@uref{http://news.lilynet.net/?The-LilyPond-Report-27, read
+LilyPond Report 27} now; comments and contributions are
+warmly encouraged!
@newsEnd
@newsItem
-@subsubheading Release candidate withdrawn @emph{June 01, 2012}
+@subsubheading Release candidate withdrawn @emph{July 11, 2012}
-We have discovered a regression since 2.14.2, so lilypond 2.15.39
+We have discovered a regression since 2.14.2, so lilypond 2.15.41
is no longer a candidate for the 2.16.0 release. However, please
continue testing it -- we would like to discover (and fix!) any
more regressions as soon as possible. If you discover any
@newsItem
-@subsubheading Release candidate 7 of 2.16 - LilyPond 2.15.39 released! @emph{May 22, 2012}
+@subsubheading Release candidate 8 of 2.16 - LilyPond 2.15.41 released! @emph{July 4, 2012}
-LilyPond 2.15.39 is out; this is the seventh release candidate of
+LilyPond 2.15.41 is out; this is the eighth release candidate of
the upcoming 2.16 stable release. All users are invited to
experiment with this version. New features since 2.14.2 are
listed in the @qq{Changes} manual on the website section about
There are no known Critical issues with this release. If no
Critical bugs are found, then the official 2.16.0 release will be
-on 05 June 2012. If you discover any problems, please send us
+on 18 July 2012. If you discover any problems, please send us
@ref{Bug reports}.
@newsEnd
-
-
-@newsItem
-@subsubheading The LilyPond Report #26. @emph{May 22, 2012}
-
-The @emph{LilyPond Report} is back, with a new editor on board -
-Pavel Roskin, who tells us about his adventures in strange lands
-of compiler bugs! There is also a detailed report about current
-development status, and an analysis of example LilyPond output -
-see for yourself how close (or how far?) are we from matching
-the quality of hand-engraved scores.
-
-Come
-@uref{http://news.lilynet.net/?The-LilyPond-Report-26, read
-LilyPond Report 26} now; comments and contributions are
-warmly encouraged!
-
-@newsEnd
-
@end ignore
+@newsItem
+@subsubheading LilyPond 2.15.40 released! @emph{June 05, 2012}
+
+We are happy to announce the release of LilyPond 2.15.40. This
+release contains the usual number of bugfixes.
+
+It is strongly recommended that normal users do @strong{not} use
+this release, and instead use the stable 2.14 version. Please
+note that due to a few Critical bugs, this is not the next release
+candidate.
+
+@newsEnd
+
+
+@newsItem
+@subsubheading Release candidate withdrawn @emph{June 01, 2012}
+
+We have discovered a regression since 2.14.2, so lilypond 2.15.39
+is no longer a candidate for the 2.16.0 release. However, please
+continue testing it -- we would like to discover (and fix!) any
+more regressions as soon as possible. If you discover any
+problems, please send us @ref{Bug reports}.
+
+@newsEnd
+
+
+@newsItem
+@subsubheading Release candidate 7 of 2.16 - LilyPond 2.15.39 released! @emph{May 22, 2012}
+
+LilyPond 2.15.39 is out; this is the seventh release candidate of
+the upcoming 2.16 stable release. All users are invited to
+experiment with this version. New features since 2.14.2 are
+listed in the @qq{Changes} manual on the website section about
+@ref{Development}.
+
+There are no known Critical issues with this release. If no
+Critical bugs are found, then the official 2.16.0 release will be
+on 05 June 2012. If you discover any problems, please send us
+@ref{Bug reports}.
+
+@newsEnd
+
+
+@newsItem
+@subsubheading The LilyPond Report #26. @emph{May 22, 2012}
+
+The @emph{LilyPond Report} is back, with a new editor on board -
+Pavel Roskin, who tells us about his adventures in strange lands
+of compiler bugs! There is also a detailed report about current
+development status, and an analysis of example LilyPond output -
+see for yourself how close (or how far?) are we from matching
+the quality of hand-engraved scores.
+
+Come
+@uref{http://news.lilynet.net/?The-LilyPond-Report-26, read
+LilyPond Report 26} now; comments and contributions are
+warmly encouraged!
+
+@newsEnd
+
+
@newsItem
@subsubheading Release candidate 6 of 2.16 - LilyPond 2.15.38 released! @emph{May 3, 2012}
$(MAKE) $(RELEASE_OUT_FILES)
python-modules:
+ $(MAKE) -C scripts/build
$(MAKE) -C python
top-doc: python-modules
# installed in non-recursing target from TOP-SRC-DIR
install-WWW:
-$(INSTALL) -m 755 -d $(DESTDIR)$(webdir)
- rsync -rl --exclude='*.signature' $(outdir)/offline-root $(DESTDIR)$(webdir)
+ rsync -rl --exclude='*.signature' $(outdir)/offline-root/ $(DESTDIR)$(webdir)
$(MAKE) -C Documentation omf-local-install
install-info-WWW:
PACKAGE_NAME=LilyPond
MAJOR_VERSION=2
MINOR_VERSION=15
-PATCH_LEVEL=42
+PATCH_LEVEL=43
MY_PATCH_LEVEL=
VERSION_STABLE=2.14.2
-VERSION_DEVEL=2.15.41
+VERSION_DEVEL=2.15.42
NCSB_SOURCE_FILES = @NCSB_SOURCE_FILES@
+NCSB_DIR = @NCSB_DIR@
################################################################
## PROGRAMS
AC_CHECK_PROG(FCLIST, fc-list, fc-list)
AC_MSG_CHECKING([New Century Schoolbook PFB files])
AC_SUBST(NCSB_SOURCE_FILES)
+AC_SUBST(NCSB_DIR)
+UNCHECKED_NCSB_SOURCE_FILES=""
if test "$NCSB_DIR" != "" ; then
- NCSB_SOURCE_FILES=""
for f in c059013l c059016l c059033l c059036l; do
if test ! -f "$NCSB_DIR/$f.pfb"; then
STEPMAKE_WARN($NCSB_DIR does not contain $f.pfb.)
else
- NCSB_SOURCE_FILES="$NCSB_DIR/$f.pfb $NCSB_SOURCE_FILES"
+ UNCHECKED_NCSB_SOURCE_FILES="$NCSB_DIR/$f.pfb $UNCHECKED_NCSB_SOURCE_FILES"
fi
done
else
| head -n 1`
NCSB_FILE=`echo $NCSB_FILE | sed 's/\(:.*\)$//g'`
NCSB_FILE=`$PYTHON "$srcdir/scripts/auxiliar/readlink.py" $NCSB_FILE`
- NCSB_SOURCE_FILES="$NCSB_FILE $NCSB_SOURCE_FILES"
+ UNCHECKED_NCSB_SOURCE_FILES="$NCSB_FILE $UNCHECKED_NCSB_SOURCE_FILES"
done
+ NCSB_DIR=`AS_DIRNAME($NCSB_FILE)`
else
AC_MSG_RESULT(not found)
echo "Can't find Century Schoolbook files. Install FontConfig's fc-list,"
echo "or use --with-ncsb-dir"
fi
fi
+NCSB_SOURCE_FILES=""
+for f in $UNCHECKED_NCSB_SOURCE_FILES; do
+ if test "`grep Cyrillic "$f"`" = ""; then
+ STEPMAKE_WARN($f does not have Cyrillic characters.)
+ else
+ NCSB_SOURCE_FILES="$f $NCSB_SOURCE_FILES"
+ fi
+done
AC_MSG_RESULT($NCSB_SOURCE_FILES)
AC_LANG([C++])
#ifdef YAFFUT_MAIN
#include <iostream>
+#include <sys/types.h>
+#include <unistd.h>
+
int main (int argc, const char *argv[])
{
#include "file-path.hh"
#include <limits.h>
+#include <unistd.h>
#include "yaffut.hh"
#include "config.hh"
%% Tuplets
\test ##[ \times 2/3 { c8 d e } #] % TimeScaledMusic
\test ##[ \times 4/6 { c16 d e f g a } #]
+\test ##[ \times 2/3 { c d e \times 2/5 { f e d2 d4 } c } #]
%}
%% \relative and \tranpose
\test #"NOT A BUG" ##[ \relative c' { c b } #] % RelativeOctaveMusic
--- /dev/null
+\version "2.15.42"
+
+\header {
+ texidoc="
+A second book-level header block and headers nested in bookpart and score should not clear values from the first header block. This score should show composer, piece, subtitle and title."
+}
+
+\book {
+ \header {
+ title = "Title incorrect (to be superseded at book level)"
+ subtitle = "Subtitle incorrect (to be superseded in bookpart)"
+ composer = "Composer correct (set in book)"
+ piece = "Piece incorrect (to be superseded in score)"
+ }
+ % This should replace title without affecting other fields
+ \header {
+ title = "Title correct (superseded at book level)"
+ }
+ \bookpart {
+ % This should replace subtitle without affecting other fields
+ \header {
+ subtitle = "Subtitle correct (superseded in bookpart)"
+ }
+ \markup \vspace #2
+ \markup { \bold Note: title, subtitle, piece, and composer expected. }
+ \markup \vspace #2
+ \score {
+ \new Staff { c'1 }
+ \header {
+ % This should replace piece without affecting other fields
+ piece = "Piece correct (superseded in score)"
+ }
+ }
+ }
+}
--- /dev/null
+\version "2.15.42"
+
+\header {
+ texidoc="
+Changing the header fields in a book or a bookpart shall not have any effect on the global default values.
+"
+}
+
+\markup \vspace #2
+\markup { \bold Note: expect only title. }
+\markup \vspace #2
+
+\header {
+ title = "Title correct (set at top level)"
+}
+\score {
+ \relative c' { c1 }
+}
+
+
+\book {
+ % This should NOT set a global subtitle for the first score above:
+ \header {
+ subtitle = "Subtitle (set at book level)"
+ }
+ \markup \vspace #2
+ \markup { \bold Note: expect title and subtitle. }
+ \markup \vspace #2
+ %% Do we have a title, and is the subtitle set?
+ \score {
+ \new Staff { c'1 }
+ }
+}
--- /dev/null
+\version "2.15.42"
+
+\header {
+ texidoc="
+A second bookpart-level header block shall retain previously set values from a first header block at the same or higher levels unless overriden.
+"
+}
+
+\header { composer = "Composer correct (set at top level)" }
+\book {
+ \header {
+ title = "Title correct (set in book)"
+ subtitle = "Subtitle incorrect (to be superseded in bookpart)"
+ }
+ \bookpart {
+ \header {
+ subtitle = "Subtitle correct (superseded in bookpart)"
+ piece = "Piece incorrect (to be superseded at bookpart level)"
+ }
+ \header {
+ piece = "Piece correct (superseded at bookpart level)"
+ }
+ \markup \vspace #2
+ \markup { \bold Note: expect title, subtitle, piece and composer. }
+ \markup \vspace #2
+ \score {
+ \new Staff { c'4 }
+ }
+ }
+}
--- /dev/null
+\version "2.15.42"
+\header {
+ texidoc="
+A second score-level header block shall not entirely replace a first header block, but only update changed variables.
+"
+}
+
+\markup \vspace #3
+\markup { \bold Note: expect piece and opus. }
+\markup \vspace #3
+
+\score {
+ \new Staff { c'1 }
+ \header {
+ piece = "Piece correct (set in score)"
+ opus = "Opus incorrect (to be superseded at score level)"
+ }
+ \header {
+ % This should NOT overwrite the piece from above!
+ opus = "Opus correct (superseded at score level)"
+ }
+}
--- /dev/null
+\version "2.15.42"
+\header {
+ texidoc="
+A second top-level header block shall not entirely replace a first header block, but only changed variables.
+"
+ piece = "Piece correct (set at top level)"
+ title = "Title incorrect (to be superseded at top level)"
+}
+\header {
+ % This should NOT overwrite the piece from above!
+ title = "Title correct (superseded at top level)"
+}
+\markup \vspace #3
+\markup { \bold Note: expect title and piece. }
+\markup \vspace #3
+
+\score {
+ \new Staff { c'4 }
+}
--- /dev/null
+\version "2.15.42"
+
+\header {
+ texidoc = "Relative indentation between systems is taken into
+ account in allowing space for loose lines between systems."
+}
+
+\paper {
+ ragged-right = ##t
+ indent = 10
+ short-indent = 00
+}
+
+\book {
+ \score { <<
+ \chords {s1\break c2 c2 }
+ \new Staff {\clef bass c,1 | c''2 c2 }
+ >> }
+}
-\version "2.14.0"
+\version "2.15.42"
-"expect-error" = ##t
+expect-error = ##t
% Ugh - this affects other files too.
#(ly:set-option 'protected-scheme-parsing #t)
#(ly:set-option 'safe #t)
-"force-finish" = ##t
+force-finish = ##t
\header{
texidoc = "This should not survive lilypond --safe-mode"
#(open-file "/tmp/safe-guile.scm")
\include "this-should-fail.ly"
-
along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "bar-line.hh"
#include "beaming-pattern.hh"
#include "beam.hh"
#include "context.hh"
return me->get_maybe_pure_property ("default-staff-staff-spacing", pure, start, end);
}
-Real
-Axis_group_interface::minimum_distance (Grob *g1, Grob *g2, Axis a)
-{
- SCM sym = ly_symbol2scm ((a == Y_AXIS) ? "vertical-skylines" : "horizontal-skylines");
-
- Skyline_pair *s1 = Skyline_pair::unsmob (g1->get_property (sym));
- Skyline_pair *s2 = Skyline_pair::unsmob (g2->get_property (sym));
- if (s1 && s2)
- return (*s1)[DOWN].distance ((*s2)[UP]);
- return 0;
-}
-
ADD_INTERFACE (Axis_group_interface,
"An object that groups other layout objects.",
along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "bar-line.hh"
#include "context.hh"
#include "score-engraver.hh"
#include "warn.hh"
*/
#include "bar-line.hh"
-
-#include "all-font-metrics.hh"
-#include "font-interface.hh"
-#include "line-interface.hh"
-#include "lookup.hh"
-#include "output-def.hh"
#include "paper-column.hh"
-#include "staff-symbol-referencer.hh"
-
-MAKE_SCHEME_CALLBACK (Bar_line, calc_bar_extent, 1)
-SCM
-Bar_line::calc_bar_extent (SCM smob)
-{
- Interval result;
- Grob *me = unsmob_grob (smob);
- if (Grob *staff = Staff_symbol_referencer::get_staff_symbol (me))
- {
- result = staff->extent (staff, Y_AXIS);
-
- /* Due to rounding problems, bar lines extending to the outermost edges
- of the staff lines appear wrongly in on-screen display
- (and, to a lesser extent, in print) - they stick out a pixel.
- The solution is to extend bar lines only to the middle
- of the staff line - unless they have different colors,
- when it would be undesirable.
- */
- SCM bar_line_color = me->get_property ("color");
- SCM staff_color = staff->get_property ("color");
- Real radius = Staff_symbol_referencer::staff_radius (me);
- if (bar_line_color == staff_color && radius)
- result *= (1 - 0.5 * (Staff_symbol_referencer::line_thickness (me) / radius));
- }
- return ly_interval2scm (result);
-}
-
-Interval
-Bar_line::bar_y_extent (Grob *me, Grob *refpoint)
-{
- Interval iv = robust_scm2interval (me->get_property ("bar-extent"), Interval ());
-
- iv.translate (me->relative_coordinate (refpoint, Y_AXIS));
- return iv;
-}
bool
Bar_line::non_empty_barline (Grob *me)
{
- return has_interface (me) && !me->extent (me, X_AXIS).is_empty ();
-}
-
-MAKE_SCHEME_CALLBACK (Bar_line, print, 1);
-SCM
-Bar_line::print (SCM smob)
-{
- Grob *me = unsmob_grob (smob);
-
- SCM s = me->get_property ("glyph-name");
- SCM extent = me->get_property ("bar-extent");
-
- if (scm_is_string (s) && is_number_pair (extent))
- {
- string str = ly_scm2string (s);
- Interval ex = ly_scm2interval (extent);
- if (ex.length () > 0)
- {
- Stencil result = compound_barline (me, str, ex, false);
-
- return result.smobbed_copy ();
- }
- }
- return SCM_EOL;
+ return me->internal_has_interface (ly_symbol2scm ("bar-line-interface"))
+ && !me->extent (me, X_AXIS).is_empty ();
}
-
-Stencil
-Bar_line::compound_barline (Grob *me, string str, Interval const &extent,
- bool rounded)
-{
- Real kern = robust_scm2double (me->get_property ("kern"), 1);
- Real thinkern = robust_scm2double (me->get_property ("thin-kern"), 1);
- Real hair = robust_scm2double (me->get_property ("hair-thickness"), 1);
- Real fatline = robust_scm2double (me->get_property ("thick-thickness"), 1);
-
- Real staffline = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness"));
- Real staff_space = Staff_symbol_referencer::staff_space (me);
-
- kern *= staffline;
- thinkern *= staffline;
- hair *= staffline;
- fatline *= staffline;
-
- Stencil thin = simple_barline (me, hair, extent, rounded);
- Stencil thick = simple_barline (me, fatline, extent, rounded);
- Stencil dot = Font_interface::get_default_font (me)->find_by_name ("dots.dot");
-
- int lines = Staff_symbol_referencer::line_count (me);
- Real dist
- = ((lines & 1 || lines == 0)
- ? 1
- : (staff_space < 2 ? 2 : .5)) * staff_space;
- Stencil colon (dot);
- colon.translate_axis (dist, Y_AXIS);
- colon.add_stencil (dot);
- colon.translate_axis (-dist / 2, Y_AXIS);
-
- Real const h = extent.length ();
- Stencil m;
-
- if (str == "||:")
- str = "|:";
-
- if (str == "|S" || str == "S|")
- str = "S";
-
- if (str == "")
- {
- Stencil empty = Lookup::blank (Box (Interval (0, 0), extent));
- return empty;
- }
- else if (str == "|")
- return thin;
- else if (str == ".")
- return thick;
- else if (str == "|." || (h == 0 && str == ":|"))
- {
- m.add_at_edge (X_AXIS, LEFT, thick, 0);
- m.add_at_edge (X_AXIS, LEFT, thin, kern);
- }
- else if (str == ".|" || (h == 0 && str == "|:"))
- {
- m.add_at_edge (X_AXIS, RIGHT, thick, 0);
- m.add_at_edge (X_AXIS, RIGHT, thin, kern);
- }
- else if (str == ":|")
- {
- m.add_at_edge (X_AXIS, LEFT, thick, 0);
- m.add_at_edge (X_AXIS, LEFT, thin, kern);
- m.add_at_edge (X_AXIS, LEFT, colon, kern);
- }
- else if (str == "|:")
- {
- m.add_at_edge (X_AXIS, RIGHT, thick, 0);
- m.add_at_edge (X_AXIS, RIGHT, thin, kern);
- m.add_at_edge (X_AXIS, RIGHT, colon, kern);
- }
- else if (str == ":|:")
- {
- m.add_at_edge (X_AXIS, LEFT, thick, thinkern);
- m.add_at_edge (X_AXIS, LEFT, colon, kern);
- m.add_at_edge (X_AXIS, RIGHT, thick, kern);
- m.add_at_edge (X_AXIS, RIGHT, colon, kern);
- }
- else if (str == ":|.|:")
- {
- m.add_at_edge (X_AXIS, LEFT, thick, 0);
- m.add_at_edge (X_AXIS, LEFT, thin, kern);
- m.add_at_edge (X_AXIS, LEFT, colon, kern);
- m.add_at_edge (X_AXIS, RIGHT, thin, kern);
- m.add_at_edge (X_AXIS, RIGHT, colon, kern);
- }
- else if (str == ":|.:")
- {
- m.add_at_edge (X_AXIS, LEFT, thick, 0);
- m.add_at_edge (X_AXIS, LEFT, thin, kern);
- m.add_at_edge (X_AXIS, LEFT, colon, kern);
- m.add_at_edge (X_AXIS, RIGHT, colon, kern);
- }
- else if (str == ".|.")
- {
- m.add_at_edge (X_AXIS, LEFT, thick, thinkern);
- m.add_at_edge (X_AXIS, RIGHT, thick, kern);
- }
- else if (str == "|.|")
- {
- m.add_at_edge (X_AXIS, LEFT, thick, 0);
- m.add_at_edge (X_AXIS, LEFT, thin, kern);
- m.add_at_edge (X_AXIS, RIGHT, thin, kern);
- }
- else if (str == "||")
- {
- /*
- should align to other side? this never appears
- on the system-start?
- m.add_at_edge (X_AXIS, RIGHT, thin, 0);
- m.add_at_edge (X_AXIS, RIGHT, thin, thinkern);
- */
- m.add_at_edge (X_AXIS, LEFT, thin, thinkern);
- m.add_at_edge (X_AXIS, RIGHT, thin, thinkern);
- }
- else if (str.find ("S") != NPOS || str == "|._.|")
- {
- // Handle all varsegno stuff
- Stencil segno;
- segno.add_at_edge (X_AXIS, LEFT, thin, thinkern);
- segno.add_at_edge (X_AXIS, RIGHT, thin, thinkern);
- segno.add_stencil (Font_interface::get_default_font (me)->find_by_name ("scripts.varsegno"));
-
- if (str == "S")
- m.add_stencil (segno);
- else if (str == "S|:" || str == ".S|:")
- {
- m.add_at_edge (X_AXIS, RIGHT, thick, 0);
- m.add_at_edge (X_AXIS, RIGHT, thin, kern);
- m.add_at_edge (X_AXIS, RIGHT, colon, kern);
- m.add_at_edge (X_AXIS, LEFT, segno, thinkern);
- }
- else if (str == ":|S" || str == ":|S.")
- {
- m.add_at_edge (X_AXIS, LEFT, thick, 0);
- m.add_at_edge (X_AXIS, LEFT, thin, kern);
- m.add_at_edge (X_AXIS, LEFT, colon, kern);
- m.add_at_edge (X_AXIS, RIGHT, segno, thinkern);
- }
- else if (str == ":|S|:" || str == ":|S.|:")
- {
- m.add_at_edge (X_AXIS, LEFT, thick, 0);
- m.add_at_edge (X_AXIS, LEFT, thin, kern);
- m.add_at_edge (X_AXIS, LEFT, colon, kern);
- m.add_at_edge (X_AXIS, RIGHT, segno, thinkern);
- m.add_at_edge (X_AXIS, RIGHT, thick, thinkern);
- m.add_at_edge (X_AXIS, RIGHT, thin, kern);
- m.add_at_edge (X_AXIS, RIGHT, colon, kern);
- }
- else if (str == "|._.|") // :|S|: or :|S.|: without segno and colon
- {
- // get the width of the segno sign
- Real segno_width = segno.extent (X_AXIS).length ();
- m.add_at_edge (X_AXIS, LEFT, thick, 0);
- m.add_at_edge (X_AXIS, LEFT, thin, kern);
- m.add_at_edge (X_AXIS, RIGHT, thick, segno_width + 2 * thinkern);
- m.add_at_edge (X_AXIS, RIGHT, thin, kern);
- }
- // end varsegno block
- }
- else if (str == ":")
- {
- if (Grob *staff = Staff_symbol_referencer::get_staff_symbol (me))
- {
- Interval staff_extent = staff->extent (staff, Y_AXIS);
-
- /*
- assume staff lines are disposed equally at unit space;
- put a dot into each space within extent (may extend staff_extent).
-
- staff_extent is an interval of two integers or two half-integers;
- in the former case dots are to be placed at half-integers,
- in the latter at integers.
-
- these integers are not exact due to staff line thickness.
- */
- int const pos = int (rint (staff_extent.at (UP) * 2));
- Real const correction = pos & 1 ? 0.0 : 0.5;
-
- for (int i = int (rint (extent.at (DOWN) + (0.5 - correction))),
- e = int (rint (extent.at (UP) + (0.5 - correction)));
- i < e;
- ++i)
- {
- Stencil d (dot);
-
- d.translate_axis (i + correction, Y_AXIS);
- m.add_stencil (d);
- }
- }
- }
- else if (str == "dashed")
- m = dashed_bar_line (me, extent, hair);
- else if (str == "'")
- m = tick_bar_line (me, extent.at (UP), rounded);
- else if (str == "kievan")
- {
- me->set_property ("layer", scm_from_int (1));
- m.add_stencil (Font_interface::get_default_font (me)->find_by_name ("scripts.barline.kievan"));
- m = *unsmob_stencil (scm_call_1 (ly_lily_module_constant ("stencil-whiteout"), m.smobbed_copy ()));
- }
- return m;
-}
-
-Stencil
-Bar_line::simple_barline (Grob *me,
- Real w,
- Interval const &extent,
- bool rounded)
-{
- Real blot
- = rounded
- ? me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter"))
- : 0.0;
-
- return Lookup::round_filled_box (Box (Interval (0, w), extent), blot);
-}
-
-Stencil
-Bar_line::tick_bar_line (Grob *me, Real h, bool rounded)
-{
- Real th = Staff_symbol_referencer::staff_space (me) / 2;
- Real line_thick = Staff_symbol_referencer::line_thickness (me);
-
- Real blot
- = rounded
- ? me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter"))
- : 0.0;
-
- return Lookup::round_filled_box (Box (Interval (0, line_thick),
- Interval (h - th, h + th)), blot);
-}
-
-Stencil
-Bar_line::dashed_bar_line (Grob *me, Interval const &extent, Real thick)
-{
- Real dash_size
- = 1.0 - robust_scm2double (me->get_property ("gap"), 0.3);
- /*
- this is a tad complex for what we want to achieve, but with a
- simple line, the round blotting interferes with staff line
- connections.
- */
- Real ss = Staff_symbol_referencer::staff_space (me);
- Real const h = extent.length ();
- int dashes = int (rint (h / ss));
-
- /*
- there are two concerns:
- 1. one dash plus one space should be one staff space
- 2. the line should begin and end with half a dash
-
- both can be satisfied, if the extent is (roughly) an integer
- multiple of staff space.
- */
- if (fabs (h / ss - dashes) < 0.1)
- {
- Real blot
- = me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter"));
-
- Real const half_dash = dash_size / 2;
- Stencil bar;
-
- for (int i = 0; i <= dashes; ++i)
- {
- Real top_y = extent.at (DOWN)
- + (i == dashes ? h : (i + half_dash) * ss);
- Real bot_y = extent.at (DOWN) + (i ? (i - half_dash) * ss : 0.0);
-
- bar.add_stencil (Lookup::round_filled_box (Box (Interval (0, thick),
- Interval (bot_y, top_y)),
- blot));
- }
- return bar;
- }
- else
- {
- /*
- We have to scale the dashing so it starts and ends with half a
- dash exactly.
- */
- Real total_dash_size = h / dashes;
- Real factor = (dash_size - thick) / ss;
-
- SCM at = scm_list_n (ly_symbol2scm ("dashed-line"),
- scm_from_double (thick),
- scm_from_double (factor * total_dash_size),
- scm_from_double ((1 - factor) * total_dash_size),
- scm_from_double (0),
- scm_from_double (h),
- scm_from_double (factor * total_dash_size * 0.5),
- SCM_UNDEFINED);
-
- Box box;
- box.add_point (Offset (0, 0));
- box.add_point (Offset (0, h));
-
- Stencil s (box, at);
- s.translate (Offset (thick / 2, extent.at (DOWN)));
- return s;
- }
- return Stencil ();
-}
-
-MAKE_SCHEME_CALLBACK (Bar_line, calc_anchor, 1)
-SCM
-Bar_line::calc_anchor (SCM smob)
-{
- Grob *me = unsmob_grob (smob);
- Real kern = robust_scm2double (me->get_property ("kern"), 1);
- Real staffline = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness"));
- string str = robust_scm2string (me->get_property ("glyph-name"), "");
-
- /* we put the anchor in the center of the barline, unless we are
- a repeat bar, in which case we put the anchor in the center of
- the barline without the dots. */
- Interval ext = me->extent (me, X_AXIS);
- if (ext.is_empty ())
- return scm_from_double (0);
-
- Real anchor = ext.center ();
-
- Stencil dot = Font_interface::get_default_font (me)->find_by_name ("dots.dot");
- Real dot_width = dot.extent (X_AXIS).length () + kern * staffline;
- if (str == "|:")
- anchor -= dot_width / 2;
- else if (str == ":|")
- anchor += dot_width / 2;
-
- return scm_from_double (anchor);
-}
-
-ADD_INTERFACE (Bar_line,
- "Bar line.\n"
- "\n"
- "Print a special bar symbol. It replaces the regular bar"
- " symbol with a special symbol. The argument @var{bartype}"
- " is a string which specifies the kind of bar line to print."
- " Options are @code{|}, @code{:|}, @code{|:}, @code{:|:}, @code{:|.|:},"
- " @code{:|.:}, @code{.}, @code{||}, @code{|.}, @code{.|}, @code{.|.},"
- " @code{|.|}, @code{:}, @code{dashed}, @code{'} and @code{S}.\n"
- "\n"
- "These produce, respectively, a normal bar line, a right repeat, a left repeat,"
- " a thick double repeat, a thin-thick-thin double repeat,"
- " a thin-thick double repeat, a thick bar, a double bar, a start bar,"
- " an end bar, a thick double bar, a thin-thick-thin bar,"
- " a dotted bar, a dashed bar, a tick as bar line and a segno bar.\n"
- "\n"
- "In addition, there is an option"
- " @code{||:} which is equivalent to @code{|:} except at line"
- " breaks, where it produces a double bar (@code{||}) at the"
- " end of the line and a repeat sign (@code{|:}) at the"
- " beginning of the new line.\n"
- "\n"
- "For segno, @code{S} produces a segno sign except at line breaks,"
- " where it produces a double bar (@code{||}) at the"
- " end of the line and a segno sign at the beginning of the new line."
- " @code{|S} is equivalent to @code{S} but produces a simple bar line"
- " (@code{|}) instead of a double bar line (@code{||}) at line breaks."
- " @code{S|} produces the segno sign at line breaks and starts the following"
- " line without special bar lines.\n"
- "\n"
- "@code{S|:} and @code{:|S} are used for repeat/segno combinations that are"
- " separated at line breaks. Alternatively, @code{.S|:} and @code{:|S.}"
- " may be used which combine repeat signs and segno at the same line in"
- " case of a line break. @code{:|S|:} is a combination of a left repeat"
- " (@code{:|}), a segno (@code{S}) and a right repeat @code{|:} which"
- " splits before the segno at line breaks; @code{:|S.|:} splits after"
- " the segno sign.\n"
- "\n"
- "If @var{bartype} is set to @code{empty} then nothing is"
- " printed, but a line break is allowed at that spot.\n"
- "\n"
- "@code{gap} is used for the gaps in dashed bar lines.",
-
- /* properties */
- "allow-span-bar "
- "gap "
- "kern "
- "thin-kern "
- "hair-thickness "
- "has-span-bar "
- "thick-thickness "
- "glyph "
- "glyph-name "
- "bar-extent "
- );
#include "item.hh"
#include "context.hh"
-#include "bar-line.hh"
#include "staff-symbol-referencer.hh"
#include "engraver.hh"
#include "direction.hh"
#include "item.hh"
#include "context.hh"
-#include "bar-line.hh"
#include "staff-symbol-referencer.hh"
#include "engraver.hh"
#include "direction.hh"
*/
#include "engraver.hh"
-#include "bar-line.hh"
#include "item.hh"
#include "note-head.hh"
#include "pitch.hh"
" eighth note, etc. The number of dots after the note is given by"
" the optional argument @var{dotcount}.\n"
"\n"
- "The duration factor is optionally given by @var{num} and"
- " @var{den}.\n"
+ "The duration factor is optionally given by integers @var{num} and"
+ " @var{den}, alternatively by a single rational number.\n"
"\n"
"A duration is a musical duration, i.e., a length of time"
" described by a power of two (whole, half, quarter, etc.) and a"
}
bool compress = false;
- if (num != SCM_UNDEFINED)
+ if (!SCM_UNBNDP (num))
{
- LY_ASSERT_TYPE (scm_is_number, num, 3);
+ LY_ASSERT_TYPE (ly_is_rational, num, 3);
compress = true;
}
else
num = scm_from_int (1);
- if (den != SCM_UNDEFINED)
+ if (!SCM_UNBNDP (den))
{
- LY_ASSERT_TYPE (scm_is_number, den, 4);
+ LY_ASSERT_TYPE (scm_is_integer, den, 4);
compress = true;
}
else
Duration p (scm_to_int (length), dots);
if (compress)
- p = p.compressed (Rational (scm_to_int (num), scm_to_int (den)));
+ p = p.compressed (ly_scm2rational (scm_divide (num, den)));
return p.smobbed_copy ();
}
Rational r = unsmob_duration (dur)->factor ();
return scm_cons (scm_from_int64 (r.num ()), scm_from_int64 (r.den ()));
}
+
+// This is likely what ly:duration-factor should have been in the
+// first place.
+LY_DEFINE (ly_duration_scale, "ly:duration-scale",
+ 1, 0, 0, (SCM dur),
+ "Extract the compression factor from @var{dur}."
+ " Return it as a rational.")
+{
+ LY_ASSERT_SMOB (Duration, dur, 1);
+ Rational r = unsmob_duration (dur)->factor ();
+
+ return ly_rational2scm (r);
+}
chain_callback (gr, proc, sym);
return SCM_UNSPECIFIED;
}
+
+LY_DEFINE (ly_grob_vertical_less_p, "ly:grob-vertical<?",
+ 2, 0, 0, (SCM a, SCM b),
+ "Does @var{a} lie above @var{b} on the page?")
+{
+ LY_ASSERT_SMOB (Grob, a, 1);
+ LY_ASSERT_SMOB (Grob, b, 2);
+
+ Grob *ga = unsmob_grob (a);
+ Grob *gb = unsmob_grob (b);
+
+ return ly_bool2scm (Grob::vertical_less (ga, gb));
+}
#include "hairpin.hh"
#include "axis-group-interface.hh"
-#include "bar-line.hh"
#include "dimensions.hh"
#include "directional-element-interface.hh"
#include "international.hh"
{
extract_grob_set (vertical_axis_groups[d], "elements", elts);
for (vsize i = elts.size (); i--;)
- if (Bar_line::has_interface (elts[i])
+ if (elts[i]->internal_has_interface (ly_symbol2scm ("bar-line-interface"))
&& dynamic_cast<Item *> (elts[i])->break_status_dir () == -1)
{
SCM hsb = elts[i]->get_property ("has-span-bar");
span_bars[d] = unsmob_grob ((d == UP ? scm_car : scm_cdr) (hsb));
break;
}
+
if (!span_bars[d])
return scm_from_double (0.0);
}
public:
DECLARE_GROB_INTERFACE ();
- static Stencil dashed_bar_line (Grob *me, Interval const &extent, Real thick);
- static Stencil tick_bar_line (Grob *me, Real h, bool rounded);
- static Stencil compound_barline (Grob *, string, Interval const &extent,
- bool rounded);
- static Stencil simple_barline (Grob *, Real wid, Interval const &extent,
- bool rounded);
- static Interval bar_y_extent (Grob *, Grob *);
static bool non_empty_barline (Grob *me);
-
- DECLARE_SCHEME_CALLBACK (calc_bar_extent, (SCM));
- DECLARE_SCHEME_CALLBACK (print, (SCM));
- DECLARE_SCHEME_CALLBACK (calc_anchor, (SCM));
};
#endif // BAR_LINE_HH
Prob *prob;
vector<Grob *> staves;
vector<Real> min_offsets;
- // Store the appropriate '*-*-spacing 'padding,
- // for spacing any adjacent loose line
+ // Store the appropriate '*-*-spacing 'padding, and skyline-distance,
+ // considering indentation, from the previous system.
+ Real min_distance;
Real padding;
- Element (vector<Grob *> const &a, vector<Real> const &o, Real p)
+ Element (vector<Grob *> const &a, vector<Real> const &o, Real m, Real p)
{
staves = a;
min_offsets = o;
+ min_distance = m;
padding = p;
prob = 0;
}
+++ /dev/null
-/*
- This file is part of LilyPond, the GNU music typesetter.
-
- Copyright (C) 1997--2012 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/>.
-*/
-
-#ifndef SPAN_BAR_HH
-#define SPAN_BAR_HH
-
-#include "lily-proto.hh"
-#include "grob-interface.hh"
-
-/**
- This is a barline that is spanned across other bar lines. This is
- the implementation of the long barlines that occur in orchestral
- score and other multi-staff music.
-*/
-class Span_bar
-{
-public:
-
- DECLARE_GROB_INTERFACE ();
- static Interval get_spanned_interval (Grob *);
- static void add_bar (Grob *, Grob *);
- static void evaluate_glyph (Grob *);
- static void notify_grobs_of_my_existence (Grob *);
- DECLARE_SCHEME_CALLBACK (width, (SCM smob));
- DECLARE_SCHEME_CALLBACK (print, (SCM));
- DECLARE_SCHEME_CALLBACK (calc_glyph_name, (SCM));
- DECLARE_SCHEME_CALLBACK (before_line_breaking, (SCM));
- DECLARE_SCHEME_CALLBACK (center_on_spanned_callback, (SCM element));
-};
-
-#endif // SPAN_BAR_HH
along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "bar-line.hh"
#include "clef.hh"
#include "context.hh"
#include "engraver.hh"
A [a-zA-Z\200-\377]
AA {A}|_
N [0-9]
-AN {AA}|{N}
ANY_CHAR (.|\n)
PUNCT [][()?!:'`]
SPECIAL_CHAR [&@]
NATIONAL [\001-\006\021-\027\031\036]
TEX {AA}|-|{PUNCT}|{NATIONAL}|{SPECIAL_CHAR}
-DASHED_WORD {A}({AN}|-)*
-DASHED_KEY_WORD \\{DASHED_WORD}
+WORD {A}([-_]{A}|{A})*
+COMMAND \\{WORD}
-
-
-ALPHAWORD {A}+
UNSIGNED {N}+
E_UNSIGNED \\{N}+
FRACTION {N}+\/{N}+
HORIZONTALWHITE [ \t]
BLACK [^ \n\t\f\r]
RESTNAME [rs]
-NOTECOMMAND \\{A}+
-MARKUPCOMMAND \\({A}|[-_])+
LYRICS ({AA}|{TEX})[^0-9 \t\n\r\f]*
ESCAPED [nt\\'"]
EXTENDER __
error (_ ("end quote missing"));
exit (1);
}
+
+ /* Flex picks the longest matching pattern including trailing
+ * contexts. Without the backup pattern, r-. does not trigger the
+ * {RESTNAME} rule but rather the {WORD}/[-_] rule coming later,
+ * needed for avoiding backup states.
+ */
+
+<chords,notes,figures>{RESTNAME}/[-_] | // pseudo backup rule
<chords,notes,figures>{RESTNAME} {
char const *s = YYText ();
yylval.scm = scm_from_locale_string (s);
return RESTNAME;
}
+<chords,notes,figures>q/[-_] | // pseudo backup rule
<chords,notes,figures>q {
return CHORD_REPETITION;
}
+<chords,notes,figures>R/[-_] | // pseudo backup rule
<chords,notes,figures>R {
return MULTI_MEASURE_REST;
}
}
<notes,figures>{
- {ALPHAWORD} {
+ {WORD}/[-_] | // backup rule
+ {WORD} {
return scan_bare_word (YYText_utf8 ());
}
- {NOTECOMMAND} {
+ {COMMAND}/[-_] | // backup rule
+ {COMMAND} {
return scan_escaped_word (YYText_utf8 () + 1);
}
{FRACTION} {
yylval.scm = scan_fraction (YYText ());
return FRACTION;
}
- {UNSIGNED}/\/[^0-9] { // backup rule
- yylval.scm = scm_c_read_string (YYText ());
- return UNSIGNED;
- }
{UNSIGNED}/\/ | // backup rule
{UNSIGNED} {
yylval.scm = scm_c_read_string (YYText ());
return UNSIGNED;
}
- {NOTECOMMAND} {
+ {COMMAND}/[-_] | // backup rule
+ {COMMAND} {
return scan_escaped_word (YYText_utf8 () + 1);
}
{LYRICS} {
}
}
<chords>{
- {ALPHAWORD} {
+ {WORD}/[-_] | // backup rule
+ {WORD} {
return scan_bare_word (YYText_utf8 ());
}
- {NOTECOMMAND} {
+ {COMMAND}/[-_] | // backup rule
+ {COMMAND} {
return scan_escaped_word (YYText_utf8 () + 1);
}
{FRACTION} {
yylval.scm = scan_fraction (YYText ());
return FRACTION;
}
- {UNSIGNED}/\/[^0-9] { // backup rule
- yylval.scm = scm_c_read_string (YYText ());
- return UNSIGNED;
- }
{UNSIGNED}/\/ | // backup rule
{UNSIGNED} {
yylval.scm = scm_c_read_string (YYText ());
return CHORD_CARET;
}
. {
- return YYText ()[0]; // ALPHAWORD catches all multibyte.
+ return YYText ()[0]; // WORD catches all multibyte.
}
}
\\score {
return SCORE;
}
- {MARKUPCOMMAND} {
+ {COMMAND}/[-_] | // backup rule
+ {COMMAND} {
string str (YYText_utf8 () + 1);
int token_type = MARKUP_FUNCTION;
}
<INITIAL>{
- {DASHED_WORD} {
+ {WORD}/[-_] | // backup rule
+ {WORD} {
return scan_bare_word (YYText_utf8 ());
}
- {DASHED_KEY_WORD} {
+ {COMMAND}/[-_] | // backup rule
+ {COMMAND} {
return scan_escaped_word (YYText_utf8 () + 1);
}
}
yylval.scm = scm_c_read_string (YYText ());
return REAL;
}
--\. { // backup rule
- yylval.scm = scm_from_double (0.0);
- return REAL;
-}
{UNSIGNED}/\/ | // backup rule
{UNSIGNED} {
return YYText ()[0];
}
+
+-/\. | // backup rule
[*:=] {
char c = YYText ()[0];
void
Lily_lexer::push_note_state (SCM alist)
{
+ bool extra = (YYSTATE == extratoken);
+
SCM p = scm_assq (alist, pitchname_tab_stack_);
+ if (extra)
+ yy_pop_state ();
+
if (scm_is_false (p))
p = scm_cons (alist, alist_to_hashq (alist));
pitchname_tab_stack_ = scm_cons (p, pitchname_tab_stack_);
yy_push_state (notes);
+
+ if (extra) {
+ hidden_state_ = YYSTATE;
+ yy_push_state (extratoken);
+ }
}
void
#include "engraver.hh"
#include "axis-group-interface.hh"
-#include "bar-line.hh"
#include "context.hh"
#include "grob-array.hh"
#include "international.hh"
assert (delta_ticks >= 0);
Midi_event *e = new Midi_event (delta_ticks, midi);
- events_.push_back (e);
+
+ // Insertion position for the new event in the track.
+ vector<Midi_event *>::iterator position (events_.end ());
+ if (delta_ticks == 0
+ && (! dynamic_cast<Midi_note *> (midi)
+ || dynamic_cast<Midi_note_off *> (midi)))
+ {
+ // If the new event occurs at the same time as the most recently added
+ // one, and the event does not represent the start of a note, insert the
+ // new event before all notes (if any) already starting at this time.
+ // This is to force notes to be started only after all other events
+ // (such as changes in instruments) which occur at the same time have
+ // taken effect.
+ while (position != events_.begin ())
+ {
+ vector<Midi_event *>::iterator previous (position - 1);
+ if (! dynamic_cast<Midi_note *> ((*previous)->midi_)
+ || dynamic_cast<Midi_note_off *> ((*previous)->midi_))
+ {
+ // Found an event that does not represent the start of a note.
+ // Exit the loop to insert the new event in the track after this
+ // event.
+ break;
+ }
+ else if ((*previous)->delta_ticks_ != 0)
+ {
+ // Found the start of a new note with delta_ticks_ != 0. Prepare
+ // to insert the new event before this event, swapping the
+ // delta_ticks_ fields of the events to keep the sequence of
+ // deltas consistent.
+ e->delta_ticks_ = (*previous)->delta_ticks_;
+ (*previous)->delta_ticks_ = 0;
+ position = previous;
+ break;
+ }
+ // Otherwise, the event in the track is the start of a note occurring
+ // at the same time as the new event: continue searching for the
+ // insertion position.
+ position = previous;
+ }
+ }
+ events_.insert (position, e);
}
string
spring_copy.ensure_min_distance (minimum_distance);
springs_.push_back (spring_copy);
+ if (elts.size () && !is_spaceable (elts[0]))
+ {
+ // store the minimum distance, considering relative indents,
+ // for a loose line
+ Skyline first_skyline (UP);
+ Skyline_pair *sky = Skyline_pair::unsmob (elts[0]->get_property ("vertical-skylines"));
+ if (sky)
+ first_skyline.merge ((*sky)[UP]);
+ first_skyline.shift (indent);
+ minimum_distance = first_skyline.distance (bottom_skyline_) - bottom_loose_baseline_ ;
+ }
bottom_skyline_ = down_skyline;
- elements_.push_back (Element (elts, minimum_offsets, padding));
+ elements_.push_back (Element (elts, minimum_offsets, minimum_distance, padding));
// Add the springs for the VerticalAxisGroups in this system.
found_spaceable_staff = true;
spring_idx++;
}
- else
+ else // ! is_spaceable
{
if (loose_lines.empty ())
loose_lines.push_back (last_spaceable_line);
{
// distance to the final line in the preceding system,
// including 'system-system-spacing 'padding
- min_dist = (Axis_group_interface::minimum_distance (loose_lines.back (),
- staff, Y_AXIS)
- + elements_[i].padding);
+ min_dist = elements_[i].min_distance + elements_[i].padding;
// A null line to break any staff-affinity for the previous system
loose_line_min_distances.push_back (0.0);
loose_lines.push_back (0);
}
else if (!last_title_extent.is_empty ())
// distance to the preceding title,
- // including 'markup-system-spacing 'padding
+ // including 'markup-system-wg 'padding
min_dist = (staff->extent (staff, Y_AXIS)[UP] - last_title_extent[DOWN]
+ elements_[i].padding);
else // distance to the top margin
%{
-#define YYDEBUG 1
-#define YYERROR_VERBOSE 1
-
#define yyerror Lily_parser::parser_error
/* We use custom location type: Input objects */
%parse-param {Lily_parser *parser}
%lex-param {Lily_parser *parser}
+%error-verbose
+%debug
/* We use SCMs to do strings, because it saves us the trouble of
deleting them. Let's hope that a stack overflow doesn't trigger a move
%type <scm> music_arg
%type <scm> music_assign
%type <scm> music_embedded
+%type <scm> music_or_context_def
%type <scm> complex_music
%type <scm> complex_music_prefix
%type <scm> mode_changed_music
%type <scm> identifier_init
%type <scm> lilypond
%type <scm> lilypond_header
-%type <scm> lilypond_header_body
%type <scm> lyric_element
%type <scm> lyric_element_arg
%type <scm> lyric_element_music
toplevel_expression:
- lilypond_header {
- parser->lexer_->set_identifier (ly_symbol2scm ("$defaultheader"), $1);
+ {
+ parser->lexer_->add_scope (get_header (parser));
+ } lilypond_header {
+ parser->lexer_->set_identifier (ly_symbol2scm ("$defaultheader"), $2);
}
| book_block {
Book *book = $1;
lilypond_header_body:
- {
- $$ = get_header (parser);
- parser->lexer_->add_scope ($$);
- }
+ /* empty */
| lilypond_header_body assignment {
}
$$->paper_ = dynamic_cast<Output_def*> (unsmob_output_def (parser->lexer_->lookup_identifier ("$defaultpaper"))->clone ());
$$->paper_->unprotect ();
push_paper (parser, $$->paper_);
- $$->header_ = parser->lexer_->lookup_identifier ("$defaultheader");
+ $$->header_ = get_header (parser);
parser->lexer_->set_identifier (ly_symbol2scm ("$current-book"), $$->self_scm ());
}
| BOOK_IDENTIFIER {
SCM proc = parser->lexer_->lookup_identifier ("book-text-handler");
scm_call_2 (proc, $$->self_scm (), $2);
}
- | book_body lilypond_header {
- $$->header_ = $2;
- }
+ | book_body
+ {
+ parser->lexer_->add_scope ($1->header_);
+ } lilypond_header
| book_body embedded_scm { }
| book_body error {
$$->paper_ = 0;
SCM proc = parser->lexer_->lookup_identifier ("bookpart-text-handler");
scm_call_2 (proc, $$->self_scm (), $2);
}
- | bookpart_body lilypond_header {
- $$->header_ = $2;
- }
+ | bookpart_body
+ {
+ if (!ly_is_module ($1->header_))
+ $1->header_ = ly_make_module (false);
+ parser->lexer_->add_scope ($1->header_);
+ } lilypond_header
| bookpart_body embedded_scm { }
| bookpart_body error {
$$->paper_ = 0;
$$->protect ();
$$->origin ()->set_spot (@$);
}
- | score_body lilypond_header {
- $$->set_header ($2);
- }
+ | score_body
+ {
+ if (!ly_is_module ($1->get_header ()))
+ $1->set_header (ly_make_module (false));
+ parser->lexer_->add_scope ($1->get_header ());
+ } lilypond_header
| score_body output_def {
if ($2->lookup_variable (ly_symbol2scm ("is-paper")) == SCM_BOOL_T)
{
}
;
+// We need this weird nonterminal because both music as well as a
+// context definition can start with \context and the difference is
+// only apparent after looking at the next token. If it is '{', there
+// is still time to escape from notes mode.
+
+music_or_context_def:
+ music_arg
+ {
+ parser->lexer_->pop_state ();
+ }
+ | CONTEXT
+ {
+ parser->lexer_->pop_state ();
+ } '{' context_def_spec_body '}'
+ {
+ $$ = $4;
+ }
+ ;
+
output_def_body:
output_def_head_with_mode_switch '{' {
$$ = $1;
| output_def_body assignment {
}
- | output_def_body context_def_spec_block {
- assign_context_def ($$, $2);
- }
- | output_def_body music_arg {
- SCM proc = parser->lexer_->lookup_identifier ("output-def-music-handler");
- scm_call_3 (proc, parser->self_scm (), $1->self_scm (), $2);
+ | output_def_body
+ {
+ SCM nn = parser->lexer_->lookup_identifier ("pitchnames");
+ parser->lexer_->push_note_state (nn);
+ } music_or_context_def
+ {
+ if (unsmob_context_def ($3))
+ assign_context_def ($$, $3);
+ else {
+
+ SCM proc = parser->lexer_->lookup_identifier
+ ("output-def-music-handler");
+ scm_call_3 (proc, parser->self_scm (),
+ $1->self_scm (), $3);
+ }
}
| output_def_body error {
along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "bar-line.hh"
#include "item.hh"
-#include "span-bar.hh"
#include "engraver.hh"
+#include "pointer-group-interface.hh"
/**
Span_bar_engraver::acknowledge_bar_line (Grob_info i)
{
int depth = i.origin_contexts (this).size ();
- if (depth && !Span_bar::has_interface (i.grob ()))
+ if (depth && !i.grob ()->internal_has_interface (ly_symbol2scm ("span-bar-interface")))
{
Item *it = dynamic_cast<Item *> (i.grob ());
bars_.push_back (it);
spanbar_->set_parent (bars_[0], X_AXIS);
for (vsize i = 0; i < bars_.size (); i++)
- Span_bar::add_bar (spanbar_, bars_[i]);
+ Pointer_group_interface::add_grob (spanbar_, ly_symbol2scm ("elements"), bars_[i]);
make_spanbar_ = false;
}
}
SCM vis = bars_[0]->internal_get_property (vissym);
if (ly_is_equal (spanbar_->internal_get_property (vissym), vis))
spanbar_->set_property (vissym, vis);
- Span_bar::notify_grobs_of_my_existence (spanbar_);
+ scm_call_1 (ly_lily_module_constant ("span-bar::notify-grobs-of-my-existence"), spanbar_->self_scm ());
spanbar_ = 0;
}
bars_.resize (0);
#include <algorithm>
#include "align-interface.hh"
-#include "bar-line.hh"
#include "context.hh"
#include "grob.hh"
#include "item.hh"
#include "pointer-group-interface.hh"
-#include "span-bar.hh"
#include "engraver.hh"
/*
+++ /dev/null
-/*
- This file is part of LilyPond, the GNU music typesetter.
-
- Copyright (C) 1997--2012 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 "span-bar.hh"
-
-#include "font-interface.hh"
-#include "dimensions.hh"
-#include "output-def.hh"
-#include "stencil.hh"
-#include "warn.hh"
-#include "axis-group-interface.hh"
-#include "bar-line.hh"
-#include "grob.hh"
-#include "pointer-group-interface.hh"
-#include "staff-symbol-referencer.hh"
-
-void
-Span_bar::add_bar (Grob *me, Grob *b)
-{
- Pointer_group_interface::add_grob (me, ly_symbol2scm ("elements"), b);
-}
-
-MAKE_SCHEME_CALLBACK (Span_bar, print, 1);
-
-/* Limitations/Bugs:
-
-(1) Elements from 'me->get_object ("elements")' must be
-ordered according to their y coordinates relative to their common
-axis group parent. Otherwise, the computation goes mad.
-
-(2) This method depends on bar_engraver not being removed from
-staff context. If bar_engraver is removed, the size of the staff
-lines is evaluated as 0, which results in a solid span bar line
-with faulty y coordinate. */
-
-/* This routine was originally by Juergen Reuter, but it was a on the
- bulky side. Rewritten by Han-Wen. */
-SCM
-Span_bar::print (SCM smobbed_me)
-{
- Grob *me = unsmob_grob (smobbed_me);
- extract_grob_set (me, "elements", elements);
- Grob *refp = common_refpoint_of_array (elements, me, Y_AXIS);
-
- SCM glyph = me->get_property ("glyph-name");
-
- /* glyph may not be a string, when ME is killed by Hara Kiri in
- between. */
- if (!scm_is_string (glyph))
- return SCM_EOL;
-
- string glyph_string = ly_scm2string (glyph);
-
- /* compose span_bar_mol */
- vector<Interval> extents;
- vector<bool> make_span_bar;
- Grob *model_bar = 0;
- for (vsize i = elements.size (); i--;)
- {
- Grob *bar = elements[i];
- Interval ext = Bar_line::bar_y_extent (bar, refp);
- if (Grob *staff = Staff_symbol_referencer::get_staff_symbol (bar))
- ext.unite (staff->extent (refp, Y_AXIS));
- if (ext.is_empty ())
- continue;
-
- extents.push_back (ext);
- make_span_bar.push_back (to_boolean (bar->get_property ("allow-span-bar")));
- model_bar = bar;
- }
-
- if (!model_bar)
- model_bar = me;
-
- // Fixes problem with disappearing span bars when alignAboveContext is active
- vector_sort (extents, Interval::left_less);
-
- Stencil span_bar;
- for (vsize i = 1; i < extents.size (); i++)
- {
- Interval prev_extent = extents[i - 1];
- Interval ext = extents[i];
- if (!prev_extent.is_empty ())
- {
- Interval l (prev_extent [UP],
- ext[DOWN]);
-
- if (l.is_empty () || !make_span_bar[i])
- {
- /* There is overlap between the bar lines. Do nothing. */
- }
- else
- {
- Stencil interbar = Bar_line::compound_barline (model_bar,
- glyph_string,
- l,
- false);
- span_bar.add_stencil (interbar);
- }
- }
- prev_extent = ext;
- }
-
- span_bar.translate_axis (- me->relative_coordinate (refp, Y_AXIS),
- Y_AXIS);
-
- return span_bar.smobbed_copy ();
-}
-
-MAKE_SCHEME_CALLBACK (Span_bar, width, 1);
-SCM
-Span_bar::width (SCM smob)
-{
- Grob *me = unsmob_grob (smob);
- SCM gn = me->get_property ("glyph-name");
- if (!me->is_live ())
- return ly_interval2scm (Interval ());
-
- string gl = ly_scm2string (gn);
-
- /*
- urg.
- */
- Stencil m
- = Bar_line::compound_barline (me, gl, Interval (-20 PT, 20 PT), false);
-
- return ly_interval2scm (m.extent (X_AXIS));
-}
-
-MAKE_SCHEME_CALLBACK (Span_bar, before_line_breaking, 1);
-SCM
-Span_bar::before_line_breaking (SCM smob)
-{
- Grob *me = unsmob_grob (smob);
- extract_grob_set (me, "elements", elements);
- if (elements.empty ())
- me->suicide ();
-
- return SCM_UNSPECIFIED;
-}
-
-MAKE_SCHEME_CALLBACK (Span_bar, center_on_spanned_callback, 1);
-
-SCM
-Span_bar::center_on_spanned_callback (SCM smob)
-{
- Grob *me = unsmob_grob (smob);
- Interval i (get_spanned_interval (me));
-
- /* Bar_line::print delivers a barline of y-extent (-h/2, h/2), so
- we have to translate ourselves to be in the center of the
- interval that we span. */
- if (i.is_empty ())
- {
- me->suicide ();
- return scm_from_double (0.0);
- }
-
- return scm_from_double (i.center ());
-}
-
-MAKE_SCHEME_CALLBACK (Span_bar, calc_glyph_name, 1);
-SCM
-Span_bar::calc_glyph_name (SCM smob)
-{
- Grob *me = unsmob_grob (smob);
- extract_grob_set (me, "elements", elements);
- SCM gl = SCM_EOL;
- for (vsize i = elements.size ();
- i-- && !scm_is_string (gl);)
- gl = elements[i]->get_property ("glyph-name");
-
- if (!scm_is_string (gl))
- {
- me->suicide ();
- return SCM_UNSPECIFIED;
- }
-
- string type = ly_scm2string (gl);
- if (type == "|:" || type == "||:")
- type = ".|";
- else if (type == ":|")
- type = "|.";
- else if (type == ":|:")
- type = ".|.";
- else if (type == ":|.|:")
- type = "|.|";
- else if (type == ":|.:")
- type = "|.";
- else if (type == "S" || type == "S|" || type == "|S")
- type = "||";
- else if (type == "S|:" || type == ".S|:")
- type = ".|";
- else if (type == ":|S" || type == ":|S.")
- type = "|.";
- else if (type == ":|S|:" || type == ":|S.|:")
- type = "|._.|";
- else if (type == "'")
- type = "";
-
- return ly_string2scm (type);
-}
-
-void
-Span_bar::notify_grobs_of_my_existence (Grob *me)
-{
- extract_grob_set (me, "elements", elts);
- vector<Grob *> sortable (elts.begin (), elts.end ());
- vector_sort (sortable, Grob::vertical_less);
- for (vsize i = 0; i < sortable.size (); i++)
- sortable[i]->set_property ("has-span-bar",
- scm_cons (i != sortable.size () - 1 ? me->self_scm () : scm_from_bool (false),
- i != 0 ? me->self_scm () : scm_from_bool (false)));
-}
-
-Interval
-Span_bar::get_spanned_interval (Grob *me)
-{
- return ly_scm2interval (Axis_group_interface::generic_group_extent (me, Y_AXIS));
-}
-
-ADD_INTERFACE (Span_bar,
- "A bar line that is spanned between other barlines. This"
- " interface is used for bar lines that connect different"
- " staves.",
-
- /* properties */
- "glyph-name "
- "elements "
- "pure-Y-common "
- "pure-relevant-grobs "
- "pure-relevant-items "
- "pure-relevant-spanners "
- );
-
*/
#include <map>
+#include <deque>
#include "audio-column.hh"
#include "audio-item.hh"
Audio_text *instrument_name_;
Audio_text *name_;
Audio_tempo *tempo_;
+ map<string, deque<Audio_note *> > note_map_;
map<string, Audio_staff *> staff_map_;
map<string, int> channel_map_;
map<string, Audio_dynamic *> dynamic_map_;
tempo_ = 0;
instrument_name_ = 0;
instrument_ = 0;
+ // For each voice with a note played in the current translation time step,
+ // check if the voice has an Audio_dynamic registered: if yes, apply this
+ // dynamic to every note played in the voice in the current translation time
+ // step.
+ for (map<string, deque<Audio_note *> >::iterator vi = note_map_.begin ();
+ vi != note_map_.end (); ++vi)
+ {
+ Audio_dynamic *d = get_dynamic (vi->first);
+ if (d)
+ {
+ for (deque<Audio_note *>::iterator ni = vi->second.begin ();
+ ni != vi->second.end (); ++ni)
+ (*ni)->dynamic_ = d;
+ }
+ }
+ note_map_.clear ();
}
void
bool encode_dynamics_as_velocity_ = true;
if (encode_dynamics_as_velocity_)
{
- if (Audio_dynamic *d = dynamic_cast<Audio_dynamic *> (inf.elem_))
+ if (Audio_note *n = dynamic_cast<Audio_note *> (inf.elem_))
+ {
+ // Keep track of the notes played in the current voice in this
+ // translation time step (for adjusting their dynamics later in
+ // stop_translation_timestep).
+ note_map_[voice].push_back (n);
+ }
+ else if (Audio_dynamic *d = dynamic_cast<Audio_dynamic *> (inf.elem_))
{
dynamic_map_[voice] = d;
// Output volume as velocity: must disable Midi_dynamic output
d->silent_ = true;
}
- if (Audio_dynamic *d = get_dynamic (voice))
- if (Audio_note *n = dynamic_cast<Audio_note *> (inf.elem_))
- n->dynamic_ = d;
}
Audio_staff *audio_staff = get_audio_staff (voice);
audio_staff->add_audio_item (ai);
#include "paper-column.hh"
#include "separation-item.hh"
#include "warn.hh"
-#include "bar-line.hh"
#include "staff-symbol-referencer.hh"
#include "note-column.hh"
#include "stem.hh"
{
Interval bar_size;
bar_size.set_empty ();
- if (Bar_line::has_interface (bar_grob))
+
+ if (bar_grob->internal_has_interface (ly_symbol2scm ("bar-line-interface")))
{
SCM glyph = bar_grob->get_property ("glyph-name");
Grob *staff_sym = Staff_symbol_referencer::get_staff_symbol (bar_grob);
#include "context.hh"
#include "paper-column.hh"
#include "align-interface.hh"
-#include "span-bar.hh"
#include "axis-group-interface.hh"
#include "engraver.hh"
#include "spanner.hh"
#include "engraver.hh"
#include "axis-group-interface.hh"
-#include "bar-line.hh"
#include "context.hh"
#include "grob-array.hh"
#include "international.hh"
%%%% You should have received a copy of the GNU General Public License
%%%% along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
-\version "2.15.18"
+\version "2.15.42"
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
(_i "Create an acciaccatura from the following music expression"))
%% keep these two together
-"instrument-definitions" = #'()
+instrument-definitions = #'()
addInstrumentDefinition =
#(define-void-function
(parser location name lst) (string? list?)
%%%% You should have received a copy of the GNU General Public License
%%%% along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
-\version "2.15.16"
+\version "2.15.42"
%% A stringTuning is a list of pitches ordered by string number
%% from 1 to N.
defaultStringTunings = #(reverse! defaultStringTunings)
%% convert 5-string banjo tuning to 4-string by removing the 5th string
-"four-string-banjo" = #(lambda (tuning)
+four-string-banjo = #(lambda (tuning)
(take tuning 4))
\fill-line { \fromproperty #'header:dedication }
\override #'(baseline-skip . 3.5)
\column {
- \huge \larger \bold
\fill-line {
- \larger \fromproperty #'header:title
+ \huge \larger \larger \bold
+ \fromproperty #'header:title
}
\fill-line {
- \large \smaller \bold
- \larger \fromproperty #'header:subtitle
+ \large \bold
+ \fromproperty #'header:subtitle
}
\fill-line {
\smaller \bold
TEXINPUTS=$(top-src-dir)/tex/::
export TEXINPUTS
+TEXFONTMAPS=$(top-build-dir)/tex/$(outdir)::
+export TEXFONTMAPS
export LYDOC_LOCALEDIR:= $(top-build-dir)/Documentation/po/out-www
MICRO_VERSION\
MAJOR_VERSION\
MINOR_VERSION\
+ NCSB_DIR\
PACKAGE\
PATCH_LEVEL\
PATHSEP\
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: lilypond 2.15.41\n"
+"Project-Id-Version: lilypond 2.15.42\n"
"Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu."
"lilypond.bugs\n"
-"POT-Creation-Date: 2012-07-05 20:10+0200\n"
+"POT-Creation-Date: 2012-08-02 18:31+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"
-"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: fontextract.py:25
+#: book_base.py:26
#, python-format
-msgid "Scanning %s"
+msgid "file not found: %s"
msgstr ""
-#: fontextract.py:70
+#: book_base.py:164
+msgid "Output function not implemented"
+msgstr ""
+
+#: book_latex.py:170
+msgid "cannot find \\begin{document} in LaTeX document"
+msgstr ""
+
+#: book_latex.py:188
#, python-format
-msgid "Extracted %s"
+msgid "Running `%s' on file `%s' to detect default page settings.\n"
msgstr ""
-#: fontextract.py:85
+#: book_latex.py:209 book_texinfo.py:228
+msgid "Unable to auto-detect default settings:\n"
+msgstr ""
+
+#: book_latex.py:221 book_texinfo.py:240
#, python-format
-msgid "Writing fonts to %s"
+msgid ""
+"Unable to auto-detect default settings:\n"
+"%s"
msgstr ""
#: book_snippets.py:409
"printing diff against existing file."
msgstr ""
+#. Work around a texi2pdf bug: if LANG=C is not given, a broken regexp is
+#. used to detect relative/absolute paths, so the absolute path is not
+#. detected as such and this command fails:
+#: book_texinfo.py:206
+#, python-format
+msgid "Running texi2pdf on file %s to detect default page settings.\n"
+msgstr ""
+
#: convertrules.py:12
#, python-format
msgid "Not smart enough to convert %s."
msgid "beamExceptions controls whole-measure beaming."
msgstr ""
-#: book_base.py:26
+#: fontextract.py:25
#, python-format
-msgid "file not found: %s"
+msgid "Scanning %s"
msgstr ""
-#: book_base.py:164
-msgid "Output function not implemented"
+#: fontextract.py:70
+#, python-format
+msgid "Extracted %s"
+msgstr ""
+
+#: fontextract.py:85
+#, python-format
+msgid "Writing fonts to %s"
msgstr ""
#: lilylib.py:96
msgid "Unable to find instrument for ID=%s\n"
msgstr ""
-#. Work around a texi2pdf bug: if LANG=C is not given, a broken regexp is
-#. used to detect relative/absolute paths, so the absolute path is not
-#. detected as such and this command fails:
-#: book_texinfo.py:206
+#: abc2ly.py:1376 convert-ly.py:81 lilypond-book.py:122 midi2ly.py:1044
#, python-format
-msgid "Running texi2pdf on file %s to detect default page settings.\n"
-msgstr ""
-
-#: book_texinfo.py:228 book_latex.py:209
-msgid "Unable to auto-detect default settings:\n"
+msgid "%s [OPTION]... FILE"
msgstr ""
-#: book_texinfo.py:240 book_latex.py:221
+#: abc2ly.py:1377
#, python-format
msgid ""
-"Unable to auto-detect default settings:\n"
-"%s"
+"abc2ly converts ABC music files (see\n"
+"%s) to LilyPond input.\n"
msgstr ""
-#: book_latex.py:170
-msgid "cannot find \\begin{document} in LaTeX document"
+#: abc2ly.py:1385 convert-ly.py:88 etf2ly.py:1208 lilypond-book.py:231
+#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:174
+msgid "show version number and exit"
msgstr ""
-#: book_latex.py:188
-#, python-format
-msgid "Running `%s' on file `%s' to detect default page settings.\n"
+#: abc2ly.py:1388 convert-ly.py:92 etf2ly.py:1204 lilypond-book.py:140
+#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:153
+msgid "show this help and exit"
msgstr ""
-#: musicxml2ly.py:228
-#, python-format
-msgid ""
-"Encountered file created by %s, containing wrong beaming information. All "
-"beaming information in the MusicXML file will be ignored"
+#: abc2ly.py:1391 etf2ly.py:1209 midi2ly.py:1071
+msgid "write output to FILE"
msgstr ""
-#: musicxml2ly.py:247 musicxml2ly.py:249
-#, python-format
-msgid "Unprocessed PartGroupInfo %s encountered"
+#: abc2ly.py:1394
+msgid "be strict about success"
msgstr ""
-#: musicxml2ly.py:500
-#, python-format
-msgid "Encountered note at %s without type and duration (=%s)"
+#: abc2ly.py:1397
+msgid "preserve ABC's notion of beams"
msgstr ""
-#: musicxml2ly.py:520
-#, python-format
+#: abc2ly.py:1400
+msgid "suppress progress messages"
+msgstr ""
+
+#. Translators, please translate this string as
+#. "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:1403 convert-ly.py:146 etf2ly.py:1218 lilypond-book.py:258
+#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:285
+#, c-format, python-format
+msgid "Report bugs via %s"
+msgstr ""
+
+#: convert-ly.py:46
msgid ""
-"Encountered rational duration with denominator %s, unable to convert to "
-"lilypond duration"
+"Update LilyPond input to newer version. By default, update from the\n"
+"version taken from the \\version command, to the current LilyPond version."
msgstr ""
-#: musicxml2ly.py:767
-msgid "Unable to extract key signature!"
+#: convert-ly.py:48 lilypond-book.py:82
+msgid "Examples:"
msgstr ""
-#: musicxml2ly.py:794
+#: convert-ly.py:75 etf2ly.py:1191 lilypond-book.py:115 midi2ly.py:81
#, python-format
-msgid "unknown mode %s, expecting 'major' or 'minor' or a church mode!"
+msgid "Copyright (c) %s by"
msgstr ""
-#: musicxml2ly.py:932
-#, python-format
-msgid "Encountered unprocessed marker %s\n"
+#: convert-ly.py:77 etf2ly.py:1193 lilypond-book.py:117 midi2ly.py:83
+msgid "Distributed under terms of the GNU General Public License."
msgstr ""
-#: musicxml2ly.py:1026
-#, python-format
-msgid "unknown span event %s"
+#: convert-ly.py:78 etf2ly.py:1194 lilypond-book.py:118 midi2ly.py:84
+msgid "It comes with NO WARRANTY."
msgstr ""
-#: musicxml2ly.py:1036
-#, python-format
-msgid "unknown span type %s for %s"
+#: convert-ly.py:96 convert-ly.py:137
+msgid "VERSION"
msgstr ""
-#: musicxml2ly.py:1456
-msgid "Unknown metronome mark, ignoring"
+#: convert-ly.py:98
+msgid "start from VERSION [default: \\version found in file]"
msgstr ""
-#. TODO: Implement the other (more complex) way for tempo marks!
-#: musicxml2ly.py:1461
-msgid ""
-"Metronome marks with complex relations (<metronome-note> in MusicXML) are "
-"not yet implemented."
+#: convert-ly.py:101
+msgid "edit in place"
msgstr ""
-#: musicxml2ly.py:1663
-#, python-format
-msgid "Unable to convert chord type %s to lilypond."
+#: convert-ly.py:105 lilypond-book.py:179 musicxml2ly.py:2627
+msgid ""
+"Print log messages according to LOGLEVEL (NONE, ERROR, WARNING, PROGRESS "
+"(default), DEBUG)"
msgstr ""
-#: musicxml2ly.py:1816
-#, python-format
-msgid "drum %s type unknown, please add to instrument_drumtype_dict"
+#: convert-ly.py:107 lilypond-book.py:163 lilypond-book.py:181
+#: musicxml2ly.py:2629 main.cc:167
+msgid "LOGLEVEL"
msgstr ""
-#: musicxml2ly.py:1820
-msgid "cannot find suitable event"
+#: convert-ly.py:113
+msgid "do not add \\version command if missing"
msgstr ""
-#: musicxml2ly.py:1968
+#: convert-ly.py:119
#, python-format
-msgid "Negative skip %s (from position %s to %s)"
+msgid "force updating \\version number to %s"
msgstr ""
-#: musicxml2ly.py:2109
+#: convert-ly.py:125
+msgid "only update \\version number if file is modified"
+msgstr ""
+
+#: convert-ly.py:131
#, python-format
-msgid "Negative skip found: from %s to %s, difference is %s"
+msgid "show rules [default: -f 0, -t %s]"
msgstr ""
-#: musicxml2ly.py:2190
+#: convert-ly.py:136
#, python-format
-msgid "unexpected %s; expected %s or %s or %s"
+msgid "convert to VERSION [default: %s]"
msgstr ""
-#: musicxml2ly.py:2296
-msgid "Encountered closing slur, but no slur is open"
+#: convert-ly.py:141 etf2ly.py:1212 lilypond-book.py:234 midi2ly.py:1096
+#: main.cc:176
+msgid "show warranty and copyright"
msgstr ""
-#: musicxml2ly.py:2299
-msgid "Cannot have two simultaneous (closing) slurs"
+#: convert-ly.py:186
+msgid "Applying conversion: "
msgstr ""
-#: musicxml2ly.py:2308
-msgid "Cannot have a slur inside another slur"
+#: convert-ly.py:202
+msgid "Error while converting"
msgstr ""
-#: musicxml2ly.py:2311
-msgid "Cannot have two simultaneous slurs"
+#: convert-ly.py:204
+msgid "Stopping at last successful rule"
msgstr ""
-#: musicxml2ly.py:2445
+#: convert-ly.py:231
#, python-format
-msgid "cannot simultaneously have more than one mode: %s"
+msgid "Processing `%s'... "
msgstr ""
-#: musicxml2ly.py:2553
-msgid "Converting to LilyPond expressions..."
+#: convert-ly.py:338
+#, python-format
+msgid "%s: Unable to open file"
msgstr ""
-#: musicxml2ly.py:2564
-msgid "musicxml2ly [OPTION]... FILE.xml"
+#: convert-ly.py:345
+#, python-format
+msgid "%s: Unable to determine version. Skipping"
msgstr ""
-#: musicxml2ly.py:2566
+#: convert-ly.py:350
+#, python-format
msgid ""
-"Convert MusicXML from FILE.xml to LilyPond input.\n"
-"If the given filename is -, musicxml2ly reads from the command line.\n"
+"%s: Invalid version string `%s' \n"
+"Valid version strings consist of three numbers, separated by dots, e.g. "
+"`2.8.12'"
msgstr ""
-#: musicxml2ly.py:2572 midi2ly.py:1062 abc2ly.py:1388 lilypond-book.py:140
-#: convert-ly.py:92 etf2ly.py:1204 main.cc:153
-msgid "show this help and exit"
+#: etf2ly.py:1197
+#, python-format
+msgid "%s [OPTION]... ETF-FILE"
msgstr ""
-#: musicxml2ly.py:2576
+#: etf2ly.py:1198
msgid ""
-"Copyright (c) 2005--2012 by\n"
-" Han-Wen Nienhuys <hanwen@xs4all.nl>,\n"
-" Jan Nieuwenhuizen <janneke@gnu.org> and\n"
-" Reinhold Kainhofer <reinhold@kainhofer.com>\n"
+"Enigma Transport Format is a format used by Coda Music Technology's\n"
+"Finale product. etf2ly converts a subset of ETF to a ready-to-use LilyPond "
+"file.\n"
msgstr ""
-#: musicxml2ly.py:2590 midi2ly.py:1095 abc2ly.py:1385 lilypond-book.py:231
-#: convert-ly.py:88 etf2ly.py:1208 main.cc:174
-msgid "show version number and exit"
+#: etf2ly.py:1210 midi2ly.py:1067 midi2ly.py:1072 musicxml2ly.py:2659
+#: main.cc:159 main.cc:171
+msgid "FILE"
msgstr ""
-#: musicxml2ly.py:2596 midi2ly.py:1090 lilypond-book.py:223
-msgid "be verbose"
+#: lilypond-book.py:80
+msgid ""
+"Process LilyPond snippets in hybrid HTML, LaTeX, texinfo or DocBook document."
msgstr ""
-#: musicxml2ly.py:2602
-msgid "use lxml.etree; uses less memory and cpu time"
+#: lilypond-book.py:87
+msgid "BOOK"
msgstr ""
-#: musicxml2ly.py:2608
-msgid "input file is a zip-compressed MusicXML file"
+#: lilypond-book.py:95
+#, python-format
+msgid "Exiting (%d)..."
msgstr ""
-#: musicxml2ly.py:2614
-msgid "convert pitches in relative mode (default)"
+#: lilypond-book.py:127
+msgid "FILTER"
msgstr ""
-#: musicxml2ly.py:2619
-msgid "convert pitches in absolute mode"
+#: lilypond-book.py:130
+msgid "pipe snippets through FILTER [default: `convert-ly -n -']"
msgstr ""
-#: musicxml2ly.py:2622
-msgid "LANG"
+#: lilypond-book.py:134
+msgid ""
+"use output format FORMAT (texi [default], texi-html, latex, html, docbook)"
msgstr ""
-#: musicxml2ly.py:2624
-msgid "use LANG for pitch names, e.g. 'deutsch' for note names in German"
+#: lilypond-book.py:135
+msgid "FORMAT"
msgstr ""
-#: musicxml2ly.py:2627 lilypond-book.py:179 convert-ly.py:105
-msgid ""
-"Print log messages according to LOGLEVEL (NONE, ERROR, WARNING, PROGRESS "
-"(default), DEBUG)"
+#: lilypond-book.py:142
+msgid "add DIR to include path"
msgstr ""
-#: musicxml2ly.py:2629 lilypond-book.py:163 lilypond-book.py:181
-#: convert-ly.py:107 main.cc:167
-msgid "LOGLEVEL"
+#: 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:158
+msgid "DIR"
msgstr ""
-#: musicxml2ly.py:2638
-msgid "do not convert directions (^, _ or -) for articulations, dynamics, etc."
+#: lilypond-book.py:148
+msgid "format Texinfo output so that Info will look for images of music in DIR"
msgstr ""
-#: musicxml2ly.py:2644
-msgid "do not convert exact vertical positions of rests"
+#: lilypond-book.py:155
+msgid "PAD"
msgstr ""
-#: musicxml2ly.py:2650
-msgid "do not convert the exact page layout and breaks"
+#: lilypond-book.py:157
+msgid ""
+"pad left side of music to align music inspite of uneven bar numbers (in mm)"
msgstr ""
-#: musicxml2ly.py:2656
+#: lilypond-book.py:162
+msgid "Print lilypond log messages according to LOGLEVEL"
+msgstr ""
+
+#: lilypond-book.py:168
+msgid "write lily-XXX files to DIR, link into --output dir"
+msgstr ""
+
+#: lilypond-book.py:173
msgid ""
-"do not convert beaming information, use lilypond's automatic beaming instead"
+"Load the additional python PACKAGE (containing e.g. a custom output format)"
msgstr ""
-#: musicxml2ly.py:2659 midi2ly.py:1067 midi2ly.py:1072 etf2ly.py:1210
-#: main.cc:159 main.cc:171
-msgid "FILE"
+#: lilypond-book.py:174
+msgid "PACKAGE"
msgstr ""
-#: musicxml2ly.py:2664
-msgid "set output filename to FILE, stdout if -"
+#: lilypond-book.py:186
+msgid "write output to DIR"
msgstr ""
-#: musicxml2ly.py:2670
-msgid "activate midi-block"
+#: lilypond-book.py:191
+msgid "COMMAND"
msgstr ""
-#. Translators, please translate this string as
-#. "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"
-#: musicxml2ly.py:2674 midi2ly.py:1107 abc2ly.py:1403 lilypond-book.py:258
-#: convert-ly.py:146 etf2ly.py:1218 main.cc:285
-#, c-format, python-format
-msgid "Report bugs via %s"
+#: lilypond-book.py:192
+msgid "process ly_files using COMMAND FILE..."
msgstr ""
-#: musicxml2ly.py:2754
+#: lilypond-book.py:197
+msgid "Redirect the lilypond output"
+msgstr ""
+
+#: lilypond-book.py:201
+msgid "Compile snippets in safe mode"
+msgstr ""
+
+#: lilypond-book.py:207
+msgid "do not fail if no lilypond output is found"
+msgstr ""
+
+#: lilypond-book.py:213
+msgid "do not fail if no PNG images are found for EPS files"
+msgstr ""
+
+#: lilypond-book.py:219
+msgid "write snippet output files with the same base name as their source file"
+msgstr ""
+
+#: lilypond-book.py:223 midi2ly.py:1090 musicxml2ly.py:2596
+msgid "be verbose"
+msgstr ""
+
+#: lilypond-book.py:239
+msgid ""
+"run executable PROG instead of latex, or in\n"
+"case --pdf option is set instead of pdflatex"
+msgstr ""
+
+#: lilypond-book.py:241 lilypond-book.py:246
+msgid "PROG"
+msgstr ""
+
+#: lilypond-book.py:245
+msgid "run executable PROG instead of texi2pdf"
+msgstr ""
+
+#: lilypond-book.py:252
+msgid "create PDF files for use with PDFTeX"
+msgstr ""
+
+#: lilypond-book.py:455
+msgid "Writing snippets..."
+msgstr ""
+
+#: lilypond-book.py:460
+msgid "Processing..."
+msgstr ""
+
+#: lilypond-book.py:465
+msgid "All snippets are up to date..."
+msgstr ""
+
+#: lilypond-book.py:467
+msgid "Linking files..."
+msgstr ""
+
+#: lilypond-book.py:487
#, python-format
-msgid "unknown part in part-list: %s"
+msgid "cannot determine format for: %s"
msgstr ""
-#: musicxml2ly.py:2816
-msgid "Input is compressed, extracting raw MusicXML data from stdin"
+#: lilypond-book.py:496
+#, python-format
+msgid "%s is up to date."
msgstr ""
-#: musicxml2ly.py:2829
+#: lilypond-book.py:509
#, python-format
-msgid "Input file %s is compressed, extracting raw MusicXML data"
+msgid "Writing `%s'..."
msgstr ""
-#: musicxml2ly.py:2859
-msgid "Reading MusicXML from Standard input ..."
+#: lilypond-book.py:570
+msgid "Output would overwrite input file; use --output."
msgstr ""
-#: musicxml2ly.py:2861
+#: lilypond-book.py:574
#, python-format
-msgid "Reading MusicXML from %s ..."
+msgid "Reading %s..."
msgstr ""
-#: musicxml2ly.py:2894
+#: lilypond-book.py:581
+msgid "Dissecting..."
+msgstr ""
+
+#: lilypond-book.py:592
#, python-format
-msgid "Output to `%s'"
+msgid "Compiling %s..."
msgstr ""
-#: musicxml2ly.py:2964
+#: lilypond-book.py:600
#, python-format
-msgid "Unable to find input file %s"
+msgid "Processing include: %s"
msgstr ""
-#: midi2ly.py:81 lilypond-book.py:115 convert-ly.py:75 etf2ly.py:1191
+#: lilypond-book.py:611
#, python-format
-msgid "Copyright (c) %s by"
+msgid "Removing `%s'"
msgstr ""
-#: midi2ly.py:83 lilypond-book.py:117 convert-ly.py:77 etf2ly.py:1193
-msgid "Distributed under terms of the GNU General Public License."
+#: lilypond-book.py:704
+#, python-format
+msgid "Setting LilyPond's loglevel to %s"
msgstr ""
-#: midi2ly.py:84 lilypond-book.py:118 convert-ly.py:78 etf2ly.py:1194
-msgid "It comes with NO WARRANTY."
+#: lilypond-book.py:708
+#, python-format
+msgid ""
+"Setting LilyPond's loglevel to %s (from environment variable "
+"LILYPOND_LOGLEVEL)"
+msgstr ""
+
+#: lilypond-book.py:711
+msgid ""
+"Setting LilyPond's output to --verbose, implied by lilypond-book's setting"
msgstr ""
#: midi2ly.py:90
msgid "%s output to `%s'..."
msgstr ""
-#: midi2ly.py:1044 abc2ly.py:1376 lilypond-book.py:122 convert-ly.py:81
-#, python-format
-msgid "%s [OPTION]... FILE"
-msgstr ""
-
#: midi2ly.py:1045
#, python-format
msgid "Convert %s to LilyPond input.\n"
msgid "ALT[:MINOR]"
msgstr ""
-#: midi2ly.py:1071 abc2ly.py:1391 etf2ly.py:1209
-msgid "write output to FILE"
-msgstr ""
-
#: midi2ly.py:1074
msgid "preview of first 4 bars"
msgstr ""
msgid "allow tuplet durations DUR*NUM/DEN"
msgstr ""
-#: midi2ly.py:1096 lilypond-book.py:234 convert-ly.py:141 etf2ly.py:1212
-#: main.cc:176
-msgid "show warranty and copyright"
-msgstr ""
-
#: midi2ly.py:1098
msgid "treat every text as a lyric"
msgstr ""
msgid "no files specified on command line."
msgstr ""
-#: abc2ly.py:1377
+#: musicxml2ly.py:228
#, python-format
msgid ""
-"abc2ly converts ABC music files (see\n"
-"%s) to LilyPond input.\n"
+"Encountered file created by %s, containing wrong beaming information. All "
+"beaming information in the MusicXML file will be ignored"
msgstr ""
-#: abc2ly.py:1394
-msgid "be strict about success"
+#: musicxml2ly.py:247 musicxml2ly.py:249
+#, python-format
+msgid "Unprocessed PartGroupInfo %s encountered"
msgstr ""
-#: abc2ly.py:1397
-msgid "preserve ABC's notion of beams"
+#: musicxml2ly.py:500
+#, python-format
+msgid "Encountered note at %s without type and duration (=%s)"
msgstr ""
-#: abc2ly.py:1400
-msgid "suppress progress messages"
+#: musicxml2ly.py:520
+#, python-format
+msgid ""
+"Encountered rational duration with denominator %s, unable to convert to "
+"lilypond duration"
msgstr ""
-#: lilypond-book.py:80
-msgid ""
-"Process LilyPond snippets in hybrid HTML, LaTeX, texinfo or DocBook document."
+#: musicxml2ly.py:767
+msgid "Unable to extract key signature!"
msgstr ""
-#: lilypond-book.py:82 convert-ly.py:48
-msgid "Examples:"
+#: musicxml2ly.py:794
+#, python-format
+msgid "unknown mode %s, expecting 'major' or 'minor' or a church mode!"
msgstr ""
-#: lilypond-book.py:87
-msgid "BOOK"
+#: musicxml2ly.py:932
+#, python-format
+msgid "Encountered unprocessed marker %s\n"
msgstr ""
-#: lilypond-book.py:95
+#: musicxml2ly.py:1026
#, python-format
-msgid "Exiting (%d)..."
+msgid "unknown span event %s"
msgstr ""
-#: lilypond-book.py:127
-msgid "FILTER"
+#: musicxml2ly.py:1036
+#, python-format
+msgid "unknown span type %s for %s"
msgstr ""
-#: lilypond-book.py:130
-msgid "pipe snippets through FILTER [default: `convert-ly -n -']"
+#: musicxml2ly.py:1456
+msgid "Unknown metronome mark, ignoring"
msgstr ""
-#: lilypond-book.py:134
+#. TODO: Implement the other (more complex) way for tempo marks!
+#: musicxml2ly.py:1461
msgid ""
-"use output format FORMAT (texi [default], texi-html, latex, html, docbook)"
+"Metronome marks with complex relations (<metronome-note> in MusicXML) are "
+"not yet implemented."
msgstr ""
-#: lilypond-book.py:135
-msgid "FORMAT"
+#: musicxml2ly.py:1663
+#, python-format
+msgid "Unable to convert chord type %s to lilypond."
msgstr ""
-#: lilypond-book.py:142
-msgid "add DIR to include path"
+#: musicxml2ly.py:1816
+#, python-format
+msgid "drum %s type unknown, please add to instrument_drumtype_dict"
msgstr ""
-#: 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:158
-msgid "DIR"
+#: musicxml2ly.py:1820
+msgid "cannot find suitable event"
msgstr ""
-#: lilypond-book.py:148
-msgid "format Texinfo output so that Info will look for images of music in DIR"
+#: musicxml2ly.py:1968
+#, python-format
+msgid "Negative skip %s (from position %s to %s)"
msgstr ""
-#: lilypond-book.py:155
-msgid "PAD"
+#: musicxml2ly.py:2109
+#, python-format
+msgid "Negative skip found: from %s to %s, difference is %s"
msgstr ""
-#: lilypond-book.py:157
-msgid ""
-"pad left side of music to align music inspite of uneven bar numbers (in mm)"
+#: musicxml2ly.py:2190
+#, python-format
+msgid "unexpected %s; expected %s or %s or %s"
msgstr ""
-#: lilypond-book.py:162
-msgid "Print lilypond log messages according to LOGLEVEL"
+#: musicxml2ly.py:2296
+msgid "Encountered closing slur, but no slur is open"
msgstr ""
-#: lilypond-book.py:168
-msgid "write lily-XXX files to DIR, link into --output dir"
-msgstr ""
-
-#: lilypond-book.py:173
-msgid ""
-"Load the additional python PACKAGE (containing e.g. a custom output format)"
-msgstr ""
-
-#: lilypond-book.py:174
-msgid "PACKAGE"
-msgstr ""
-
-#: lilypond-book.py:186
-msgid "write output to DIR"
-msgstr ""
-
-#: lilypond-book.py:191
-msgid "COMMAND"
-msgstr ""
-
-#: lilypond-book.py:192
-msgid "process ly_files using COMMAND FILE..."
+#: musicxml2ly.py:2299
+msgid "Cannot have two simultaneous (closing) slurs"
msgstr ""
-#: lilypond-book.py:197
-msgid "Redirect the lilypond output"
+#: musicxml2ly.py:2308
+msgid "Cannot have a slur inside another slur"
msgstr ""
-#: lilypond-book.py:201
-msgid "Compile snippets in safe mode"
+#: musicxml2ly.py:2311
+msgid "Cannot have two simultaneous slurs"
msgstr ""
-#: lilypond-book.py:207
-msgid "do not fail if no lilypond output is found"
+#: musicxml2ly.py:2445
+#, python-format
+msgid "cannot simultaneously have more than one mode: %s"
msgstr ""
-#: lilypond-book.py:213
-msgid "do not fail if no PNG images are found for EPS files"
+#: musicxml2ly.py:2553
+msgid "Converting to LilyPond expressions..."
msgstr ""
-#: lilypond-book.py:219
-msgid "write snippet output files with the same base name as their source file"
+#: musicxml2ly.py:2564
+msgid "musicxml2ly [OPTION]... FILE.xml"
msgstr ""
-#: lilypond-book.py:239
+#: musicxml2ly.py:2566
msgid ""
-"run executable PROG instead of latex, or in\n"
-"case --pdf option is set instead of pdflatex"
-msgstr ""
-
-#: lilypond-book.py:241 lilypond-book.py:246
-msgid "PROG"
-msgstr ""
-
-#: lilypond-book.py:245
-msgid "run executable PROG instead of texi2pdf"
-msgstr ""
-
-#: lilypond-book.py:252
-msgid "create PDF files for use with PDFTeX"
-msgstr ""
-
-#: lilypond-book.py:455
-msgid "Writing snippets..."
-msgstr ""
-
-#: lilypond-book.py:460
-msgid "Processing..."
-msgstr ""
-
-#: lilypond-book.py:465
-msgid "All snippets are up to date..."
-msgstr ""
-
-#: lilypond-book.py:467
-msgid "Linking files..."
-msgstr ""
-
-#: lilypond-book.py:487
-#, python-format
-msgid "cannot determine format for: %s"
-msgstr ""
-
-#: lilypond-book.py:496
-#, python-format
-msgid "%s is up to date."
+"Convert MusicXML from FILE.xml to LilyPond input.\n"
+"If the given filename is -, musicxml2ly reads from the command line.\n"
msgstr ""
-#: lilypond-book.py:509
-#, python-format
-msgid "Writing `%s'..."
+#: musicxml2ly.py:2576
+msgid ""
+"Copyright (c) 2005--2012 by\n"
+" Han-Wen Nienhuys <hanwen@xs4all.nl>,\n"
+" Jan Nieuwenhuizen <janneke@gnu.org> and\n"
+" Reinhold Kainhofer <reinhold@kainhofer.com>\n"
msgstr ""
-#: lilypond-book.py:570
-msgid "Output would overwrite input file; use --output."
+#: musicxml2ly.py:2602
+msgid "use lxml.etree; uses less memory and cpu time"
msgstr ""
-#: lilypond-book.py:574
-#, python-format
-msgid "Reading %s..."
+#: musicxml2ly.py:2608
+msgid "input file is a zip-compressed MusicXML file"
msgstr ""
-#: lilypond-book.py:581
-msgid "Dissecting..."
+#: musicxml2ly.py:2614
+msgid "convert pitches in relative mode (default)"
msgstr ""
-#: lilypond-book.py:592
-#, python-format
-msgid "Compiling %s..."
+#: musicxml2ly.py:2619
+msgid "convert pitches in absolute mode"
msgstr ""
-#: lilypond-book.py:600
-#, python-format
-msgid "Processing include: %s"
+#: musicxml2ly.py:2622
+msgid "LANG"
msgstr ""
-#: lilypond-book.py:611
-#, python-format
-msgid "Removing `%s'"
+#: musicxml2ly.py:2624
+msgid "use LANG for pitch names, e.g. 'deutsch' for note names in German"
msgstr ""
-#: lilypond-book.py:704
-#, python-format
-msgid "Setting LilyPond's loglevel to %s"
+#: musicxml2ly.py:2638
+msgid "do not convert directions (^, _ or -) for articulations, dynamics, etc."
msgstr ""
-#: lilypond-book.py:708
-#, python-format
-msgid ""
-"Setting LilyPond's loglevel to %s (from environment variable "
-"LILYPOND_LOGLEVEL)"
+#: musicxml2ly.py:2644
+msgid "do not convert exact vertical positions of rests"
msgstr ""
-#: lilypond-book.py:711
-msgid ""
-"Setting LilyPond's output to --verbose, implied by lilypond-book's setting"
+#: musicxml2ly.py:2650
+msgid "do not convert the exact page layout and breaks"
msgstr ""
-#: convert-ly.py:46
+#: musicxml2ly.py:2656
msgid ""
-"Update LilyPond input to newer version. By default, update from the\n"
-"version taken from the \\version command, to the current LilyPond version."
-msgstr ""
-
-#: convert-ly.py:96 convert-ly.py:137
-msgid "VERSION"
-msgstr ""
-
-#: convert-ly.py:98
-msgid "start from VERSION [default: \\version found in file]"
+"do not convert beaming information, use lilypond's automatic beaming instead"
msgstr ""
-#: convert-ly.py:101
-msgid "edit in place"
+#: musicxml2ly.py:2664
+msgid "set output filename to FILE, stdout if -"
msgstr ""
-#: convert-ly.py:113
-msgid "do not add \\version command if missing"
+#: musicxml2ly.py:2670
+msgid "activate midi-block"
msgstr ""
-#: convert-ly.py:119
+#: musicxml2ly.py:2754
#, python-format
-msgid "force updating \\version number to %s"
-msgstr ""
-
-#: convert-ly.py:125
-msgid "only update \\version number if file is modified"
+msgid "unknown part in part-list: %s"
msgstr ""
-#: convert-ly.py:131
-#, python-format
-msgid "show rules [default: -f 0, -t %s]"
+#: musicxml2ly.py:2816
+msgid "Input is compressed, extracting raw MusicXML data from stdin"
msgstr ""
-#: convert-ly.py:136
+#: musicxml2ly.py:2829
#, python-format
-msgid "convert to VERSION [default: %s]"
-msgstr ""
-
-#: convert-ly.py:186
-msgid "Applying conversion: "
+msgid "Input file %s is compressed, extracting raw MusicXML data"
msgstr ""
-#: convert-ly.py:202
-msgid "Error while converting"
+#: musicxml2ly.py:2859
+msgid "Reading MusicXML from Standard input ..."
msgstr ""
-#: convert-ly.py:204
-msgid "Stopping at last successful rule"
+#: musicxml2ly.py:2861
+#, python-format
+msgid "Reading MusicXML from %s ..."
msgstr ""
-#: convert-ly.py:231
+#: musicxml2ly.py:2894
#, python-format
-msgid "Processing `%s'... "
+msgid "Output to `%s'"
msgstr ""
-#: convert-ly.py:338
+#: musicxml2ly.py:2964
#, python-format
-msgid "%s: Unable to open file"
+msgid "Unable to find input file %s"
msgstr ""
-#: convert-ly.py:345
-#, python-format
-msgid "%s: Unable to determine version. Skipping"
+#: website_post.py:123
+msgid "English"
msgstr ""
-#: convert-ly.py:350
-#, python-format
-msgid ""
-"%s: Invalid version string `%s' \n"
-"Valid version strings consist of three numbers, separated by dots, e.g. "
-"`2.8.12'"
+#: website_post.py:126
+msgid "Other languages"
msgstr ""
-#: etf2ly.py:1197
+#: website_post.py:127
#, python-format
-msgid "%s [OPTION]... ETF-FILE"
+msgid "About <a href=\"%s\">automatic language selection</a>."
msgstr ""
-#: etf2ly.py:1198
-msgid ""
-"Enigma Transport Format is a format used by Coda Music Technology's\n"
-"Finale product. etf2ly converts a subset of ETF to a ready-to-use LilyPond "
-"file.\n"
+#: getopt-long.cc:153
+#, c-format
+msgid "option `%s' requires an argument"
msgstr ""
-#: website_post.py:123
-msgid "English"
+#: getopt-long.cc:157
+#, c-format
+msgid "option `%s' does not allow an argument"
msgstr ""
-#: website_post.py:126
-msgid "Other languages"
+#: getopt-long.cc:161
+#, c-format
+msgid "unrecognized option: `%s'"
msgstr ""
-#: website_post.py:127
-#, python-format
-msgid "About <a href=\"%s\">automatic language selection</a>."
+#: getopt-long.cc:167
+#, c-format
+msgid "invalid argument `%s' to option `%s'"
msgstr ""
#: warn.cc:56
msgid "suppressed warning: %s"
msgstr ""
-#: getopt-long.cc:153
+#: accidental-engraver.cc:180
#, c-format
-msgid "option `%s' requires an argument"
+msgid "accidental typesetting list must begin with context-name: %s"
msgstr ""
-#: getopt-long.cc:157
+#: accidental-engraver.cc:210
#, c-format
-msgid "option `%s' does not allow an argument"
+msgid "procedure or context-name expected for accidental rule, found %s"
msgstr ""
-#: getopt-long.cc:161
+#: accidental.cc:200
#, c-format
-msgid "unrecognized option: `%s'"
+msgid "Could not find glyph-name for alteration %s"
msgstr ""
-#: getopt-long.cc:167
-#, c-format
-msgid "invalid argument `%s' to option `%s'"
-msgstr ""
-
-#: input.cc:138 source-file.cc:178 source-file.cc:193
-msgid "position unknown"
-msgstr ""
-
-#: chord-tremolo-engraver.cc:88
-msgid "No tremolo to end"
-msgstr ""
-
-#: chord-tremolo-engraver.cc:109
-msgid "unterminated chord tremolo"
-msgstr ""
-
-#: chord-tremolo-engraver.cc:149 beam-engraver.cc:266
-msgid "stem must have Rhythmic structure"
-msgstr ""
-
-#: flag.cc:113
-#, c-format
-msgid "flag `%s' not found"
-msgstr ""
-
-#: flag.cc:133
-#, c-format
-msgid "flag stroke `%s' not found"
-msgstr ""
-
-#: vaticana-ligature.cc:94
-msgid "flexa-height undefined; assuming 0"
-msgstr ""
-
-#: vaticana-ligature.cc:99
-msgid "ascending vaticana style flexa"
-msgstr ""
-
-#: slur.cc:430
-#, c-format
-msgid "Ignoring grob for slur: %s. avoid-slur not set?"
-msgstr ""
-
-#: translator-group.cc:188
-#, c-format
-msgid "cannot find: `%s'"
-msgstr ""
-
-#: hyphen-engraver.cc:104
-msgid "removing unterminated hyphen"
-msgstr ""
-
-#: hyphen-engraver.cc:118
-msgid "unterminated hyphen; removing"
-msgstr ""
-
-#: page-layout-problem.cc:403
-msgid ""
-"A page layout problem has been initiated that cannot accommodate footnotes."
-msgstr ""
-
-#: page-layout-problem.cc:721
-msgid ""
-"cannot fit music on page: ragged-spacing was requested, but page was "
-"compressed"
+#: accidental.cc:215
+msgid "natural alteration glyph not found"
msgstr ""
-#: page-layout-problem.cc:724
+#: all-font-metrics.cc:149
#, c-format
-msgid "cannot fit music on page: overflow is %f"
-msgstr ""
-
-#: page-layout-problem.cc:726
-msgid "compressing music to fit"
+msgid "cannot find font: `%s'"
msgstr ""
-#: page-layout-problem.cc:1188
-msgid "staff-affinities should only decrease"
+#: apply-context-iterator.cc:42
+msgid "\\applycontext argument is not a procedure"
msgstr ""
#: arpeggio.cc:115
msgid "no heads for arpeggio found?"
msgstr ""
-#: lyric-combine-music-iterator.cc:199
-msgid "argument of \\lyricsto should contain Lyrics context"
-msgstr ""
-
-#: lyric-combine-music-iterator.cc:337
-#, c-format
-msgid "cannot find Voice `%s'"
-msgstr ""
-
-#: custos.cc:87
-#, c-format
-msgid "custos `%s' not found"
-msgstr ""
-
-#: context.cc:149
-#, c-format
-msgid "cannot find or create new `%s'"
-msgstr ""
-
-#: context.cc:207
-#, c-format
-msgid "cannot find or create `%s' called `%s'"
-msgstr ""
-
-#: context.cc:400
-#, c-format
-msgid "cannot find or create: `%s'"
-msgstr ""
-
-#: dispatcher.cc:83
-msgid "Event class should be a list"
-msgstr ""
-
-#: dispatcher.cc:166
-#, c-format
-msgid "Junking event: %s"
-msgstr ""
-
-#: dispatcher.cc:262
-msgid "Attempting to remove nonexisting listener."
-msgstr ""
-
-#: dispatcher.cc:284
-msgid "Already listening to dispatcher, ignoring request"
-msgstr ""
-
-#: grob-property.cc:35
-#, c-format
-msgid "%d: %s"
-msgstr ""
-
#: auto-change-iterator.cc:74 change-iterator.cc:72
#, c-format
msgid "cannot change, already in translator: %s"
msgstr ""
-#: tie-engraver.cc:117
-msgid "unterminated tie"
-msgstr ""
-
-#: tie-engraver.cc:348
-msgid "lonely tie"
-msgstr ""
-
-#: note-column.cc:147
-msgid "cannot have note heads and rests together on a stem"
-msgstr ""
-
-#: parse-scm.cc:121
-msgid "GUILE signaled an error for the expression beginning here"
-msgstr ""
-
-#: footnote-engraver.cc:109
-msgid "Must be footnote-event."
-msgstr ""
-
-#: paper-score.cc:122 minimal-page-breaking.cc:40
-msgid "Calculating line breaks..."
-msgstr ""
-
-#: paper-score.cc:134
-#, c-format
-msgid "Element count %d (spanners %d) "
-msgstr ""
-
-#: paper-score.cc:138
-msgid "Preprocessing graphical objects..."
-msgstr ""
-
-#: paper-score.cc:162 optimal-page-breaking.cc:207
-#: page-turn-page-breaking.cc:248
-msgid "Drawing systems..."
-msgstr ""
-
-#: program-option-scheme.cc:235
-#, c-format
-msgid "no such internal option: %s"
-msgstr ""
-
-#: mensural-ligature-engraver.cc:96
-msgid "ligature with less than 2 heads -> skipping"
-msgstr ""
-
-#: mensural-ligature-engraver.cc:123
-msgid "cannot determine pitch of ligature primitive -> skipping"
-msgstr ""
-
-#: mensural-ligature-engraver.cc:137
-msgid "single note ligature - skipping"
-msgstr ""
-
-#: mensural-ligature-engraver.cc:148
-msgid "prime interval within ligature -> skipping"
-msgstr ""
-
-#: mensural-ligature-engraver.cc:159
-msgid "mensural ligature: duration none of Mx, L, B, S -> skipping"
-msgstr ""
-
-#: mensural-ligature-engraver.cc:202
-msgid "semibrevis must be followed by another one -> skipping"
-msgstr ""
-
-#: mensural-ligature-engraver.cc:212
-msgid ""
-"semibreves can only appear at the beginning of a ligature,\n"
-"and there may be only zero or two of them"
-msgstr ""
-
-#: mensural-ligature-engraver.cc:232
-msgid ""
-"invalid ligatura ending:\n"
-"when the last note is a descending brevis,\n"
-"the penultimate note must be another one,\n"
-"or the ligatura must be LB or SSB"
-msgstr ""
-
-#: mensural-ligature-engraver.cc:387
-msgid "unexpected case fall-through"
-msgstr ""
-
-#: piano-pedal-engraver.cc:279
-#, c-format
-msgid "expect 3 strings for piano pedals, found: %ld"
-msgstr ""
-
-#: piano-pedal-engraver.cc:294 piano-pedal-engraver.cc:305
-#: piano-pedal-performer.cc:104
-#, c-format
-msgid "cannot find start of piano pedal: `%s'"
-msgstr ""
-
-#: piano-pedal-engraver.cc:340
-#, c-format
-msgid "cannot find start of piano pedal bracket: `%s'"
-msgstr ""
-
-#: new-dynamic-engraver.cc:168
-#, c-format
-msgid ""
-"unknown crescendo style: %s\n"
-"defaulting to hairpin."
-msgstr ""
-
-#: new-dynamic-engraver.cc:233
-#, c-format
-msgid "unterminated %s"
-msgstr ""
-
-#: general-scheme.cc:390
-#, c-format
-msgid "failed redirecting stderr to `%s'"
+#: axis-group-engraver.cc:94
+msgid "Axis_group_engraver: vertical group already has a parent"
msgstr ""
-#: general-scheme.cc:469 output-ps.scm:48
-msgid "Found infinity or nan in output. Substituting 0.0"
+#: axis-group-engraver.cc:95
+msgid "are there two Axis_group_engravers?"
msgstr ""
-#: music.cc:150
-#, c-format
-msgid "octave check failed; expected \"%s\", found: \"%s\""
+#: axis-group-engraver.cc:96
+msgid "removing this vertical group"
msgstr ""
-#: music.cc:219
-msgid "(normalized pitch)"
+#: axis-group-interface.cc:668
+msgid "an outside-staff object should have a direction, defaulting to up"
msgstr ""
-#: music.cc:223
+#: bar-check-iterator.cc:84
#, c-format
-msgid "Transposing %s by %s makes alteration larger than double"
+msgid "barcheck failed at: %s"
msgstr ""
-#: stem.cc:128
-msgid "weird stem size, check for narrow beams"
+#: beam-engraver.cc:147
+msgid "already have a beam"
msgstr ""
-#: relative-octave-check.cc:49
-msgid "Failed octave check, got: "
+#: beam-engraver.cc:230
+msgid "unterminated beam"
msgstr ""
-#: translator-ctors.cc:65
-#, c-format
-msgid "unknown translator: `%s'"
+#: beam-engraver.cc:266 chord-tremolo-engraver.cc:149
+msgid "stem must have Rhythmic structure"
msgstr ""
-#: partial-iterator.cc:45
-msgid "trying to use \\partial after the start of a piece"
+#: beam-engraver.cc:277
+msgid "stem does not fit in beam"
msgstr ""
-#: relocate.cc:52
-#, c-format
-msgid "Setting %s to %s"
+#: beam-engraver.cc:278
+msgid "beam was started here"
msgstr ""
-#. this warning should only be printed in debug mode!
-#: relocate.cc:73
-#, c-format
-msgid "no such file: %s for %s"
+#. We are completely screwed.
+#: beam-quanting.cc:839
+msgid "no viable initial configuration found: may not find good beam slope"
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
-#, c-format
-msgid "no such directory: %s for %s"
+#: beam.cc:181
+msgid "removing beam with no stems"
msgstr ""
-#: relocate.cc:93
+#: change-iterator.cc:34
#, c-format
-msgid "%s=%s (prepend)\n"
+msgid "cannot change `%s' to `%s'"
msgstr ""
-#: relocate.cc:124
-#, c-format
-msgid "not relocating, no %s/ or current/ found under %s"
+#. FIXME: constant error message.
+#: change-iterator.cc:93
+msgid "cannot find context to switch to"
msgstr ""
-#: relocate.cc:134
+#. 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
#, c-format
-msgid "Relocation: compile datadir=%s, new datadir=%s"
+msgid "not changing to same context type: %s"
msgstr ""
-#: relocate.cc:146
-#, c-format
-msgid "Relocation: framework_prefix=%s"
+#. FIXME: uncomprehensable message
+#: change-iterator.cc:106
+msgid "none of these in my family"
msgstr ""
-#: relocate.cc:186
-#, c-format
-msgid "Relocation: is absolute: argv0=%s\n"
+#: chord-tremolo-engraver.cc:88
+msgid "No tremolo to end"
msgstr ""
-#: relocate.cc:192
-#, c-format
-msgid "Relocation: from cwd: argv0=%s\n"
+#: chord-tremolo-engraver.cc:109
+msgid "unterminated chord tremolo"
msgstr ""
-#: relocate.cc:208
+#: clef.cc:65
#, c-format
-msgid ""
-"Relocation: from PATH=%s\n"
-"argv0=%s"
-msgstr ""
-
-#: relocate.cc:235
-msgid "LILYPONDPREFIX is obsolete, use LILYPOND_DATADIR"
+msgid "clef `%s' not found"
msgstr ""
-#: relocate.cc:360
+#: cluster.cc:120
#, c-format
-msgid "Relocation file: %s"
+msgid "unknown cluster style `%s'"
msgstr ""
-#: relocate.cc:364 source-file.cc:65
-#, c-format
-msgid "cannot open file: `%s'"
+#: cluster.cc:157
+msgid "junking empty cluster"
msgstr ""
-#: relocate.cc:394
+#: coherent-ligature-engraver.cc:110
#, c-format
-msgid "Unknown relocation command %s"
+msgid "Coherent_ligature_engraver: setting `spacing-increment=0.01': ptr=%ul"
msgstr ""
-#: extender-engraver.cc:169 extender-engraver.cc:178
-msgid "unterminated extender"
+#. if we get to here, just put everything on one line
+#: constrained-breaking.cc:187 constrained-breaking.cc:205
+msgid "cannot find line breaking that satisfies constraints"
msgstr ""
-#: lily-lexer.cc:255
-msgid "include files are not allowed in safe mode"
+#: context-property.cc:43
+msgid "need symbol arguments for \\override and \\revert"
msgstr ""
-#: lily-lexer.cc:282
+#: context.cc:149
#, c-format
-msgid "identifier name is a keyword: `%s'"
+msgid "cannot find or create new `%s'"
msgstr ""
-#: lily-lexer.cc:303 lily-lexer.cc:316
+#: context.cc:207
#, c-format
-msgid "%s:EOF"
+msgid "cannot find or create `%s' called `%s'"
msgstr ""
-#: ligature-engraver.cc:104 ligature-bracket-engraver.cc:72
-msgid "cannot find start of ligature"
+#: context.cc:400
+#, c-format
+msgid "cannot find or create: `%s'"
msgstr ""
-#: ligature-engraver.cc:109
-msgid "no right bound"
+#: custos.cc:88
+#, c-format
+msgid "custos `%s' not found"
msgstr ""
-#: ligature-engraver.cc:131 ligature-bracket-engraver.cc:85
-msgid "already have a ligature"
+#: dispatcher.cc:83
+msgid "Event class should be a list"
msgstr ""
-#: ligature-engraver.cc:140
-msgid "no left bound"
+#: dispatcher.cc:166
+#, c-format
+msgid "Junking event: %s"
msgstr ""
-#: ligature-engraver.cc:184
-msgid "unterminated ligature"
+#: dispatcher.cc:262
+msgid "Attempting to remove nonexisting listener."
msgstr ""
-#: ligature-engraver.cc:211
-msgid "ignoring rest: ligature may not contain rest"
+#: dispatcher.cc:284
+msgid "Already listening to dispatcher, ignoring request"
msgstr ""
-#: ligature-engraver.cc:212
-msgid "ligature was started here"
+#: dots.cc:48
+#, c-format
+msgid "dot `%s' not found"
msgstr ""
#: dynamic-engraver.cc:193
msgid "unterminated (de)crescendo"
msgstr ""
-#. fixme: be more verbose.
-#: volta-engraver.cc:111
-msgid "cannot end volta spanner"
-msgstr ""
-
-#: volta-engraver.cc:121
-msgid "already have a volta spanner, ending that one prematurely"
+#: episema-engraver.cc:75
+msgid "already have an episema"
msgstr ""
-#: volta-engraver.cc:125
-msgid "also already have an ended spanner"
+#: episema-engraver.cc:88
+msgid "cannot find start of episema"
msgstr ""
-#: volta-engraver.cc:126
-msgid "giving up"
+#: episema-engraver.cc:137
+msgid "unterminated episema"
msgstr ""
-#: minimal-page-breaking.cc:44
-msgid "Calculating page breaks..."
+#: extender-engraver.cc:169 extender-engraver.cc:178
+msgid "unterminated extender"
msgstr ""
-#: accidental-engraver.cc:180
+#: flag.cc:113
#, c-format
-msgid "accidental typesetting list must begin with context-name: %s"
+msgid "flag `%s' not found"
msgstr ""
-#: accidental-engraver.cc:210
+#: flag.cc:133
#, c-format
-msgid "procedure or context-name expected for accidental rule, found %s"
+msgid "flag stroke `%s' not found"
msgstr ""
-#: ttf.cc:480 ttf.cc:528
+#: font-config-scheme.cc:151 font-config.cc:53
#, c-format
-msgid "font index %d too large for font `%s', using index 0"
+msgid "failed adding font directory: %s"
msgstr ""
-#: ttf.cc:512 ttf.cc:562
-msgid "font index must be non-negative, using index 0"
+#: font-config-scheme.cc:153 font-config.cc:55
+#, c-format
+msgid "Adding font directory: %s"
msgstr ""
-#: score.cc:172
-msgid "already have music in score"
+#: font-config-scheme.cc:167
+#, c-format
+msgid "failed adding font file: %s"
msgstr ""
-#: score.cc:173
-msgid "this is the previous music"
+#: font-config-scheme.cc:169
+#, c-format
+msgid "Adding font file: %s"
msgstr ""
-#: score.cc:178
-msgid "errors found, ignoring music expression"
+#: font-config.cc:38
+msgid "Initializing FontConfig..."
msgstr ""
-#: multi-measure-rest.cc:138
-msgid ""
-"usable-duration-logs must be a non-empty list. Falling back to whole rests."
+#: font-config.cc:58
+msgid "Building font database..."
msgstr ""
-#: multi-measure-rest.cc:328
-msgid "Using naive multi measure rest spacing."
+#: footnote-engraver.cc:110
+msgid "Must be footnote-event."
msgstr ""
-#: vaticana-ligature-engraver.cc:400
+#: general-scheme.cc:390
#, c-format
-msgid ""
-"ignored prefix(es) `%s' of this head according to restrictions of the "
-"selected ligature style"
+msgid "failed redirecting stderr to `%s'"
msgstr ""
-#: vaticana-ligature-engraver.cc:466
-msgid ""
-"Ambiguous use of dots in ligature: there are multiple dotted notes with the "
-"same pitch. The ligature should be split."
+#: general-scheme.cc:469 output-ps.scm:48
+msgid "Found infinity or nan in output. Substituting 0.0"
msgstr ""
-#: vaticana-ligature-engraver.cc:524
-msgid ""
-"This ligature has a dotted head followed by a non-dotted head. The ligature "
-"should be split after the last dotted head before this head."
+#: glissando-engraver.cc:158
+msgid "unterminated glissando"
msgstr ""
-#: vaticana-ligature-engraver.cc:736
-#, c-format
-msgid "Vaticana_ligature_engraver: setting `spacing-increment = %f': ptr =%ul"
+#: global-context-scheme.cc:96 global-context-scheme.cc:114
+msgid "no music found in score"
msgstr ""
-#: paper-book.cc:214
-#, c-format
-msgid "program option -dprint-pages not supported by backend `%s'"
+#: global-context-scheme.cc:104
+msgid "Interpreting music..."
msgstr ""
-#: paper-book.cc:233
+#: global-context-scheme.cc:126
#, c-format
-msgid "program option -dpreview not supported by backend `%s'"
-msgstr ""
-
-#: note-collision.cc:496
-msgid "ignoring too many clashing note columns"
+msgid "elapsed time: %.2f seconds"
msgstr ""
-#: system.cc:200
+#: gregorian-ligature-engraver.cc:70
#, c-format
-msgid "Element count %d"
+msgid "\\%s ignored"
msgstr ""
-#: system.cc:480
+#: gregorian-ligature-engraver.cc:75
#, c-format
-msgid "Grob count %d"
-msgstr ""
-
-#: paper-column-engraver.cc:261
-msgid ""
-"forced break was overridden by some other event, should you be using bar "
-"checks?"
+msgid "implied \\%s added"
msgstr ""
-#: score-engraver.cc:78
-#, c-format
-msgid "cannot find `%s'"
+#. ligature may not start with 2nd head of pes or flexa
+#: gregorian-ligature-engraver.cc:224
+msgid "cannot apply `\\~' on first head of ligature"
msgstr ""
-#: score-engraver.cc:80
-msgid "Music font has not been installed properly."
+#. (pitch == prev_pitch)
+#: gregorian-ligature-engraver.cc:236
+msgid "cannot apply `\\~' on heads with identical pitch"
msgstr ""
-#: score-engraver.cc:82
+#: grob-interface.cc:68
#, c-format
-msgid "Search path `%s'"
+msgid "Unknown interface `%s'"
msgstr ""
-#: score-engraver.cc:84
-msgid "Aborting"
+#: grob-interface.cc:79
+#, c-format
+msgid "Grob `%s' has no interface for property `%s'"
msgstr ""
-#: apply-context-iterator.cc:42
-msgid "\\applycontext argument is not a procedure"
+#: grob-property.cc:35
+#, c-format
+msgid "%d: %s"
msgstr ""
-#: includable-lexer.cc:71 lily-parser-scheme.cc:108 lily-guile.cc:91
-#, c-format
-msgid "cannot find file: `%s'"
+#: hairpin.cc:60
+msgid "Asking for broken bound padding at a non-broken bound."
msgstr ""
-#: includable-lexer.cc:73 lily-parser-scheme.cc:100
-#, c-format
-msgid "(search path: `%s')"
+#: hairpin.cc:254
+msgid "decrescendo too small"
msgstr ""
#: horizontal-bracket-engraver.cc:62
msgid "conflicting note group events"
msgstr ""
-#: note-heads-engraver.cc:76
-msgid "NoteEvent without pitch"
+#: hyphen-engraver.cc:104
+msgid "removing unterminated hyphen"
msgstr ""
-#: beam.cc:181
-msgid "removing beam with no stems"
+#: hyphen-engraver.cc:118
+msgid "unterminated hyphen; removing"
msgstr ""
-#: staff-performer.cc:257
-msgid "MIDI channel wrapped around"
+#: includable-lexer.cc:71 lily-guile.cc:91 lily-parser-scheme.cc:108
+#, c-format
+msgid "cannot find file: `%s'"
msgstr ""
-#: staff-performer.cc:258
-msgid "remapping modulo 16"
+#: includable-lexer.cc:73 lily-parser-scheme.cc:100
+#, c-format
+msgid "(search path: `%s')"
msgstr ""
-#: slur-engraver.cc:102 phrasing-slur-engraver.cc:101
-#, c-format
-msgid "direction of %s invalid: %d"
+#: input.cc:138 source-file.cc:178 source-file.cc:193
+msgid "position unknown"
msgstr ""
-#: slur-engraver.cc:176
-msgid "unterminated slur"
+#: key-engraver.cc:198
+msgid "Incomplete keyAlterationOrder for key signature"
msgstr ""
-#: slur-engraver.cc:211
-msgid "cannot end slur"
+#: key-signature-interface.cc:77
+#, c-format
+msgid "No glyph found for alteration: %s"
msgstr ""
-#. We already have an old slur, so give a warning
-#. and completely ignore the new slur.
-#: slur-engraver.cc:231
-msgid "already have slur"
+#: key-signature-interface.cc:87
+msgid "alteration not found"
msgstr ""
-#: dots.cc:48
-#, c-format
-msgid "dot `%s' not found"
+#: ligature-bracket-engraver.cc:72 ligature-engraver.cc:104
+msgid "cannot find start of ligature"
msgstr ""
-#. find out the ideal number of pages
-#: optimal-page-breaking.cc:62
-msgid "Finding the ideal number of pages..."
+#: ligature-bracket-engraver.cc:85 ligature-engraver.cc:131
+msgid "already have a ligature"
msgstr ""
-#: optimal-page-breaking.cc:85
-msgid ""
-"could not satisfy systems-per-page and page-count at the same time, ignoring "
-"systems-per-page"
+#: ligature-engraver.cc:109
+msgid "no right bound"
msgstr ""
-#: optimal-page-breaking.cc:105
-msgid "Fitting music on 1 page..."
+#: ligature-engraver.cc:140
+msgid "no left bound"
msgstr ""
-#: optimal-page-breaking.cc:107
-#, c-format
-msgid "Fitting music on %d pages..."
+#: ligature-engraver.cc:184
+msgid "unterminated ligature"
msgstr ""
-#: optimal-page-breaking.cc:109
-#, c-format
-msgid "Fitting music on %d or %d pages..."
+#: ligature-engraver.cc:211
+msgid "ignoring rest: ligature may not contain rest"
msgstr ""
-#: optimal-page-breaking.cc:119 optimal-page-breaking.cc:172
-#, c-format
-msgid "trying %d systems"
+#: ligature-engraver.cc:212
+msgid "ligature was started here"
msgstr ""
-#: optimal-page-breaking.cc:138 optimal-page-breaking.cc:200
+#: lily-guile.cc:93
#, c-format
-msgid "best score for this sys-count: %f"
+msgid "(load path: `%s')"
msgstr ""
-#: accidental.cc:200
+#: lily-guile.cc:416
#, c-format
-msgid "Could not find glyph-name for alteration %s"
+msgid "cannot find property type-check for `%s' (%s)."
msgstr ""
-#: accidental.cc:215
-msgid "natural alteration glyph not found"
+#: lily-guile.cc:419
+msgid "perhaps a typing error?"
msgstr ""
-#: context-property.cc:43
-msgid "need symbol arguments for \\override and \\revert"
+#: lily-guile.cc:426
+msgid "doing assignment anyway"
msgstr ""
-#: font-config-scheme.cc:151 font-config.cc:53
+#: lily-guile.cc:438
#, c-format
-msgid "failed adding font directory: %s"
+msgid "type check for `%s' failed; value `%s' must be of type `%s'"
msgstr ""
-#: font-config-scheme.cc:153 font-config.cc:55
-#, c-format
-msgid "Adding font directory: %s"
+#: lily-lexer.cc:255
+msgid "include files are not allowed in safe mode"
msgstr ""
-#: font-config-scheme.cc:167
+#: lily-lexer.cc:282
#, c-format
-msgid "failed adding font file: %s"
+msgid "identifier name is a keyword: `%s'"
msgstr ""
-#: font-config-scheme.cc:169
+#: lily-lexer.cc:303 lily-lexer.cc:316
#, c-format
-msgid "Adding font file: %s"
+msgid "%s:EOF"
msgstr ""
-#: hairpin.cc:61
-msgid "Asking for broken bound padding at a non-broken bound."
+#: lily-parser-scheme.cc:80
+#, c-format
+msgid "Changing working directory to: `%s'"
msgstr ""
-#: hairpin.cc:254
-msgid "decrescendo too small"
+#: lily-parser-scheme.cc:84
+#, c-format
+msgid "unable to change directory to: `%s'"
msgstr ""
-#: open-type-font.cc:44
+#: lily-parser-scheme.cc:99
#, c-format
-msgid "cannot allocate %lu bytes"
+msgid "cannot find init file: `%s'"
msgstr ""
-#: open-type-font.cc:48
+#: lily-parser-scheme.cc:117
#, c-format
-msgid "cannot load font table: %s"
+msgid "Processing `%s'"
msgstr ""
-#: open-type-font.cc:53
-#, c-format
-msgid "FreeType error: %s"
+#: lily-parser-scheme.cc:208
+msgid ""
+"ly:parser-parse-string is only valid with a new parser. Use ly:parser-"
+"include-string instead."
msgstr ""
-#: open-type-font.cc:110
-#, c-format
-msgid "unsupported font format: %s"
+#: lily-parser-scheme.cc:239
+msgid ""
+"ly:parse-string-expression is only valid with a new parser. Use ly:parser-"
+"include-string instead."
msgstr ""
-#: open-type-font.cc:112
-#, c-format
-msgid "error reading font file %s: %s"
+#: lily-parser.cc:109
+msgid "Parsing..."
msgstr ""
-#: open-type-font.cc:187
-#, c-format
-msgid "FT_Get_Glyph_Name () Freetype error: %s"
+#: line-spanner.cc:373
+msgid "Line spanner's left point is to the right of its right point."
msgstr ""
-#: open-type-font.cc:318 pango-font.cc:189
+#: lyric-combine-music-iterator.cc:199
+msgid "argument of \\lyricsto should contain Lyrics context"
+msgstr ""
+
+#: lyric-combine-music-iterator.cc:337
#, c-format
-msgid "FT_Get_Glyph_Name () error: %s"
+msgid "cannot find Voice `%s'"
+msgstr ""
+
+#: lyric-engraver.cc:186
+msgid "Lyric syllable does not have note. Use \\lyricsto or associatedVoice."
msgstr ""
#: main.cc:101
msgid "write output to FILE (suffix will be added)"
msgstr ""
-#: main.cc:172
-msgid "relocate using directory of lilypond program"
+#: main.cc:172
+msgid "relocate using directory of lilypond program"
+msgstr ""
+
+#: main.cc:173
+msgid "no progress, only error messages (equivalent to loglevel=ERROR)"
+msgstr ""
+
+#: main.cc:175
+msgid "be verbose (equivalent to loglevel=DEBUG)"
+msgstr ""
+
+#. Do not update the copyright years here, run `make grand-replace'
+#: main.cc:242
+#, c-format
+msgid ""
+"Copyright (c) %s by\n"
+"%s and others."
+msgstr ""
+
+#. No version number or newline here. It confuses help2man.
+#: main.cc:269
+#, c-format
+msgid "Usage: %s [OPTION]... FILE..."
+msgstr ""
+
+#: main.cc:271
+msgid "Typeset music and/or produce MIDI from FILE."
+msgstr ""
+
+#: main.cc:273
+msgid "LilyPond produces beautiful music notation."
+msgstr ""
+
+#: main.cc:275
+#, c-format
+msgid "For more information, see %s"
+msgstr ""
+
+#: main.cc:277
+msgid "Options:"
+msgstr ""
+
+#: main.cc:331
+#, c-format
+msgid "expected %d arguments with jail, found: %u"
+msgstr ""
+
+#: main.cc:345
+#, c-format
+msgid "no such user: %s"
+msgstr ""
+
+#: main.cc:347
+#, c-format
+msgid "cannot get user id from user name: %s: %s"
+msgstr ""
+
+#: main.cc:362
+#, c-format
+msgid "no such group: %s"
+msgstr ""
+
+#: main.cc:364
+#, c-format
+msgid "cannot get group id from group name: %s: %s"
+msgstr ""
+
+#: main.cc:372
+#, c-format
+msgid "cannot chroot to: %s: %s"
+msgstr ""
+
+#: main.cc:379
+#, c-format
+msgid "cannot change group id to: %d: %s"
+msgstr ""
+
+#: main.cc:385
+#, c-format
+msgid "cannot change user id to: %d: %s"
+msgstr ""
+
+#: main.cc:391
+#, c-format
+msgid "cannot change working directory to: %s: %s"
+msgstr ""
+
+#: main.cc:639
+#, c-format
+msgid "exception caught: %s"
+msgstr ""
+
+#. FIXME: constant error message.
+#: mark-engraver.cc:156
+msgid "rehearsalMark must have integer value"
+msgstr ""
+
+#: mark-engraver.cc:162
+msgid "mark label must be a markup object"
+msgstr ""
+
+#: mensural-ligature-engraver.cc:96
+msgid "ligature with less than 2 heads -> skipping"
+msgstr ""
+
+#: mensural-ligature-engraver.cc:123
+msgid "cannot determine pitch of ligature primitive -> skipping"
+msgstr ""
+
+#: mensural-ligature-engraver.cc:137
+msgid "single note ligature - skipping"
+msgstr ""
+
+#: mensural-ligature-engraver.cc:148
+msgid "prime interval within ligature -> skipping"
+msgstr ""
+
+#: mensural-ligature-engraver.cc:159
+msgid "mensural ligature: duration none of Mx, L, B, S -> skipping"
+msgstr ""
+
+#: mensural-ligature-engraver.cc:202
+msgid "semibrevis must be followed by another one -> skipping"
+msgstr ""
+
+#: mensural-ligature-engraver.cc:212
+msgid ""
+"semibreves can only appear at the beginning of a ligature,\n"
+"and there may be only zero or two of them"
+msgstr ""
+
+#: mensural-ligature-engraver.cc:232
+msgid ""
+"invalid ligatura ending:\n"
+"when the last note is a descending brevis,\n"
+"the penultimate note must be another one,\n"
+"or the ligatura must be LB or SSB"
+msgstr ""
+
+#: mensural-ligature-engraver.cc:387
+msgid "unexpected case fall-through"
+msgstr ""
+
+#: midi-item.cc:89
+#, c-format
+msgid "no such MIDI instrument: `%s'"
+msgstr ""
+
+#: midi-item.cc:161
+msgid "Time signature with more than 255 beats. Truncating"
+msgstr ""
+
+#: midi-stream.cc:39
+#, c-format
+msgid "cannot open for write: %s: %s"
+msgstr ""
+
+#: midi-stream.cc:55
+#, c-format
+msgid "cannot write to file: `%s'"
+msgstr ""
+
+#: minimal-page-breaking.cc:40 paper-score.cc:122
+msgid "Calculating line breaks..."
+msgstr ""
+
+#: minimal-page-breaking.cc:44
+msgid "Calculating page breaks..."
+msgstr ""
+
+#: multi-measure-rest.cc:138
+msgid ""
+"usable-duration-logs must be a non-empty list. Falling back to whole rests."
+msgstr ""
+
+#: multi-measure-rest.cc:328
+msgid "Using naive multi measure rest spacing."
+msgstr ""
+
+#: music.cc:150
+#, c-format
+msgid "octave check failed; expected \"%s\", found: \"%s\""
msgstr ""
-#: main.cc:173
-msgid "no progress, only error messages (equivalent to loglevel=ERROR)"
+#: music.cc:219
+msgid "(normalized pitch)"
msgstr ""
-#: main.cc:175
-msgid "be verbose (equivalent to loglevel=DEBUG)"
+#: music.cc:223
+#, c-format
+msgid "Transposing %s by %s makes alteration larger than double"
msgstr ""
-#. Do not update the copyright years here, run `make grand-replace'
-#: main.cc:242
+#: new-dynamic-engraver.cc:168
#, c-format
msgid ""
-"Copyright (c) %s by\n"
-"%s and others."
+"unknown crescendo style: %s\n"
+"defaulting to hairpin."
msgstr ""
-#. No version number or newline here. It confuses help2man.
-#: main.cc:269
+#: new-dynamic-engraver.cc:233
#, c-format
-msgid "Usage: %s [OPTION]... FILE..."
+msgid "unterminated %s"
msgstr ""
-#: main.cc:271
-msgid "Typeset music and/or produce MIDI from FILE."
+#: new-fingering-engraver.cc:113
+msgid "cannot add text scripts to individual note heads"
msgstr ""
-#: main.cc:273
-msgid "LilyPond produces beautiful music notation."
+#: new-fingering-engraver.cc:269
+msgid "no placement found for fingerings"
msgstr ""
-#: main.cc:275
-#, c-format
-msgid "For more information, see %s"
+#: new-fingering-engraver.cc:270
+msgid "placing below"
msgstr ""
-#: main.cc:277
-msgid "Options:"
+#: note-collision.cc:496
+msgid "ignoring too many clashing note columns"
msgstr ""
-#: main.cc:331
-#, c-format
-msgid "expected %d arguments with jail, found: %u"
+#: note-column.cc:147
+msgid "cannot have note heads and rests together on a stem"
msgstr ""
-#: main.cc:345
+#: note-head.cc:95
#, c-format
-msgid "no such user: %s"
+msgid "none of note heads `%s' or `%s' found"
msgstr ""
-#: main.cc:347
-#, c-format
-msgid "cannot get user id from user name: %s: %s"
+#: note-heads-engraver.cc:76
+msgid "NoteEvent without pitch"
msgstr ""
-#: main.cc:362
+#: open-type-font.cc:44
#, c-format
-msgid "no such group: %s"
+msgid "cannot allocate %lu bytes"
msgstr ""
-#: main.cc:364
+#: open-type-font.cc:48
#, c-format
-msgid "cannot get group id from group name: %s: %s"
+msgid "cannot load font table: %s"
msgstr ""
-#: main.cc:372
+#: open-type-font.cc:53
#, c-format
-msgid "cannot chroot to: %s: %s"
+msgid "FreeType error: %s"
msgstr ""
-#: main.cc:379
+#: open-type-font.cc:110
#, c-format
-msgid "cannot change group id to: %d: %s"
+msgid "unsupported font format: %s"
msgstr ""
-#: main.cc:385
+#: open-type-font.cc:112
#, c-format
-msgid "cannot change user id to: %d: %s"
+msgid "error reading font file %s: %s"
msgstr ""
-#: main.cc:391
+#: open-type-font.cc:187
#, c-format
-msgid "cannot change working directory to: %s: %s"
+msgid "FT_Get_Glyph_Name () Freetype error: %s"
msgstr ""
-#: main.cc:639
+#: open-type-font.cc:318 pango-font.cc:189
#, c-format
-msgid "exception caught: %s"
+msgid "FT_Get_Glyph_Name () error: %s"
msgstr ""
-#: page-turn-page-breaking.cc:168
-#, c-format
-msgid "page-turn-page-breaking: breaking from %d to %d"
+#. find out the ideal number of pages
+#: optimal-page-breaking.cc:62
+msgid "Finding the ideal number of pages..."
msgstr ""
-#: page-turn-page-breaking.cc:217
+#: optimal-page-breaking.cc:85
msgid ""
-"cannot fit the first page turn onto a single page. Consider setting first-"
-"page-number to an even number."
+"could not satisfy systems-per-page and page-count at the same time, ignoring "
+"systems-per-page"
msgstr ""
-#: page-turn-page-breaking.cc:230
-#, c-format
-msgid "Calculating page and line breaks (%d possible page breaks)..."
+#: optimal-page-breaking.cc:105
+msgid "Fitting music on 1 page..."
msgstr ""
-#: page-turn-page-breaking.cc:300
+#: optimal-page-breaking.cc:107
#, c-format
-msgid "break starting at page %d"
+msgid "Fitting music on %d pages..."
msgstr ""
-#: page-turn-page-breaking.cc:301
+#: optimal-page-breaking.cc:109
#, c-format
-msgid "\tdemerits: %f"
+msgid "Fitting music on %d or %d pages..."
msgstr ""
-#: page-turn-page-breaking.cc:302
+#: optimal-page-breaking.cc:119 optimal-page-breaking.cc:172
#, c-format
-msgid "\tsystem count: %d"
+msgid "trying %d systems"
msgstr ""
-#: page-turn-page-breaking.cc:303
+#: optimal-page-breaking.cc:138 optimal-page-breaking.cc:200
#, c-format
-msgid "\tpage count: %d"
+msgid "best score for this sys-count: %f"
msgstr ""
-#: page-turn-page-breaking.cc:304
-#, c-format
-msgid "\tprevious break: %d"
+#: optimal-page-breaking.cc:207 page-turn-page-breaking.cc:248
+#: paper-score.cc:162
+msgid "Drawing systems..."
msgstr ""
-#: midi-item.cc:89
-#, c-format
-msgid "no such MIDI instrument: `%s'"
+#: output-def.cc:235
+msgid "margins do not fit with line-width, setting default values"
msgstr ""
-#: midi-item.cc:161
-msgid "Time signature with more than 255 beats. Truncating"
+#: output-def.cc:242
+msgid ""
+"systems run off the page due to improper paper settings, setting default "
+"values"
msgstr ""
-#: stem-engraver.cc:110
-msgid "tremolo duration is too long"
+#: page-breaking.cc:277
+msgid ""
+"ignoring min-systems-per-page and max-systems-per-page because systems-per-"
+"page was set"
msgstr ""
-#: stem-engraver.cc:162
-#, c-format
-msgid "adding note head to incompatible stem (type = %d/%d)"
+#: page-breaking.cc:282
+msgid ""
+"min-systems-per-page is larger than max-systems-per-page, ignoring both "
+"values"
msgstr ""
-#: stem-engraver.cc:165
-msgid "maybe input should specify polyphonic voices"
+#: page-layout-problem.cc:403
+msgid ""
+"A page layout problem has been initiated that cannot accommodate footnotes."
msgstr ""
-#: translator.cc:326
-#, c-format
-msgid "Two simultaneous %s events, junking this one"
+#: page-layout-problem.cc:732
+msgid ""
+"cannot fit music on page: ragged-spacing was requested, but page was "
+"compressed"
msgstr ""
-#: translator.cc:327
+#: page-layout-problem.cc:735
#, c-format
-msgid "Previous %s event here"
-msgstr ""
-
-#: glissando-engraver.cc:158
-msgid "unterminated glissando"
-msgstr ""
-
-#: skyline-pair.cc:131
-msgid "direction must not be CENTER in ly:skyline-pair::skyline"
+msgid "cannot fit music on page: overflow is %f"
msgstr ""
-#: beam-engraver.cc:147
-msgid "already have a beam"
+#: page-layout-problem.cc:737
+msgid "compressing music to fit"
msgstr ""
-#: beam-engraver.cc:230
-msgid "unterminated beam"
+#: page-layout-problem.cc:1197
+msgid "staff-affinities should only decrease"
msgstr ""
-#: beam-engraver.cc:277
-msgid "stem does not fit in beam"
+#: page-turn-page-breaking.cc:168
+#, c-format
+msgid "page-turn-page-breaking: breaking from %d to %d"
msgstr ""
-#: beam-engraver.cc:278
-msgid "beam was started here"
+#: page-turn-page-breaking.cc:217
+msgid ""
+"cannot fit the first page turn onto a single page. Consider setting first-"
+"page-number to an even number."
msgstr ""
-#: key-engraver.cc:199
-msgid "Incomplete keyAlterationOrder for key signature"
+#: page-turn-page-breaking.cc:230
+#, c-format
+msgid "Calculating page and line breaks (%d possible page breaks)..."
msgstr ""
-#.
-#. Todo: should make typecheck?
-#.
-#. OTOH, Tristan Keuris writes 8/20 in his Intermezzi.
-#.
-#: time-signature-engraver.cc:75
+#: page-turn-page-breaking.cc:300
#, c-format
-msgid "strange time signature found: %d/%d"
+msgid "break starting at page %d"
msgstr ""
-#: lily-parser-scheme.cc:80
+#: page-turn-page-breaking.cc:301
#, c-format
-msgid "Changing working directory to: `%s'"
+msgid "\tdemerits: %f"
msgstr ""
-#: lily-parser-scheme.cc:84
+#: page-turn-page-breaking.cc:302
#, c-format
-msgid "unable to change directory to: `%s'"
+msgid "\tsystem count: %d"
msgstr ""
-#: lily-parser-scheme.cc:99
+#: page-turn-page-breaking.cc:303
#, c-format
-msgid "cannot find init file: `%s'"
+msgid "\tpage count: %d"
msgstr ""
-#: lily-parser-scheme.cc:117
+#: page-turn-page-breaking.cc:304
#, c-format
-msgid "Processing `%s'"
+msgid "\tprevious break: %d"
msgstr ""
-#: lily-parser-scheme.cc:208
+#: pango-font.cc:205
+#, c-format
msgid ""
-"ly:parser-parse-string is only valid with a new parser. Use ly:parser-"
-"include-string instead."
+"Glyph has no name, but font supports glyph naming.\n"
+"Skipping glyph U+%0X, file %s"
msgstr ""
-#: lily-parser-scheme.cc:239
-msgid ""
-"ly:parse-string-expression is only valid with a new parser. Use ly:parser-"
-"include-string instead."
+#: pango-font.cc:242
+#, c-format
+msgid "no PostScript font name for font `%s'"
msgstr ""
-#. We are completely screwed.
-#: beam-quanting.cc:839
-msgid "no viable initial configuration found: may not find good beam slope"
+#: pango-font.cc:291
+msgid "FreeType face has no PostScript font name"
msgstr ""
-#: lily-guile.cc:93
+#: paper-book.cc:214
#, c-format
-msgid "(load path: `%s')"
+msgid "program option -dprint-pages not supported by backend `%s'"
msgstr ""
-#: lily-guile.cc:416
+#: paper-book.cc:233
#, c-format
-msgid "cannot find property type-check for `%s' (%s)."
+msgid "program option -dpreview not supported by backend `%s'"
msgstr ""
-#: lily-guile.cc:419
-msgid "perhaps a typing error?"
+#: paper-column-engraver.cc:261
+msgid ""
+"forced break was overridden by some other event, should you be using bar "
+"checks?"
msgstr ""
-#: lily-guile.cc:426
-msgid "doing assignment anyway"
+#: paper-outputter-scheme.cc:41
+#, c-format
+msgid "Layout output to `%s'..."
msgstr ""
-#: lily-guile.cc:438
+#: paper-score.cc:134
#, c-format
-msgid "type check for `%s' failed; value `%s' must be of type `%s'"
+msgid "Element count %d (spanners %d) "
msgstr ""
-#: rest-collision.cc:146
-msgid "cannot resolve rest collision: rest direction not set"
+#: paper-score.cc:138
+msgid "Preprocessing graphical objects..."
msgstr ""
-#: rest-collision.cc:158 rest-collision.cc:267
-msgid "too many colliding rests"
+#: parse-scm.cc:121
+msgid "GUILE signaled an error for the expression beginning here"
msgstr ""
-#: episema-engraver.cc:75
-msgid "already have an episema"
+#: partial-iterator.cc:45
+msgid "trying to use \\partial after the start of a piece"
msgstr ""
-#: episema-engraver.cc:88
-msgid "cannot find start of episema"
+#: pdf-scheme.cc:50
+#, c-format
+msgid "Conversion of string `%s' to UTF-16be failed: %s"
msgstr ""
-#: episema-engraver.cc:137
-msgid "unterminated episema"
+#: percent-repeat-engraver.cc:147
+msgid "unterminated percent repeat"
msgstr ""
-#: rest.cc:192
-#, c-format
-msgid "rest `%s' not found"
+#: performance.cc:54
+msgid "Track..."
msgstr ""
-#: pango-font.cc:205
+#: performance.cc:82
#, c-format
-msgid ""
-"Glyph has no name, but font supports glyph naming.\n"
-"Skipping glyph U+%0X, file %s"
+msgid "MIDI output to `%s'..."
msgstr ""
-#: pango-font.cc:242
+#: phrasing-slur-engraver.cc:101 slur-engraver.cc:102
#, c-format
-msgid "no PostScript font name for font `%s'"
-msgstr ""
-
-#: pango-font.cc:291
-msgid "FreeType face has no PostScript font name"
+msgid "direction of %s invalid: %d"
msgstr ""
#: phrasing-slur-engraver.cc:175
msgid "already have phrasing slur"
msgstr ""
-#: lyric-engraver.cc:186
-msgid "Lyric syllable does not have note. Use \\lyricsto or associatedVoice."
+#: piano-pedal-engraver.cc:279
+#, c-format
+msgid "expect 3 strings for piano pedals, found: %ld"
msgstr ""
-#: page-breaking.cc:277
-msgid ""
-"ignoring min-systems-per-page and max-systems-per-page because systems-per-"
-"page was set"
+#: piano-pedal-engraver.cc:294 piano-pedal-engraver.cc:305
+#: piano-pedal-performer.cc:104
+#, c-format
+msgid "cannot find start of piano pedal: `%s'"
msgstr ""
-#: page-breaking.cc:282
-msgid ""
-"min-systems-per-page is larger than max-systems-per-page, ignoring both "
-"values"
+#: piano-pedal-engraver.cc:340
+#, c-format
+msgid "cannot find start of piano pedal bracket: `%s'"
msgstr ""
-#: paper-outputter-scheme.cc:41
+#: program-option-scheme.cc:235
#, c-format
-msgid "Layout output to `%s'..."
+msgid "no such internal option: %s"
msgstr ""
-#: performance.cc:54
-msgid "Track..."
+#: property-iterator.cc:93
+#, c-format
+msgid "not a grob name, `%s'"
msgstr ""
-#: performance.cc:82
+#: relative-octave-check.cc:49
+msgid "Failed octave check, got: "
+msgstr ""
+
+#: relocate.cc:52
#, c-format
-msgid "MIDI output to `%s'..."
+msgid "Setting %s to %s"
msgstr ""
-#: tuplet-engraver.cc:110
-msgid "No tuplet to end"
+#. this warning should only be printed in debug mode!
+#: relocate.cc:73
+#, c-format
+msgid "no such file: %s for %s"
msgstr ""
-#: gregorian-ligature-engraver.cc:70
+#. this warning should only be printed in debug mode!
+#. this warning should only be printed in debug mode
+#: relocate.cc:84 relocate.cc:102
#, c-format
-msgid "\\%s ignored"
+msgid "no such directory: %s for %s"
msgstr ""
-#: gregorian-ligature-engraver.cc:75
+#: relocate.cc:93
#, c-format
-msgid "implied \\%s added"
+msgid "%s=%s (prepend)\n"
msgstr ""
-#. ligature may not start with 2nd head of pes or flexa
-#: gregorian-ligature-engraver.cc:224
-msgid "cannot apply `\\~' on first head of ligature"
+#: relocate.cc:124
+#, c-format
+msgid "not relocating, no %s/ or current/ found under %s"
msgstr ""
-#. (pitch == prev_pitch)
-#: gregorian-ligature-engraver.cc:236
-msgid "cannot apply `\\~' on heads with identical pitch"
+#: relocate.cc:134
+#, c-format
+msgid "Relocation: compile datadir=%s, new datadir=%s"
msgstr ""
-#: key-signature-interface.cc:77
+#: relocate.cc:146
#, c-format
-msgid "No glyph found for alteration: %s"
+msgid "Relocation: framework_prefix=%s"
msgstr ""
-#: key-signature-interface.cc:87
-msgid "alteration not found"
+#: relocate.cc:186
+#, c-format
+msgid "Relocation: is absolute: argv0=%s\n"
msgstr ""
-#: source-file.cc:85
+#: relocate.cc:192
#, c-format
-msgid "expected to read %d characters, got %d"
+msgid "Relocation: from cwd: argv0=%s\n"
msgstr ""
-#: axis-group-engraver.cc:94
-msgid "Axis_group_engraver: vertical group already has a parent"
+#: relocate.cc:208
+#, c-format
+msgid ""
+"Relocation: from PATH=%s\n"
+"argv0=%s"
msgstr ""
-#: axis-group-engraver.cc:95
-msgid "are there two Axis_group_engravers?"
+#: relocate.cc:235
+msgid "LILYPONDPREFIX is obsolete, use LILYPOND_DATADIR"
msgstr ""
-#: axis-group-engraver.cc:96
-msgid "removing this vertical group"
+#: relocate.cc:360
+#, c-format
+msgid "Relocation file: %s"
msgstr ""
-#: cluster.cc:120
+#: relocate.cc:364 source-file.cc:65
#, c-format
-msgid "unknown cluster style `%s'"
+msgid "cannot open file: `%s'"
msgstr ""
-#: cluster.cc:157
-msgid "junking empty cluster"
+#: relocate.cc:394
+#, c-format
+msgid "Unknown relocation command %s"
msgstr ""
-#: global-context-scheme.cc:96 global-context-scheme.cc:114
-msgid "no music found in score"
+#: rest-collision-engraver.cc:70
+msgid "rhythmic head is not part of a rhythmic column"
msgstr ""
-#: global-context-scheme.cc:104
-msgid "Interpreting music..."
+#: rest-collision.cc:146
+msgid "cannot resolve rest collision: rest direction not set"
msgstr ""
-#: global-context-scheme.cc:126
-#, c-format
-msgid "elapsed time: %.2f seconds"
+#: rest-collision.cc:158 rest-collision.cc:272
+msgid "too many colliding rests"
msgstr ""
-#: output-def.cc:235
-msgid "margins do not fit with line-width, setting default values"
+#: rest.cc:193
+#, c-format
+msgid "rest `%s' not found"
msgstr ""
-#: output-def.cc:242
-msgid ""
-"systems run off the page due to improper paper settings, setting default "
-"values"
+#: score-engraver.cc:78
+#, c-format
+msgid "cannot find `%s'"
msgstr ""
-#: axis-group-interface.cc:668
-msgid "an outside-staff object should have a direction, defaulting to up"
+#: score-engraver.cc:80
+msgid "Music font has not been installed properly."
msgstr ""
-#: coherent-ligature-engraver.cc:110
+#: score-engraver.cc:82
#, c-format
-msgid "Coherent_ligature_engraver: setting `spacing-increment=0.01': ptr=%ul"
+msgid "Search path `%s'"
msgstr ""
-#: percent-repeat-engraver.cc:147
-msgid "unterminated percent repeat"
+#: score-engraver.cc:84
+msgid "Aborting"
msgstr ""
-#: note-head.cc:95
-#, c-format
-msgid "none of note heads `%s' or `%s' found"
+#: score.cc:172
+msgid "already have music in score"
msgstr ""
-#: font-config.cc:38
-msgid "Initializing FontConfig..."
+#: score.cc:173
+msgid "this is the previous music"
msgstr ""
-#: font-config.cc:58
-msgid "Building font database..."
+#: score.cc:178
+msgid "errors found, ignoring music expression"
msgstr ""
#. FIXME:
msgid " scheme encoding: "
msgstr ""
-#: all-font-metrics.cc:149
-#, c-format
-msgid "cannot find font: `%s'"
+#: skyline-pair.cc:131
+msgid "direction must not be CENTER in ly:skyline-pair::skyline"
msgstr ""
-#: clef.cc:65
-#, c-format
-msgid "clef `%s' not found"
+#: slur-engraver.cc:176
+msgid "unterminated slur"
msgstr ""
-#: property-iterator.cc:93
+#: slur-engraver.cc:211
+msgid "cannot end slur"
+msgstr ""
+
+#. We already have an old slur, so give a warning
+#. and completely ignore the new slur.
+#: slur-engraver.cc:231
+msgid "already have slur"
+msgstr ""
+
+#: slur.cc:430
#, c-format
-msgid "not a grob name, `%s'"
+msgid "Ignoring grob for slur: %s. avoid-slur not set?"
msgstr ""
-#: pdf-scheme.cc:50
+#: source-file.cc:85
#, c-format
-msgid "Conversion of string `%s' to UTF-16be failed: %s"
+msgid "expected to read %d characters, got %d"
msgstr ""
-#: new-fingering-engraver.cc:113
-msgid "cannot add text scripts to individual note heads"
+#: staff-performer.cc:275
+msgid "MIDI channel wrapped around"
msgstr ""
-#: new-fingering-engraver.cc:269
-msgid "no placement found for fingerings"
+#: staff-performer.cc:276
+msgid "remapping modulo 16"
msgstr ""
-#: new-fingering-engraver.cc:270
-msgid "placing below"
+#: stem-engraver.cc:110
+msgid "tremolo duration is too long"
msgstr ""
-#: bar-check-iterator.cc:84
+#: stem-engraver.cc:162
#, c-format
-msgid "barcheck failed at: %s"
+msgid "adding note head to incompatible stem (type = %d/%d)"
msgstr ""
-#: change-iterator.cc:34
-#, c-format
-msgid "cannot change `%s' to `%s'"
+#: stem-engraver.cc:165
+msgid "maybe input should specify polyphonic voices"
msgstr ""
-#. FIXME: constant error message.
-#: change-iterator.cc:93
-msgid "cannot find context to switch to"
+#: stem.cc:128
+msgid "weird stem size, check for narrow beams"
msgstr ""
-#. 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
+#: system.cc:200
#, c-format
-msgid "not changing to same context type: %s"
+msgid "Element count %d"
+msgstr ""
+
+#: system.cc:480
+#, c-format
+msgid "Grob count %d"
msgstr ""
-#. FIXME: uncomprehensable message
-#: change-iterator.cc:106
-msgid "none of these in my family"
+#. TODO: Also print the arguments of the markup!
+#: text-interface.cc:129
+#, c-format
+msgid "Cyclic markup detected: %s"
msgstr ""
-#: translator-group-ctors.cc:40
+#. TODO: Also print the arguments of the markup!
+#: text-interface.cc:142
#, c-format
-msgid "fatal error. Couldn't find type: %s"
+msgid "Markup depth exceeds maximal value of %d; Markup: %s"
msgstr ""
#: text-spanner-engraver.cc:72
msgid "unterminated text spanner"
msgstr ""
-#: lily-parser.cc:109
-msgid "Parsing..."
+#: tie-engraver.cc:117
+msgid "unterminated tie"
msgstr ""
-#. if we get to here, just put everything on one line
-#: constrained-breaking.cc:187 constrained-breaking.cc:205
-msgid "cannot find line breaking that satisfies constraints"
+#: tie-engraver.cc:348
+msgid "lonely tie"
msgstr ""
-#. FIXME: constant error message.
-#: mark-engraver.cc:157
-msgid "rehearsalMark must have integer value"
+#.
+#. Todo: should make typecheck?
+#.
+#. OTOH, Tristan Keuris writes 8/20 in his Intermezzi.
+#.
+#: time-signature-engraver.cc:75
+#, c-format
+msgid "strange time signature found: %d/%d"
msgstr ""
-#: mark-engraver.cc:163
-msgid "mark label must be a markup object"
+#. If there is no such symbol, we default to the numbered style.
+#. (Here really with a warning!)
+#: time-signature.cc:94
+#, c-format
+msgid "time signature symbol `%s' not found; reverting to numbered style"
msgstr ""
-#: rest-collision-engraver.cc:70
-msgid "rhythmic head is not part of a rhythmic column"
+#: translator-ctors.cc:65
+#, c-format
+msgid "unknown translator: `%s'"
msgstr ""
-#. If there is no such symbol, we default to the numbered style.
-#. (Here really with a warning!)
-#: time-signature.cc:122
+#: translator-group-ctors.cc:40
#, c-format
-msgid "time signature symbol `%s' not found; reverting to numbered style"
+msgid "fatal error. Couldn't find type: %s"
msgstr ""
-#: grob-interface.cc:68
+#: translator-group.cc:188
#, c-format
-msgid "Unknown interface `%s'"
+msgid "cannot find: `%s'"
msgstr ""
-#: grob-interface.cc:79
+#: translator.cc:326
#, c-format
-msgid "Grob `%s' has no interface for property `%s'"
+msgid "Two simultaneous %s events, junking this one"
msgstr ""
-#: midi-stream.cc:39
+#: translator.cc:327
#, c-format
-msgid "cannot open for write: %s: %s"
+msgid "Previous %s event here"
msgstr ""
-#: midi-stream.cc:55
+#: ttf.cc:480 ttf.cc:528
#, c-format
-msgid "cannot write to file: `%s'"
+msgid "font index %d too large for font `%s', using index 0"
msgstr ""
-#. TODO: Also print the arguments of the markup!
-#: text-interface.cc:129
+#: ttf.cc:512 ttf.cc:562
+msgid "font index must be non-negative, using index 0"
+msgstr ""
+
+#: tuplet-engraver.cc:110
+msgid "No tuplet to end"
+msgstr ""
+
+#: vaticana-ligature-engraver.cc:400
#, c-format
-msgid "Cyclic markup detected: %s"
+msgid ""
+"ignored prefix(es) `%s' of this head according to restrictions of the "
+"selected ligature style"
msgstr ""
-#. TODO: Also print the arguments of the markup!
-#: text-interface.cc:142
+#: vaticana-ligature-engraver.cc:466
+msgid ""
+"Ambiguous use of dots in ligature: there are multiple dotted notes with the "
+"same pitch. The ligature should be split."
+msgstr ""
+
+#: vaticana-ligature-engraver.cc:524
+msgid ""
+"This ligature has a dotted head followed by a non-dotted head. The ligature "
+"should be split after the last dotted head before this head."
+msgstr ""
+
+#: vaticana-ligature-engraver.cc:736
#, c-format
-msgid "Markup depth exceeds maximal value of %d; Markup: %s"
+msgid "Vaticana_ligature_engraver: setting `spacing-increment = %f': ptr =%ul"
+msgstr ""
+
+#: vaticana-ligature.cc:95
+msgid "flexa-height undefined; assuming 0"
+msgstr ""
+
+#: vaticana-ligature.cc:100
+msgid "ascending vaticana style flexa"
+msgstr ""
+
+#. fixme: be more verbose.
+#: volta-engraver.cc:110
+msgid "cannot end volta spanner"
+msgstr ""
+
+#: volta-engraver.cc:120
+msgid "already have a volta spanner, ending that one prematurely"
+msgstr ""
+
+#: volta-engraver.cc:124
+msgid "also already have an ended spanner"
+msgstr ""
+
+#: volta-engraver.cc:125
+msgid "giving up"
msgstr ""
-#: parser.yy:162 parser.yy:176
+#: parser.yy:162 parser.yy:176 /home/gperciva/src/lilypond/lily/parser.yy:162
+#: /home/gperciva/src/lilypond/lily/parser.yy:176
msgid "Too much lookahead"
msgstr ""
-#: parser.yy:833 parser.yy:1234
+#: parser.yy:835 parser.yy:1256 /home/gperciva/src/lilypond/lily/parser.yy:835
+#: /home/gperciva/src/lilypond/lily/parser.yy:1256
msgid "not a context mod"
msgstr ""
-#: parser.yy:1018
+#: parser.yy:1027 /home/gperciva/src/lilypond/lily/parser.yy:1027
msgid "\\paper cannot be used in \\score, use \\layout instead"
msgstr ""
-#: parser.yy:1042
+#: parser.yy:1051 /home/gperciva/src/lilypond/lily/parser.yy:1051
msgid "need \\paper for paper block"
msgstr ""
-#: parser.yy:1999
+#: parser.yy:1176 /home/gperciva/src/lilypond/lily/parser.yy:1176
+msgid "Ignoring non-music expression"
+msgstr ""
+
+#: parser.yy:2016 /home/gperciva/src/lilypond/lily/parser.yy:2016
msgid "only \\consists and \\remove take non-string argument."
msgstr ""
-#: parser.yy:2012
+#: parser.yy:2029 /home/gperciva/src/lilypond/lily/parser.yy:2029
msgid "Grob name should be alphanumeric"
msgstr ""
-#: parser.yy:2216
+#: parser.yy:2233 /home/gperciva/src/lilypond/lily/parser.yy:2233
msgid "not a rhythmic event"
msgstr ""
-#: parser.yy:2312 parser.yy:2317
+#: parser.yy:2329 parser.yy:2334
+#: /home/gperciva/src/lilypond/lily/parser.yy:2329
+#: /home/gperciva/src/lilypond/lily/parser.yy:2334
msgid "have to be in Lyric mode for lyrics"
msgstr ""
-#: parser.yy:2432
+#: parser.yy:2449 /home/gperciva/src/lilypond/lily/parser.yy:2449
msgid "expecting string as script definition"
msgstr ""
-#: parser.yy:2592 parser.yy:2643
+#: parser.yy:2609 parser.yy:2653
+#: /home/gperciva/src/lilypond/lily/parser.yy:2609
+#: /home/gperciva/src/lilypond/lily/parser.yy:2653
#, c-format
msgid "not a duration: %d"
msgstr ""
-#: parser.yy:2762
+#: parser.yy:2772 /home/gperciva/src/lilypond/lily/parser.yy:2772
msgid "have to be in Note mode for notes"
msgstr ""
-#: parser.yy:2817
+#: parser.yy:2827 /home/gperciva/src/lilypond/lily/parser.yy:2827
msgid "have to be in Chord mode for chords"
msgstr ""
-#: parser.yy:3077
+#: parser.yy:3087 /home/gperciva/src/lilypond/lily/parser.yy:3087
msgid "not a markup"
msgstr ""
msgid "string expected after \\include"
msgstr ""
-#. backup rule
#: lexer.ll:393
msgid "end quote missing"
msgstr ""
-#: lexer.ll:555
+#: lexer.ll:551
msgid "Brace found at end of lyric. Did you forget a space?"
msgstr ""
-#: lexer.ll:670
+#: lexer.ll:662
msgid "Brace found at end of markup. Did you forget a space?"
msgstr ""
-#: lexer.ll:682
+#: lexer.ll:674
msgid "EOF found inside a comment"
msgstr ""
-#: lexer.ll:780
+#: lexer.ll:770
#, c-format
msgid "invalid character: `%s'"
msgstr ""
-#: lexer.ll:883 lexer.ll:884
+#: lexer.ll:881
#, c-format
msgid "unknown escaped string: `\\%s'"
msgstr ""
-#: lexer.ll:1166 lexer.ll:1167
+#: lexer.ll:1164
msgid "non-UTF-8 input"
msgstr ""
-#: lexer.ll:1210 lexer.ll:1211
+#: lexer.ll:1208
#, c-format
msgid "file too old: %s (oldest supported: %s)"
msgstr ""
-#: lexer.ll:1211 lexer.ll:1212
+#: lexer.ll:1209
msgid "consider updating the input with the convert-ly script"
msgstr ""
-#: lexer.ll:1217 lexer.ll:1218
+#: lexer.ll:1215
#, c-format
msgid "program too old: %s (file requires: %s)"
msgstr ""
-#: parser-clef.scm:143 parser-clef.scm:183
+#: backend-library.scm:27
#, scheme-format
-msgid "unknown clef type `~a'"
+msgid "Invoking `~a'..."
msgstr ""
-#: parser-clef.scm:144 parser-clef.scm:184
+#: backend-library.scm:31
#, scheme-format
-msgid "supported clefs: ~a"
+msgid "`~a' failed (~a)\n"
msgstr ""
-#: parser-ly-from-scheme.scm:73
-msgid "error in #{ ... #}"
+#: backend-library.scm:90
+#, scheme-format
+msgid "Converting to `~a'...\n"
msgstr ""
-#: framework-eps.scm:108
+#. Do not try to guess the name of the png file,
+#. GS produces PNG files like BASE-page%d.png.
+#: backend-library.scm:99
#, scheme-format
-msgid "Writing ~a..."
+msgid "Converting to ~a..."
msgstr ""
-#: flag-styles.scm:151
+#: backend-library.scm:137
#, scheme-format
-msgid "flag stroke `~a' or `~a' not found"
+msgid "Writing header field `~a' to `~a'..."
msgstr ""
-#: graphviz.scm:64
+#: backend-library.scm:187
#, scheme-format
-msgid "Writing graph `~a'..."
+msgid "missing stencil expression `~S'"
+msgstr ""
+
+#: chord-entry.scm:52
+#, scheme-format
+msgid "Spurious garbage following chord: ~A"
msgstr ""
-#: define-music-properties.scm:21 define-grob-properties.scm:21
-#: define-context-properties.scm:31
+#: define-context-properties.scm:31 define-grob-properties.scm:21
+#: define-music-properties.scm:21
#, scheme-format
msgid "symbol ~S redefined"
msgstr ""
-#: lily.scm:234
-msgid "Using (ice-9 curried-definitions) module\n"
+#: define-event-classes.scm:67
+#, scheme-format
+msgid "unknown parent class `~a'"
msgstr ""
-#: lily.scm:237
-msgid "Guile 1.8\n"
+#: define-markup-commands.scm:887
+msgid "no systems found in \\score markup, does it have a \\layout block?"
msgstr ""
-#: lily.scm:297
+#: define-markup-commands.scm:2614
#, scheme-format
-msgid "cannot find: ~A"
+msgid "Cannot find glyph ~a"
msgstr ""
-#: lily.scm:707
-msgid "Success: compilation successfully completed"
+#: define-markup-commands.scm:3040
+#, scheme-format
+msgid "no brace found for point size ~S "
msgstr ""
-#: lily.scm:708
-msgid "Compilation completed with warnings or errors"
+#: define-markup-commands.scm:3041
+#, scheme-format
+msgid "defaulting to ~S pt"
msgstr ""
-#: lily.scm:770
+#: define-markup-commands.scm:3194
#, scheme-format
-msgid "job ~a terminated with signal: ~a"
+msgid "not a valid duration string: ~a"
msgstr ""
-#: lily.scm:773
+#: define-music-types.scm:765
#, scheme-format
-msgid ""
-"logfile ~a (exit ~a):\n"
-"~a"
+msgid "symbol expected: ~S"
msgstr ""
-#: lily.scm:795 lily.scm:881
+#: define-music-types.scm:768
#, scheme-format
-msgid "failed files: ~S"
+msgid "cannot find music object: ~S"
msgstr ""
-#: lily.scm:872
+#: define-music-types.scm:787
#, scheme-format
-msgid "Redirecting output to ~a..."
+msgid "unknown repeat type `~S'"
+msgstr ""
+
+#: define-music-types.scm:788
+msgid "See define-music-types.scm for supported repeats"
+msgstr ""
+
+#: define-note-names.scm:962
+msgid "Select note names language."
msgstr ""
-#: lily.scm:891 ps-to-png.scm:66
+#: define-note-names.scm:968
#, scheme-format
-msgid "Invoking `~a'...\n"
+msgid "Using `~a' note names..."
msgstr ""
-#: layout-beam.scm:40
+#: define-note-names.scm:971
#, scheme-format
-msgid "Error in beam quanting. Expected (~S,~S) found ~S."
+msgid "Could not find language `~a'. Ignoring."
msgstr ""
-#: layout-beam.scm:54
+#: document-backend.scm:132
#, scheme-format
-msgid "Error in beam quanting. Expected ~S 0, found ~S."
+msgid "pair expected in doc ~s"
msgstr ""
-#: output-svg.scm:47
+#: document-backend.scm:189
#, scheme-format
-msgid "undefined: ~S"
+msgid "cannot find interface for property: ~S"
msgstr ""
-#: output-svg.scm:157
+#: document-backend.scm:199
#, scheme-format
-msgid "cannot decypher Pango description: ~a"
+msgid "unknown Grob interface: ~S"
msgstr ""
-#: output-svg.scm:237
-msgid "Glyph must have a unicode value"
+#: documentation-lib.scm:59
+#, scheme-format
+msgid "Processing ~S..."
msgstr ""
-#: output-svg.scm:289 output-svg.scm:299
+#: documentation-lib.scm:176
#, scheme-format
-msgid "cannot find SVG font ~S"
+msgid "Writing ~S..."
msgstr ""
-#: output-svg.scm:524 output-ps.scm:277
+#: documentation-lib.scm:188
#, scheme-format
-msgid "unknown line-cap-style: ~S"
+msgid "cannot find description for property `~S' (~S)"
+msgstr ""
+
+#: documentation-lib.scm:209
+#, scheme-format
+msgid "cannot find description for property ~S (~S)"
msgstr ""
-#: output-svg.scm:530 output-ps.scm:282
+#: flag-styles.scm:151
#, scheme-format
-msgid "unknown line-join-style: ~S"
+msgid "flag stroke `~a' or `~a' not found"
+msgstr ""
+
+#: framework-eps.scm:108
+#, scheme-format
+msgid "Writing ~a..."
+msgstr ""
+
+#: framework-ps.scm:250
+#, scheme-format
+msgid "cannot embed ~S=~S"
+msgstr ""
+
+#: framework-ps.scm:293
+#, scheme-format
+msgid "cannot extract file matching ~a from ~a"
+msgstr ""
+
+#: framework-ps.scm:311
+#, scheme-format
+msgid "do not know how to embed ~S=~S"
+msgstr ""
+
+#: framework-ps.scm:336
+#, scheme-format
+msgid "do not know how to embed font ~s ~s ~s"
msgstr ""
-#: to-xml.scm:191
-#, scheme-format
-msgid "assertion failed: ~S"
+#: framework-ps.scm:686
+msgid ""
+"\n"
+"The PostScript backend does not support the\n"
+"system-by-system output. For that, use the EPS backend instead,\n"
+"\n"
+" lilypond -dbackend=eps FILE\n"
+"\n"
+"If have cut & pasted a lilypond fragment from a webpage, be sure\n"
+"to only remove anything before\n"
+"\n"
+" %% ****************************************************************\n"
+" %% Start cut-&-pastable-section\n"
+" %% ****************************************************************\n"
msgstr ""
-#: paper.scm:120
-msgid "set-global-staff-size: not in toplevel scope"
+#: framework-svg.scm:84
+#, scheme-format
+msgid "Updating font into: ~a"
msgstr ""
-#: paper.scm:314
+#: graphviz.scm:64
#, scheme-format
-msgid "This is not a \\layout {} object, ~S"
+msgid "Writing graph `~a'..."
msgstr ""
-#: paper.scm:326
+#: layout-beam.scm:40
#, scheme-format
-msgid "Unknown paper size: ~a"
+msgid "Error in beam quanting. Expected (~S,~S) found ~S."
msgstr ""
-#. TODO: should raise (generic) exception with throw, and catch
-#. that in parse-scm.cc
-#: paper.scm:341
-msgid "Must use #(set-paper-size .. ) within \\paper { ... }"
+#: layout-beam.scm:54
+#, scheme-format
+msgid "Error in beam quanting. Expected ~S 0, found ~S."
msgstr ""
#: lily-library.scm:299
msgid "Music unsuitable for output-def"
msgstr ""
-#: lily-library.scm:888
+#: lily-library.scm:892
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:962
+#: lily-library.scm:966
#, scheme-format
msgid "unknown unit: ~S"
msgstr ""
-#: lily-library.scm:987
+#: lily-library.scm:991
#, scheme-format
msgid "no \\version statement found, please add~afor future compatibility"
msgstr ""
-#: lily-library.scm:993
+#: lily-library.scm:997
msgid "old relative compatibility not used"
msgstr ""
-#: backend-library.scm:27
-#, scheme-format
-msgid "Invoking `~a'..."
-msgstr ""
-
-#: backend-library.scm:31
-#, scheme-format
-msgid "`~a' failed (~a)\n"
-msgstr ""
-
-#: backend-library.scm:90
-#, scheme-format
-msgid "Converting to `~a'...\n"
+#: lily.scm:234
+msgid "Using (ice-9 curried-definitions) module\n"
msgstr ""
-#. Do not try to guess the name of the png file,
-#. GS produces PNG files like BASE-page%d.png.
-#: backend-library.scm:99
-#, scheme-format
-msgid "Converting to ~a..."
+#: lily.scm:237
+msgid "Guile 1.8\n"
msgstr ""
-#: backend-library.scm:137
+#: lily.scm:297
#, scheme-format
-msgid "Writing header field `~a' to `~a'..."
+msgid "cannot find: ~A"
msgstr ""
-#: backend-library.scm:187
-#, scheme-format
-msgid "missing stencil expression `~S'"
+#: lily.scm:708
+msgid "Success: compilation successfully completed"
msgstr ""
-#: documentation-lib.scm:59
-#, scheme-format
-msgid "Processing ~S..."
+#: lily.scm:709
+msgid "Compilation completed with warnings or errors"
msgstr ""
-#: documentation-lib.scm:176
+#: lily.scm:771
#, scheme-format
-msgid "Writing ~S..."
+msgid "job ~a terminated with signal: ~a"
msgstr ""
-#: documentation-lib.scm:188
+#: lily.scm:774
#, scheme-format
-msgid "cannot find description for property `~S' (~S)"
+msgid ""
+"logfile ~a (exit ~a):\n"
+"~a"
msgstr ""
-#: documentation-lib.scm:209
+#: lily.scm:796 lily.scm:882
#, scheme-format
-msgid "cannot find description for property ~S (~S)"
-msgstr ""
-
-#: define-markup-commands.scm:887
-msgid "no systems found in \\score markup, does it have a \\layout block?"
+msgid "failed files: ~S"
msgstr ""
-#: define-markup-commands.scm:2614
+#: lily.scm:873
#, scheme-format
-msgid "Cannot find glyph ~a"
+msgid "Redirecting output to ~a..."
msgstr ""
-#: define-markup-commands.scm:3040
+#: lily.scm:892 ps-to-png.scm:66
#, scheme-format
-msgid "no brace found for point size ~S "
+msgid "Invoking `~a'...\n"
msgstr ""
-#: define-markup-commands.scm:3041
+#: ly-syntax-constructors.scm:66
#, scheme-format
-msgid "defaulting to ~S pt"
+msgid "~a function cannot return ~a"
msgstr ""
-#: define-markup-commands.scm:3194
+#: ly-syntax-constructors.scm:75
#, scheme-format
-msgid "not a valid duration string: ~a"
+msgid "wrong type for argument ~a. Expecting ~a, found ~s"
msgstr ""
-#: define-event-classes.scm:67
+#: ly-syntax-constructors.scm:188
#, scheme-format
-msgid "unknown parent class `~a'"
+msgid "Invalid property operation ~a"
msgstr ""
#: markup-macros.scm:331
msgid "Not a markup command: ~A"
msgstr ""
-#: document-backend.scm:132
-#, scheme-format
-msgid "pair expected in doc ~s"
-msgstr ""
-
-#: document-backend.scm:189
-#, scheme-format
-msgid "cannot find interface for property: ~S"
-msgstr ""
-
-#: document-backend.scm:199
-#, scheme-format
-msgid "unknown Grob interface: ~S"
-msgstr ""
-
-#: define-note-names.scm:962
-msgid "Select note names language."
-msgstr ""
-
-#: define-note-names.scm:968
-#, scheme-format
-msgid "Using `~a' note names..."
-msgstr ""
-
-#: define-note-names.scm:971
-#, scheme-format
-msgid "Could not find language `~a'. Ignoring."
-msgstr ""
-
#: modal-transforms.scm:38
msgid "'from' pitch not in scale; ignoring"
msgstr ""
msgid "negative replication count; ignoring"
msgstr ""
-#: framework-ps.scm:250
+#: music-functions.scm:272
+msgid "More alternatives than repeats. Junking excess alternatives"
+msgstr ""
+
+#: music-functions.scm:303
#, scheme-format
-msgid "cannot embed ~S=~S"
+msgid "invalid tremolo repeat count: ~a"
msgstr ""
-#: framework-ps.scm:293
+#: music-functions.scm:689
+msgid "Bad chord repetition"
+msgstr ""
+
+#: music-functions.scm:724
#, scheme-format
-msgid "cannot extract file matching ~a from ~a"
+msgid "music expected: ~S"
msgstr ""
-#: framework-ps.scm:311
+#: music-functions.scm:1042
#, scheme-format
-msgid "do not know how to embed ~S=~S"
+msgid "cannot find quoted music: `~S'"
msgstr ""
-#: framework-ps.scm:336
+#: music-functions.scm:1180
+msgid "Add @var{octave-shift} to the octave of @var{pitch}."
+msgstr ""
+
+#: music-functions.scm:1240
#, scheme-format
-msgid "do not know how to embed font ~s ~s ~s"
+msgid "Unknown octaveness type: ~S "
msgstr ""
-#: framework-ps.scm:686
-msgid ""
-"\n"
-"The PostScript backend does not support the\n"
-"system-by-system output. For that, use the EPS backend instead,\n"
-"\n"
-" lilypond -dbackend=eps FILE\n"
-"\n"
-"If have cut & pasted a lilypond fragment from a webpage, be sure\n"
-"to only remove anything before\n"
-"\n"
-" %% ****************************************************************\n"
-" %% Start cut-&-pastable-section\n"
-" %% ****************************************************************\n"
+#: music-functions.scm:1241
+msgid "Defaulting to 'any-octave."
msgstr ""
-#: music-functions.scm:274
-msgid "More alternatives than repeats. Junking excess alternatives"
+#: music-functions.scm:1578
+#, scheme-format
+msgid "unknown accidental style: ~S"
msgstr ""
-#: music-functions.scm:305
+#: output-ps.scm:277 output-svg.scm:524
#, scheme-format
-msgid "invalid tremolo repeat count: ~a"
+msgid "unknown line-cap-style: ~S"
msgstr ""
-#: music-functions.scm:671
-msgid "Bad chord repetition"
+#: output-ps.scm:282 output-svg.scm:530
+#, scheme-format
+msgid "unknown line-join-style: ~S"
msgstr ""
-#: music-functions.scm:706
+#: output-svg.scm:47
#, scheme-format
-msgid "music expected: ~S"
+msgid "undefined: ~S"
msgstr ""
-#: music-functions.scm:1024
+#: output-svg.scm:157
#, scheme-format
-msgid "cannot find quoted music: `~S'"
+msgid "cannot decypher Pango description: ~a"
msgstr ""
-#: music-functions.scm:1162
-msgid "Add @var{octave-shift} to the octave of @var{pitch}."
+#: output-svg.scm:237
+msgid "Glyph must have a unicode value"
msgstr ""
-#: music-functions.scm:1222
+#: output-svg.scm:289 output-svg.scm:299
#, scheme-format
-msgid "Unknown octaveness type: ~S "
+msgid "cannot find SVG font ~S"
msgstr ""
-#: music-functions.scm:1223
-msgid "Defaulting to 'any-octave."
+#: paper.scm:120
+msgid "set-global-staff-size: not in toplevel scope"
msgstr ""
-#: music-functions.scm:1560
+#: paper.scm:315
#, scheme-format
-msgid "unknown accidental style: ~S"
+msgid "This is not a \\layout {} object, ~S"
msgstr ""
-#: define-music-types.scm:765
+#: paper.scm:327
#, scheme-format
-msgid "symbol expected: ~S"
+msgid "Unknown paper size: ~a"
msgstr ""
-#: define-music-types.scm:768
+#. TODO: should raise (generic) exception with throw, and catch
+#. that in parse-scm.cc
+#: paper.scm:342
+msgid "Must use #(set-paper-size .. ) within \\paper { ... }"
+msgstr ""
+
+#: parser-clef.scm:143 parser-clef.scm:183
#, scheme-format
-msgid "cannot find music object: ~S"
+msgid "unknown clef type `~a'"
msgstr ""
-#: define-music-types.scm:787
+#: parser-clef.scm:144 parser-clef.scm:184
#, scheme-format
-msgid "unknown repeat type `~S'"
+msgid "supported clefs: ~a"
msgstr ""
-#: define-music-types.scm:788
-msgid "See define-music-types.scm for supported repeats"
+#: parser-ly-from-scheme.scm:73
+msgid "error in #{ ... #}"
msgstr ""
-#: framework-svg.scm:84
+#: part-combiner.scm:598
#, scheme-format
-msgid "Updating font into: ~a"
+msgid "quoted music `~a' is empty"
+msgstr ""
+
+#: ps-to-png.scm:70
+#, scheme-format
+msgid "~a exited with status: ~S"
+msgstr ""
+
+#: to-xml.scm:191
+#, scheme-format
+msgid "assertion failed: ~S"
msgstr ""
#: translation-functions.scm:359
"No label for fret ~a (on string ~a);\n"
"only ~a fret labels provided"
msgstr ""
-
-#: ps-to-png.scm:70
-#, scheme-format
-msgid "~a exited with status: ~S"
-msgstr ""
-
-#: chord-entry.scm:52
-#, scheme-format
-msgid "Spurious garbage following chord: ~A"
-msgstr ""
-
-#: part-combiner.scm:598
-#, scheme-format
-msgid "quoted music `~a' is empty"
-msgstr ""
-
-#: ly-syntax-constructors.scm:66
-#, scheme-format
-msgid "~a function cannot return ~a"
-msgstr ""
-
-#: ly-syntax-constructors.scm:75
-#, scheme-format
-msgid "wrong type for argument ~a. Expecting ~a, found ~s"
-msgstr ""
-
-#: ly-syntax-constructors.scm:188
-#, scheme-format
-msgid "Invalid property operation ~a"
-msgstr ""
str = re.sub (r"(\\set\s+)stringTuning", r"\1Staff.stringTuning", str)
return str
+wordsyntax = r"[a-zA-Z\200-\377](?:[-_]?[a-zA-Z\200-\377])*"
+
+@rule ((2, 15, 43), r'"custom-tuning" = -> custom-tuning =')
+def conv (str):
+ str = re.sub ('\n"(' + wordsyntax + r')"(\s*=\s*\\stringTuning)', "\n\\1\\2", str)
+ return str
+
# Guidelines to write rules (please keep this at the end of this file)
#
# - keep at most one rule per version; if several conversions should be done,
--- /dev/null
+;;;; This file is part of LilyPond, the GNU music typesetter.
+;;;;
+;;;; Copyright (C) 2009--2012 Marc Hohl <marc@hohlart.de>
+;;;;
+;;;; 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/>.
+
+;; helper functions
+
+(define (get-staff-symbol grob)
+ (if (grob::has-interface grob 'staff-symbol-interface)
+ grob
+ (ly:grob-object grob 'staff-symbol)))
+
+(define (layout-blot-diameter grob)
+ (let* ((layout (ly:grob-layout grob))
+ (blot (ly:output-def-lookup layout 'blot-diameter)))
+
+ blot))
+
+(define (layout-line-thickness grob)
+ (let* ((layout (ly:grob-layout grob))
+ (line-thickness (ly:output-def-lookup layout 'line-thickness)))
+
+ line-thickness))
+
+(define (staff-symbol-line-count grob)
+ (let ((line-count 0))
+
+ (if (ly:grob? grob)
+ (let ((line-pos (ly:grob-property grob 'line-positions '())))
+
+ (set! line-count (if (pair? line-pos)
+ (length line-pos)
+ (ly:grob-property grob 'line-count 0)))))
+
+ line-count))
+
+(define (staff-symbol-line-span grob)
+ (let ((line-pos (ly:grob-property grob 'line-positions '()))
+ (iv (cons 0.0 0.0)))
+
+ (if (pair? line-pos)
+ (map (lambda (x)
+ (set! iv (cons (min (car iv) x)
+ (max (cdr iv) x))))
+ line-pos)
+ (let ((line-count (ly:grob-property grob 'line-count 0)))
+
+ (set! iv (cons (- 1 line-count)
+ (- line-count 1)))))
+ iv))
+
+(define (staff-symbol-line-positions grob)
+ (let ((line-pos (ly:grob-property grob 'line-positions '())))
+
+ (if (not (pair? line-pos))
+ (let* ((line-count (ly:grob-property grob 'line-count 0))
+ (height (- line-count 1.0)))
+
+ (set! line-pos (map (lambda (x)
+ (- height (* x 2)))
+ (iota line-count)))))
+ line-pos))
+
+;; functions used by external routines
+
+(define-public (span-bar::notify-grobs-of-my-existence grob)
+ (let* ((elts (ly:grob-array->list (ly:grob-object grob 'elements)))
+ (sorted-elts (sort elts ly:grob-vertical<?))
+ (last-pos (1- (length sorted-elts)))
+ (idx 0))
+
+ (map (lambda (g)
+ (ly:grob-set-property!
+ g
+ 'has-span-bar
+ (cons (if (eq? idx last-pos)
+ #f
+ grob)
+ (if (zero? idx)
+ #f
+ grob)))
+ (set! idx (1+ idx)))
+ sorted-elts)))
+
+;; How should a bar line behave at a break?
+;; the following alist has the form
+;; ( unbroken-bar-glyph . ( bar-glyph-at-end-of-line . bar-glyph-at-begin-of-line ))
+
+(define bar-glyph-alist
+ '((":|:" . (":|" . "|:"))
+ (":|.|:" . (":|" . "|:"))
+ (":|.:" . (":|" . "|:"))
+ ("||:" . ("||" . "|:"))
+ ("dashed" . ("dashed" . '()))
+ ("|" . ("|" . ()))
+ ("|s" . (() . "|"))
+ ("|:" . ("|" . "|:"))
+ ("|." . ("|." . ()))
+
+ ;; hmm... should we end with a bar line here?
+ (".|" . ("|" . ".|"))
+ (":|" . (":|" . ()))
+ ("||" . ("||" . ()))
+ (".|." . (".|." . ()))
+ ("|.|" . ("|.|" . ()))
+ ("" . ("" . ""))
+ (":" . (":" . ""))
+ ("." . ("." . ()))
+ ("'" . ("'" . ()))
+ ("empty" . (() . ()))
+ ("brace" . (() . "brace"))
+ ("bracket" . (() . "bracket"))
+
+ ;; segno bar lines
+ ("S" . ("||" . "S"))
+ ("|S" . ("|" . "S"))
+ ("S|" . ("S" . ()))
+ (":|S" . (":|" . "S"))
+ (":|S." . (":|S" . ()))
+ ("S|:" . ("S" . "|:"))
+ (".S|:" . ("|" . "S|:"))
+ (":|S|:" . (":|" . "S|:"))
+ (":|S.|:" . (":|S" . "|:"))
+
+ ;; ancient bar lines
+ ("kievan" . ("kievan" . ""))))
+
+;; drawing functions for various bar line types
+
+(define (make-empty-bar-line grob extent)
+ (ly:make-stencil "" (cons 0 0) extent))
+
+(define (make-simple-bar-line grob width extent rounded)
+ (let ((blot (if rounded
+ (layout-blot-diameter grob)
+ 0)))
+
+ (ly:round-filled-box (cons 0 width)
+ extent
+ blot)))
+
+(define (make-tick-bar-line grob height rounded)
+ (let ((half-staff (* 1/2 (ly:staff-symbol-staff-space grob)))
+ (staff-line-thickness (ly:staff-symbol-line-thickness grob))
+ (blot (if rounded
+ (layout-blot-diameter grob)
+ 0)))
+
+ (ly:round-filled-box (cons 0 staff-line-thickness)
+ (cons (- height half-staff) (+ height half-staff))
+ blot)))
+
+(define (make-colon-bar-line grob)
+ (let* ((staff-space (ly:staff-symbol-staff-space grob))
+ (dot (ly:font-get-glyph (ly:grob-default-font grob) "dots.dot"))
+ (staff-symbol (get-staff-symbol grob))
+ (lines (staff-symbol-line-count staff-symbol))
+ (stencil empty-stencil)
+ (dist (* (if (or (odd? lines)
+ (zero? lines))
+ 1
+ (if (< staff-space 2)
+ 2
+ 0.5))
+ staff-space)))
+
+ (if (zero? staff-space)
+ (set! staff-space 1.0))
+
+ (let* ((stencil (ly:stencil-add stencil dot))
+ (stencil (ly:stencil-translate-axis
+ stencil dist Y))
+ (stencil (ly:stencil-add stencil dot))
+ (stencil (ly:stencil-translate-axis
+ stencil (/ dist -2) Y)))
+ stencil)))
+
+(define (make-dotted-bar-line grob extent)
+ (let* ((position (round (* (interval-end extent) 2)))
+ (correction (if (even? position) 0.5 0.0))
+ (dot (ly:font-get-glyph (ly:grob-default-font grob) "dots.dot"))
+ (i (round (+ (interval-start extent)
+ (- 0.5 correction))))
+ (e (round (+ (interval-end extent)
+ (- 0.5 correction))))
+ (counting (interval-length (cons i e)))
+ (stil-list (map
+ (lambda (x)
+ (ly:stencil-translate-axis
+ dot (+ x correction) Y))
+ (iota counting i 1))))
+
+ (define (add-stencils! stil l)
+ (if (null? l)
+ stil
+ (if (null? (cdr l))
+ (ly:stencil-add stil (car l))
+ (add-stencils! (ly:stencil-add stil (car l)) (cdr l)))))
+
+ (add-stencils! empty-stencil stil-list)))
+
+(define (make-dashed-bar-line grob extent thickness)
+ (let* ((height (interval-length extent))
+ (staff-symbol (get-staff-symbol grob))
+ (staff-space (ly:staff-symbol-staff-space grob))
+ (line-thickness (layout-line-thickness grob))
+ (dash-size (- 1.0 (ly:grob-property grob 'gap 0.3)))
+ (line-count (staff-symbol-line-count staff-symbol)))
+
+ (if (< (abs (+ line-thickness
+ (* (1- line-count) staff-space)
+ (- height)))
+ 0.1)
+ (let ((blot (layout-blot-diameter grob))
+ (half-space (/ staff-space 2.0))
+ (half-thick (/ line-thickness 2.0))
+ (stencil empty-stencil))
+
+ (map (lambda (i)
+ (let ((top-y (min (* (+ i dash-size) half-space)
+ (+ (* (1- line-count) half-space)
+ half-thick)))
+ (bot-y (max (* (- i dash-size) half-space)
+ (- 0 (* (1- line-count) half-space)
+ half-thick))))
+
+ (set! stencil
+ (ly:stencil-add
+ stencil
+ (ly:round-filled-box (cons 0 thickness)
+ (cons bot-y top-y)
+ blot)))))
+ (iota line-count (1- line-count) (- 2)))
+ stencil)
+ (let* ((dashes (/ height staff-space))
+ (total-dash-size (/ height dashes))
+ (factor (/ (- dash-size thickness) staff-space)))
+
+ (ly:stencil-translate-axis
+ (ly:make-stencil (list 'dashed-line
+ thickness
+ (* factor total-dash-size)
+ (* (- 1 factor) total-dash-size)
+ 0
+ height
+ (* factor total-dash-size 0.5))
+ (cons 0 thickness)
+ (cons 0 height))
+ (interval-start extent)
+ Y)))))
+
+(define (make-segno-bar-line grob glyph extent rounded)
+ (let* ((line-thickness (layout-line-thickness grob))
+ (kern (* (ly:grob-property grob 'kern 1) line-thickness))
+ (thinkern (* (ly:grob-property grob 'thin-kern 1) line-thickness))
+ (hair (* (ly:grob-property grob 'hair-thickness 1) line-thickness))
+ (fatline (* (ly:grob-property grob 'thick-thickness 1) line-thickness))
+ (thin-stil (make-simple-bar-line grob hair extent rounded))
+ (thick-stil (make-simple-bar-line grob fatline extent rounded))
+ (colon-stil (make-colon-bar-line grob))
+ (segno-stil (ly:stencil-add
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ '() X LEFT thin-stil thinkern)
+ X RIGHT thin-stil thinkern)
+ (ly:font-get-glyph (ly:grob-default-font grob) "scripts.varsegno")))
+ (glyph (cond
+ ((string=? glyph "|S") "S")
+ ((string=? glyph "S|") "S")
+ (else glyph)))
+ (stencil (cond
+ ((or (string=? glyph "S|:")
+ (string=? glyph ".S|:"))
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ thick-stil X RIGHT thin-stil kern)
+ X RIGHT colon-stil kern)
+ X LEFT segno-stil thinkern))
+ ((or (string=? glyph ":|S")
+ (string=? glyph ":|S."))
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ thick-stil X LEFT thin-stil kern)
+ X LEFT colon-stil kern)
+ X RIGHT segno-stil thinkern))
+ ((or (string=? glyph ":|S|:")
+ (string=? glyph ":|S.|:"))
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ thick-stil X LEFT thin-stil kern)
+ X LEFT colon-stil kern)
+ X RIGHT segno-stil thinkern)
+ X RIGHT thick-stil thinkern)
+ X RIGHT thin-stil kern)
+ X RIGHT colon-stil kern))
+ ((string=? glyph "|._.|")
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ thick-stil X LEFT thin-stil kern)
+ X RIGHT thick-stil (+ (interval-length
+ (ly:stencil-extent segno-stil X))
+ (* 2 thinkern)))
+ X RIGHT thin-stil kern))
+ (else segno-stil))))
+
+ stencil))
+
+(define (make-kievan-bar-line grob)
+ (let* ((font (ly:grob-default-font grob))
+ (stencil (stencil-whiteout
+ (ly:font-get-glyph font "scripts.barline.kievan"))))
+
+ ;; the kievan bar line has mo staff lines underneath,
+ ;; so we whiteout them and move ithe grob to a higher layer
+ (ly:grob-set-property! grob 'layer 1)
+ stencil))
+
+;; bar line callbacks
+
+(define-public (ly:bar-line::calc-bar-extent grob)
+ (let ((staff-symbol (get-staff-symbol grob))
+ (staff-extent (cons 0 0)))
+
+ (if (ly:grob? staff-symbol)
+ (let* ((bar-line-color (ly:grob-property grob 'color))
+ (staff-color (ly:grob-property staff-symbol 'color))
+ (radius (ly:staff-symbol-staff-radius grob))
+ (staff-line-thickness (ly:staff-symbol-line-thickness grob)))
+
+ ;; Due to rounding problems, bar lines extending to the outermost edges
+ ;; of the staff lines appear wrongly in on-screen display
+ ;; (and, to a lesser extent, in print) - they stick out a pixel.
+ ;; The solution is to extend bar lines only to the middle
+ ;; of the staff line - unless they have different colors,
+ ;;when it would be undesirable.
+ (set! staff-extent (ly:staff-symbol::height staff-symbol))
+ (if (and (eq? bar-line-color staff-color)
+ radius)
+ (set! staff-extent
+ (interval-scale staff-extent
+ (- 1 (* 1/2 (/ staff-line-thickness radius))))))))
+ staff-extent))
+
+(define (bar-line::bar-y-extent grob refpoint)
+ (let* ((extent (ly:grob-property grob 'bar-extent '(0 . 0)))
+ (rel-y (ly:grob-relative-coordinate grob refpoint Y))
+ (y-extent (coord-translate extent rel-y)))
+
+ y-extent))
+
+(define-public (ly:bar-line::print grob)
+ (let ((glyph (ly:grob-property grob 'glyph-name))
+ (extent (ly:grob-property grob 'bar-extent '(0 . 0))))
+
+ (if (and (not (eq? glyph '()))
+ (> (interval-length extent) 0))
+ (bar-line::compound-bar-line grob glyph extent #f)
+ #f)))
+
+(define-public (bar-line::compound-bar-line grob glyph extent rounded)
+ (let* ((line-thickness (layout-line-thickness grob))
+ (height (interval-length extent))
+ (kern (* (ly:grob-property grob 'kern 1) line-thickness))
+ (thinkern (* (ly:grob-property grob 'thin-kern 1) line-thickness))
+ (hair (* (ly:grob-property grob 'hair-thickness 1) line-thickness))
+ (fatline (* (ly:grob-property grob 'thick-thickness 1) line-thickness))
+ (thin-stil (make-simple-bar-line grob hair extent rounded))
+ (thick-stil (make-simple-bar-line grob fatline extent rounded))
+ (colon-stil (make-colon-bar-line grob))
+ (glyph (cond
+ ((not glyph) "")
+ ((string=? glyph "||:") "|:")
+ ;; bar-line::compound-bar-line is called only if
+ ;; height > 0, but just in case ...
+ ((and (string=? glyph ":|")
+ (zero? height)) "|.")
+ ((and (string=? glyph "|:")
+ (zero? height)) ".|")
+ (else glyph)))
+ (stencil (cond
+ ((string=? glyph "|") thin-stil)
+ ((string=? glyph ".") thick-stil)
+ ((string=? glyph "||")
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ '() X LEFT thin-stil thinkern)
+ X RIGHT thin-stil thinkern))
+ ((string=? glyph "|.")
+ (ly:stencil-combine-at-edge
+ thick-stil X LEFT thin-stil kern))
+ ((string=? glyph ".|")
+ (ly:stencil-combine-at-edge
+ thick-stil X RIGHT thin-stil kern))
+ ((string=? glyph "|:")
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ thick-stil X RIGHT thin-stil kern)
+ X RIGHT colon-stil kern))
+ ((string=? glyph ":|")
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ thick-stil X LEFT thin-stil kern)
+ X LEFT colon-stil kern))
+ ((string=? glyph ":|:")
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ '() X LEFT thick-stil thinkern)
+ X LEFT colon-stil kern)
+ X RIGHT thick-stil kern)
+ X RIGHT colon-stil kern))
+ ((string=? glyph ":|.|:")
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ thick-stil X LEFT thin-stil kern)
+ X LEFT colon-stil kern)
+ X RIGHT thin-stil kern)
+ X RIGHT colon-stil kern))
+ ((string=? glyph ":|.:")
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ thick-stil X LEFT thin-stil kern)
+ X LEFT colon-stil kern)
+ X RIGHT colon-stil kern))
+ ((string=? glyph ".|.")
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ '() X LEFT thick-stil thinkern)
+ X RIGHT thick-stil kern))
+ ((string=? glyph "|.|")
+ (ly:stencil-combine-at-edge
+ (ly:stencil-combine-at-edge
+ thick-stil X LEFT thin-stil kern)
+ X RIGHT thin-stil kern))
+ ((string=? glyph ":")
+ (make-dotted-bar-line grob extent))
+ ((or (string=? glyph "|._.|")
+ (string-contains glyph "S"))
+ (make-segno-bar-line grob glyph extent rounded))
+ ((string=? glyph "'")
+ (make-tick-bar-line grob (interval-end extent) rounded))
+ ((string=? glyph "dashed")
+ (make-dashed-bar-line grob extent hair))
+ ((string=? glyph "kievan")
+ (make-kievan-bar-line grob))
+ (else (make-empty-bar-line grob extent)))))
+ stencil))
+
+(define-public (ly:bar-line::calc-anchor grob)
+ (let* ((line-thickness (layout-line-thickness grob))
+ (kern (* (ly:grob-property grob 'kern 1) line-thickness))
+ (glyph (ly:grob-property grob 'glyph-name ""))
+ (x-extent (ly:grob-extent grob grob X))
+ (dot-width (+ (interval-length
+ (ly:stencil-extent
+ (ly:font-get-glyph
+ (ly:grob-default-font grob)
+ "dots.dot")
+ X))
+ kern))
+ (anchor 0.0))
+
+ (if (> (interval-length x-extent) 0)
+ (begin
+ (set! anchor (interval-center x-extent))
+ (cond ((string=? glyph "|:")
+ (set! anchor (+ anchor (/ dot-width -2.0))))
+ ((string=? glyph ":|")
+ (set! anchor (+ anchor (/ dot-width 2.0)))))))
+ anchor))
+
+(define-public (bar-line::calc-glyph-name grob)
+ (let* ((glyph (ly:grob-property grob 'glyph))
+ (dir (ly:item-break-dir grob))
+ (result (assoc-get glyph bar-glyph-alist))
+ (glyph-name (if (= dir CENTER)
+ glyph
+ (if (and result
+ (string? (index-cell result dir)))
+ (index-cell result dir)
+ #f))))
+ glyph-name))
+
+(define-public (bar-line::calc-break-visibility grob)
+ (let* ((glyph (ly:grob-property grob 'glyph))
+ (result (assoc-get glyph bar-glyph-alist)))
+
+ (if result
+ (vector (string? (car result)) #t (string? (cdr result)))
+ all-invisible)))
+
+;; which span bar belongs to a bar line?
+
+(define-public span-bar-glyph-alist
+ '(("|:" . ".|")
+ ("||:" . ".|")
+ (":|" . "|.")
+ (":|.:" . "|.")
+ (":|:" . ".|.")
+ (":|.|:" . "|.|")
+ (":|.|" . "|.")
+ ("S" . "||" )
+ ("S|" . "||")
+ ("|S" . "||")
+ ("S|:" . ".|")
+ (".S|:" . ".|")
+ (":|S" . "|.")
+ (":|S." . "|.")
+ (":|S|:" . "|._.|")
+ (":|S.|:" . "|._.|")
+ ("kievan" . "")
+ ("'" . "")))
+
+;; span bar callbacks
+
+(define-public (ly:span-bar::calc-glyph-name grob)
+ (let* ((elts (ly:grob-object grob 'elements))
+ (pos (1- (ly:grob-array-length elts)))
+ (glyph '()))
+
+ (while (and (eq? glyph '())
+ (> pos -1))
+ (begin (set! glyph (ly:grob-property (ly:grob-array-ref elts pos)
+ 'glyph-name))
+ (set! pos (1- pos))))
+ (if (eq? glyph '())
+ (begin (ly:grob-suicide! grob)
+ (set! glyph "")))
+ (assoc-get glyph span-bar-glyph-alist glyph)))
+
+(define-public (ly:span-bar::width grob)
+ (let ((width (cons 0 0)))
+
+ (if (grob::is-live? grob)
+ (let* ((glyph (ly:grob-property grob 'glyph-name))
+ (stencil (bar-line::compound-bar-line grob glyph (cons -1 1) #f)))
+
+ (set! width (ly:stencil-extent stencil X))))
+ width))
+
+(define-public (ly:span-bar::before-line-breaking grob)
+ (let ((elts (ly:grob-object grob 'elements)))
+
+ (if (zero? (ly:grob-array-length elts))
+ (ly:grob-suicide! grob))))
+
+;; The method used in the following routine depends on bar_engraver
+;; not being removed from staff context. If bar_engraver is removed,
+;; the size of the staff lines is evaluated as 0, which results in a
+;; solid span bar line with faulty y coordinate.
+;;
+;; This routine was originally by Juergen Reuter, but it was a on the
+;; bulky side. Rewritten by Han-Wen. Ported from c++ to Scheme by Marc Hohl.
+(define-public (ly:span-bar::print grob)
+ (let* ((elts-array (ly:grob-object grob 'elements))
+ (refp (ly:grob-common-refpoint-of-array grob elts-array Y))
+ (elts (reverse (sort (ly:grob-array->list elts-array)
+ ly:grob-vertical<?)))
+ ;; Elements must be ordered according to their y coordinates
+ ;; relative to their common axis group parent.
+ ;; Otherwise, the computation goes mad.
+ (glyph (ly:grob-property grob 'glyph-name))
+ (span-bar empty-stencil))
+
+ (if (string? glyph)
+ (let* ((extents '())
+ (make-span-bars '())
+ (model-bar #f))
+
+ ;; we compute the extents of each system and store them
+ ;; in a list; dito for the 'allow-span-bar property.
+ ;; model-bar takes the bar grob, if given.
+ (map (lambda (bar)
+ (let* ((ext (bar-line::bar-y-extent bar refp))
+ (staff-symbol (ly:grob-object bar 'staff-symbol)))
+
+ (if (ly:grob? staff-symbol)
+ (let ((refp-extent (ly:grob-extent staff-symbol refp Y)))
+
+ (set! ext (interval-union ext refp-extent))
+
+ (if (> (interval-length ext) 0)
+ (begin
+ (set! extents (append extents (list ext)))
+ (set! model-bar bar)
+ (set! make-span-bars
+ (append make-span-bars
+ (list (ly:grob-property bar 'allow-span-bar #t))))))))))
+ elts)
+ ;; if there is no bar grob, we use the callback argument
+ (if (not model-bar)
+ (set! model-bar grob))
+ ;; we discard the first entry in make-span-bars, because its corresponding
+ ;; bar line is the uppermost and therefore not connected to another bar line
+ (if (pair? make-span-bars)
+ (set! make-span-bars (cdr make-span-bars)))
+ ;; the span bar reaches from the lower end of the upper staff
+ ;; to the upper end of the lower staff - when allow-span-bar is #t
+ (reduce (lambda (curr prev)
+ (let ((l (cons 0 0))
+ (allow-span-bar (car make-span-bars)))
+
+ (set! make-span-bars (cdr make-span-bars))
+ (if (> (interval-length prev) 0)
+ (begin
+ (set! l (cons (cdr prev) (car curr)))
+ (if (or (zero? (interval-length l))
+ (not allow-span-bar))
+ (begin
+ ;; there is overlap between the bar lines
+ ;; or 'allow-span-bar = #f.
+ ;; Do nothing.
+ )
+ (set! span-bar
+ (ly:stencil-add span-bar
+ (bar-line::compound-bar-line
+ model-bar
+ glyph
+ l
+ #f))))))
+ curr))
+ "" extents)
+ (set! span-bar (ly:stencil-translate-axis
+ span-bar
+ (- (ly:grob-relative-coordinate grob refp Y))
+ Y))))
+ span-bar))
(list 'unquote `(ly:make-duration
,(ly:duration-log e)
,(ly:duration-dot-count e)
- ,(car (ly:duration-factor e))
- ,(cdr (ly:duration-factor e)))))
+ ,(ly:duration-scale))))
((ly:pitch? e)
(list 'unquote `(ly:make-pitch
,(ly:pitch-octave e)
"The line between note heads for a pitch range."
'(gap note-heads thickness))
+(ly:add-interface
+ 'bar-line-interface
+ "Print a special bar symbol. It replaces the regular bar
+symbol with a special symbol. The argument @var{bartype}
+is a string which specifies the kind of bar line to print.
+Options are @code{|}, @code{:|}, @code{|:}, @code{:|:}, @code{:|.|:},
+@code{:|.:}, @code{.}, @code{||}, @code{|.}, @code{.|}, @code{.|.},
+@code{|.|}, @code{:}, @code{dashed}, @code{'} and @code{S}.
+
+These produce, respectively, a normal bar line, a right repeat, a left repeat,
+a thick double repeat, a thin-thick-thin double repeat,
+a thin-thick double repeat, a thick bar, a double bar, a start bar,
+an end bar, a thick double bar, a thin-thick-thin bar,
+a dotted bar, a dashed bar, a tick as bar line and a segno bar.
+
+In addition, there is an option
+@code{||:} which is equivalent to @code{|:} except at line
+breaks, where it produces a double bar (@code{||}) at the
+end of the line and a repeat sign (@code{|:}) at the
+beginning of the new line.
+
+For segno, @code{S} produces a segno sign except at line breaks,
+where it produces a double bar (@code{||}) at the
+end of the line and a segno sign at the beginning of the new line.
+@code{|S} is equivalent to @code{S} but produces a simple bar line
+(@code{|}) instead of a double bar line (@code{||}) at line breaks.
+@code{S|} produces the segno sign at line breaks and starts the following
+line without special bar lines.
+
+@code{S|:} and @code{:|S} are used for repeat/segno combinations that are
+separated at line breaks. Alternatively, @code{.S|:} and @code{:|S.}
+may be used which combine repeat signs and segno at the same line in
+case of a line break. @code{:|S|:} is a combination of a left repeat
+(@code{:|}), a segno (@code{S}) and a right repeat @code{|:} which
+splits before the segno at line breaks; @code{:|S.|:} splits after
+the segno sign.
+
+If @var{bartype} is set to @code{empty} then nothing is
+printed, but a line break is allowed at that spot.
+
+@code{gap} is used for the gaps in dashed bar lines."
+ '(allow-span-bar bar-extent gap glyph glyph-name has-span-bar
+ hair-thickness kern thin-kern thick-thickness))
+
(ly:add-interface
'bass-figure-interface
"A bass figure text."
"Supports setting of spacing variables."
'(spacing-increment shortest-duration-space))
+(ly:add-interface
+ 'span-bar-interface
+ "A bar line that is spanned between other barlines.
+ This interface is used for bar lines that connect different
+ staves."
+ '(glyph-name elements pure-Y-common pure-relevant-grobs
+ pure-relevant-items pure-relevant-spanners))
+
(ly:add-interface
'stanza-number-interface
"A stanza number, to be put in from of a lyrics line."
;;;
(define*-public (duration->lily-string ly-duration #:key (prev-duration (*previous-duration*))
(force-duration (*force-duration*))
- (time-factor-numerator (*time-factor-numerator*))
- (time-factor-denominator (*time-factor-denominator*))
+ (time-scale (*time-scale*))
remember)
(if remember (*previous-duration* ly-duration))
(let ((log2 (ly:duration-log ly-duration))
(dots (ly:duration-dot-count ly-duration))
- (num+den (ly:duration-factor ly-duration)))
+ (scale (ly:duration-scale ly-duration)))
(if (or force-duration (not prev-duration) (not (equal? ly-duration prev-duration)))
(string-append (case log2
((-1) "\\breve")
((-3) "\\maxima")
(else (number->string (expt 2 log2))))
(make-string dots #\.)
- (let ((num? (not (or (= 1 (car num+den))
- (and time-factor-numerator
- (= (car num+den) time-factor-numerator)))))
- (den? (not (or (= 1 (cdr num+den))
- (and time-factor-denominator
- (= (cdr num+den) time-factor-denominator))))))
- (cond (den?
- (format #f "*~a/~a" (car num+den) (cdr num+den)))
- (num?
- (format #f "*~a" (car num+den)))
- (else ""))))
+ (let ((end-scale (/ scale time-scale)))
+ (if (= end-scale 1) ""
+ (format #f "*~a" end-scale))))
"")))
;;;
(define-display-method TimeScaledMusic (times parser)
(let* ((num (ly:music-property times 'numerator))
(den (ly:music-property times 'denominator))
- (nd-gcd (gcd num den)))
+ (scale (/ num den))
+ (dur (*previous-duration*))
+ (time-scale (*time-scale*)))
+
(parameterize ((*force-line-break* #f)
- (*time-factor-numerator* (/ num nd-gcd))
- (*time-factor-denominator* (/ den nd-gcd)))
+ (*previous-duration*
+ (ly:make-duration (ly:duration-log dur)
+ (ly:duration-dot-count dur)
+ (* (ly:duration-scale dur)
+ scale)))
+ (*time-scale* (* time-scale scale)))
(format #f "\\times ~a/~a ~a"
num
den
(define *max-element-number-before-break* (make-parameter 6))
;; \times factor (used in durations)
-(define *time-factor-denominator* (make-parameter #f))
-(define *time-factor-numerator* (make-parameter #f))
+(define *time-scale* (make-parameter 1))
(define *current-context* (make-parameter 'Bottom))
(define (other-axis a)
(remainder (+ a 1) 2))
+(define-public (interval-scale iv factor)
+ (cons (* (car iv) factor)
+ (* (cdr iv) factor)))
+
(define-public (interval-widen iv amount)
(cons (- (car iv) amount)
(+ (cdr iv) amount)))
"font.scm"
"encoding.scm"
+ "bar-line.scm"
"flag-styles.scm"
"fret-diagrams.scm"
"tablature.scm"
(ly:duration? obj)
`(ly:make-duration ,(ly:duration-log obj)
,(ly:duration-dot-count obj)
- ,(car (ly:duration-factor obj))
- ,(cdr (ly:duration-factor obj))))
+ ,(ly:duration-scale obj)))
(;; note pitch
(ly:pitch? obj)
`(ly:make-pitch ,(ly:pitch-octave obj)
The number of dots in the shifted music may not be less than zero."
(let ((d (ly:music-property music 'duration)))
(if (ly:duration? d)
- (let* ((cp (ly:duration-factor d))
+ (let* ((cp (ly:duration-scale d))
(nd (ly:make-duration
(+ shift (ly:duration-log d))
(max 0 (+ dot (ly:duration-dot-count d)))
- (car cp)
- (cdr cp))))
+ cp)))
(set! (ly:music-property music 'duration) nd)))
music))
(defmacro-public define-syntax-function (type args signature . body)
"Helper macro for `ly:make-music-function'.
Syntax:
- (define-syntax-function (result-type? parser location arg1 arg2 ...) (result-type? arg1-type arg2-type ...)
+ (define-syntax-function result-type? (parser location arg1 arg2 ...) (arg1-type arg2-type ...)
...function body...)
argX-type can take one of the forms @code{predicate?} for mandatory
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Bar lines.
+;; neighbor-interface routines
-;;
-;; How should a bar line behave at a break?
-(define bar-glyph-alist
- '((":|:" . (":|" . "|:"))
- (":|.|:" . (":|" . "|:"))
- (":|.:" . (":|" . "|:"))
- ("||:" . ("||" . "|:"))
- ("dashed" . ("dashed" . '()))
- ("|" . ("|" . ()))
- ("|s" . (() . "|"))
- ("|:" . ("|" . "|:"))
- ("|." . ("|." . ()))
-
- ;; hmm... should we end with a bar line here?
- (".|" . ("|" . ".|"))
- (":|" . (":|" . ()))
- ("||" . ("||" . ()))
- (".|." . (".|." . ()))
- ("|.|" . ("|.|" . ()))
- ("" . ("" . ""))
- (":" . (":" . ""))
- ("." . ("." . ()))
- ("'" . ("'" . ()))
- ("empty" . (() . ()))
- ("brace" . (() . "brace"))
- ("bracket" . (() . "bracket"))
-
- ;; segno bar lines
- ("S" . ("||" . "S"))
- ("|S" . ("|" . "S"))
- ("S|" . ("S" . ()))
- (":|S" . (":|" . "S"))
- (":|S." . (":|S" . ()))
- ("S|:" . ("S" . "|:"))
- (".S|:" . ("|" . "S|:"))
- (":|S|:" . (":|" . "S|:"))
- (":|S.|:" . (":|S" . "|:"))
-
- ;; ancient bar lines
- ("kievan" . ("kievan" . ""))))
-
-(define-public (bar-line::calc-glyph-name grob)
- (let* ((glyph (ly:grob-property grob 'glyph))
- (dir (ly:item-break-dir grob))
- (result (assoc-get glyph bar-glyph-alist))
- (glyph-name (if (= dir CENTER)
- glyph
- (if (and result
- (string? (index-cell result dir)))
- (index-cell result dir)
- #f))))
- glyph-name))
-
-(define-public (bar-line::calc-break-visibility grob)
- (let* ((glyph (ly:grob-property grob 'glyph))
- (result (assoc-get glyph bar-glyph-alist)))
-
- (if result
- (vector (string? (car result)) #t (string? (cdr result)))
- all-invisible)))
(define-public (shift-right-at-line-begin g)
"Shift an item to the right, but only at the start of the line."
;; F4 used in southeast Asia and Australia
("f4" . (cons (* 210 mm) (* 330 mm)))
;; Used for very small @lilypond examples in the Documentation
- ;; based on a8 size but landscape not portrait
+ ;; based on a8 and a7 sizes but landscape not portrait
("a8landscape" . (cons (* 74 mm) (* 52 mm)))
+ ("a7landscape" . (cons (* 105 mm) (* 74 mm)))
))
;; todo: take dimension arguments.
ly:duration-dot-count
ly:duration-factor
ly:duration-log
+ ly:duration-scale
ly:duration<?
ly:duration?
ly:error
(define *tempo-compression* #f)
(define (duration->number duration)
- (let* ((log (ly:duration-log duration))
- (dots (ly:duration-dot-count duration))
- (factor (ly:duration-factor duration)))
- (exact->inexact (* (expt 2 (- log)) (+ 1 (/ dots 2)) (/ (car factor) (cdr factor))))))
+ (exact->inexact (ly:moment-main (ly:duration-length duration))))
(define (tempo->beats music)
(let* ((tempo-spec (find-child-named music 'SequentialMusic))
@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
-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