a4 b c d
diff --git a/Documentation/it/web/introduction.itexi b/Documentation/it/web/introduction.itexi
index e04da75106..f61466cbf1 100644
--- a/Documentation/it/web/introduction.itexi
+++ b/Documentation/it/web/introduction.itexi
@@ -270,7 +270,7 @@ che usano LilyPond.
LilyPond gira su tutte le piattaforme più note: GNU/Linux, MacOS X, e
Windows. LilyPond include un'ampia documentazione e centinaia di file
di esempio. C'è un'attiva comunità di utenti che risponde alle
-domande nella mailing list internazionale dedicata agli utenti Lilypond,
+domande nella mailing list internazionale dedicata agli utenti LilyPond,
offrendo gentilmente il proprio aiuto. I tempi di risposta sono solitamente
molto brevi e spesso vengono suggerite brillanti soluzioni dei problemi
segnalati. Grazie alla stretta interazione col team di sviluppo, tali
@@ -308,7 +308,7 @@ già deciso di provare LilyPond, per prima cosa informati sul nostro
@subheading Begli esempi
-Lilypond è uno strumento potente e flessibile per scrivere ogni tipo
+LilyPond è uno strumento potente e flessibile per scrivere ogni tipo
di musica. Dai un'occhiata alla galleria di esempi e lasciati ispirare!
@divEnd
@@ -318,7 +318,7 @@ di musica. Dai un'occhiata alla galleria di esempi e lasciati ispirare!
@subheading Musica Classica
Questo brano per organo di J.S. Bach rappresenta un tipico esempio di
-progetto Lilypond.
+progetto LilyPond.
@exampleImage{bach-bwv610}
@divEnd
@@ -337,7 +337,7 @@ mediante tratti spezzati.
@divClass{column-center-middle-color2}
@subheading Musica Antica
-Lilypond supporta anche vari tipi di notazione antica, come
+LilyPond supporta anche vari tipi di notazione antica, come
questo passaggio di canto gregoriano.
@exampleImage{ancient-headword}
@@ -346,7 +346,7 @@ questo passaggio di canto gregoriano.
@divClass{column-center-middle-color2}
@subheading Musica Moderna
-I compositori contemporanei ritengono che Lilypond sia molto adatto a
+I compositori contemporanei ritengono che LilyPond sia molto adatto a
visualizzare notazioni non convenzionali. Ecco un estratto dal @emph{Äáry} di
Trevor BaÄa, per flauto basso non accompagnato.
@@ -374,7 +374,7 @@ completa, riduzione per canto e pianoforte, e parte per violino.
@divClass{column-center-middle-color2}
@subheading Intavolatura
-Lilypond supporta la notazione per intavolatura, che può essere personalizzata
+LilyPond supporta la notazione per intavolatura, che può essere personalizzata
per adattarsi a ogni strumento che ne fa uso. Il rigo
dell'intavolatura viene generato automaticamente dalle note inserite per
il pentagramma.
@@ -397,7 +397,7 @@ I colori sono stati aggiunti per migliorare la visibilità .
@subheading Output personalizzato
Un breve estratto del Klavierstück II di Stockhausen per dimostrare la
-capacità di Lilypond di fornire output personalizzato.
+capacità di LilyPond di fornire output personalizzato.
@exampleImage{Stockhausen_Klavierstueck2}
@divEnd
@@ -406,11 +406,11 @@ capacità di Lilypond di fornire output personalizzato.
@divClass{column-center-middle-color2}
@subheading Musica Vocale
-Lilypond è eccellente per la musica vocale di tutti i generi, dagli inni
+LilyPond è eccellente per la musica vocale di tutti i generi, dagli inni
sacri all'opera. Ecco un mottetto medievale con requisiti leggermente
insoliti. Il tenor è scritto in un metro diverso dagli altri,
ma deve essere allineato come se fosse nello stesso tempo.
-Lilypond gestisce questo aspetto in modo molto elegante. Si notino anche gli
+LilyPond gestisce questo aspetto in modo molto elegante. Si notino anche gli
incipit con chiave in stile Vaticana, i gambi barrati a indicare note plicate,
e le parentesi quadre sulle sezioni legate.
@@ -420,7 +420,7 @@ e le parentesi quadre sulle sezioni legate.
@divClass{column-center-middle-color2}
@subheading Applicazioni didattiche
-Lilypond è molto indicato anche per applicazioni didattiche.
+LilyPond è molto indicato anche per applicazioni didattiche.
Ecco un esempio di un semplice esercizio di contrappunto.
@exampleImage{theory}
@@ -440,7 +440,7 @@ personalizzati per adattarsi a quasi ogni situazione.
@divClass{column-center-middle-color2}
@subheading Grandi Progetti
-Lilypond è ottimo anche per progetti ad ampio respiro come opere o lavori per
+LilyPond è ottimo anche per progetti ad ampio respiro come opere o lavori per
un'orchestra sinfonica al completo. Inoltre l'input testuale permette
una maggiore accessibilità -- questo esempio è stato realizzato
da Hu Haipeng, un compositore cieco.
@@ -612,7 +612,7 @@ che per le partiture pubblicate.
@divClass{column-left-top}
@subheading Concerti
-Lilypond è stato usato per esecuzioni in tutto il mondo.
+LilyPond è stato usato per esecuzioni in tutto il mondo.
In evidenza:
@divClass{keep-bullets}
@@ -852,7 +852,7 @@ Dicembre 2005
intitolato @uref{http://www.linuxjournal.com/article/8364, Crea
dei fantastici grafici Schenker con GNU LilyPond}. Ã un articolo
approfondito e pratico con attraenti grafici di LilyPond. L'autore
-Kris Shaffer commenta @qq{GNU Lilypond genera una grafica splendida
+Kris Shaffer commenta @qq{GNU LilyPond genera una grafica splendida
che fa sembrare le alternative commerciali di second'ordine.}
@item
@@ -951,7 +951,7 @@ quanto riguarda la velocità , la facilità d'uso e la resa grafica!}
@qq{[@dots{}dopo la prima prova d'orchestra] ho ricevuto molti
complimenti per la qualità degli spartiti. Ancora più
-importante: sebbene Lilypond fornisca molti trucchi per migliorare
+importante: sebbene LilyPond fornisca molti trucchi per migliorare
l'aspetto degli spartiti, quello che l'orchestra ha ricevuto da me è
l'output grezzo e privo di ritocchi.}
@divEnd
@@ -962,9 +962,9 @@ l'output grezzo e privo di ritocchi.}
@qq{grazie e complimenti al team di sviluppo per il suo incredibile
lavoro. Non ho mai visto niente che possa avvicinarsi all'output di
-Lilypond -- sono assolutamente sicuro che le mie necessità nel campo
+LilyPond -- sono assolutamente sicuro che le mie necessità nel campo
dell'editoria musicale saranno soddisfatte oltre ogni aspettativa usando
-questo fantastico programma. [@dots{}] l'output predefinito di Lilypond [@dots{}] ha
+questo fantastico programma. [@dots{}] l'output predefinito di LilyPond [@dots{}] ha
un aspetto migliore delle recenti pubblicazioni @q{professionali} con cui
l'ho confrontato (ovvero quasi qualsiasi spartito della Warner Bros, e anche molti
dei più recenti delle @q{vecchie case editrici}). [@dots{}]}
@@ -976,7 +976,7 @@ dei più recenti delle @q{vecchie case editrici}). [@dots{}]}
@divClass{testimonial-item}
@subsubheading Chris Cannam, principale programmatore di @uref{http://www.rosegardenmusic.com/, RoseGarden}
-@qq{Lilypond è ovviamente il super gorilla [della
+@qq{LilyPond è ovviamente il super gorilla [della
grande tipografia musicale].}
@divEnd
@@ -1006,7 +1006,7 @@ farlo. Sono sicuro che nessun prodotto commerciale può avvicinarsi a questo.}
@divClass{testimonial-item}
@subsubheading David Bobroff, trombone basso, Iceland Symphony Orchestra
-@qq{Credo che Lilypond sia un grande programma [@dots{}] Più imparo LilyPond
+@qq{Credo che LilyPond sia un grande programma [@dots{}] Più imparo LilyPond
e più mi piace!}
@divEnd
@@ -1321,7 +1321,7 @@ Emacs è un editor di testo che ha la capacità di comprendere molti
diversi linguaggi informatici. Emacs è un editor molto estendibile
e può essere usato come ambiente di sviluppo integrato (IDE).
C'è una @q{modalità lilypond} che fornisce le definizioni del
-linguaggio per poter lavorare con i file sorgente di Lilypond.
+linguaggio per poter lavorare con i file sorgente di LilyPond.
Uno sviluppatore ha scritto
@uref{https://github.com/nsceaux/lyqi,lyqi}, una
modalità primaria di Emacs.
diff --git a/Documentation/ja/learning/tweaks.itely b/Documentation/ja/learning/tweaks.itely
index 303625837f..f3ecdf55d1 100644
--- a/Documentation/ja/learning/tweaks.itely
+++ b/Documentation/ja/learning/tweaks.itely
@@ -652,9 +652,9 @@ Slur ã¸ã®ãªã³ã¯ãé¸æããã¨ãSlur ã®ããããã£ããªã¹ã ã¢
ããã¦ããã¨ã以ä¸ãè¦ã¤ããã¾ã:
@example
-@code{thickness} (number)
- @code{1.2}
- Line thickness, generally measured in @code{line-thickness}
+thickness (number)
+ 1.2
+ Line thickness, generally measured in line-thickness
@end example
ããã太ããå¤æ´ããããããã£ã®ããã§ãã@c
@@ -2078,7 +2078,7 @@ a4 g c a |
ãã®ã³ãã³ãã®ãã©ã¼ãããã¯ä»¥ä¸ã®ãããªãã®ã§ã:
@example
-@code{\set fingeringOrientations = #'([up] [left/right] [down])}
+\set fingeringOrientations = #'([up] [left/right] [down])
@end example
@noindent
@@ -3988,11 +3988,11 @@ lhMusic = \relative {
使ããã¨ã¯ã§ããªãã§ããããï¼
@example
-@code{\override Lyrics.LyricText.font-shape = #'italic}
-@code{\override Lyrics.LyricText.font-series = #'bold}
+\override Lyrics.LyricText.font-shape = #'italic
+\override Lyrics.LyricText.font-series = #'bold
-@code{\revert Lyrics.LyricText.font-shape}
-@code{\revert Lyrics.LyricText.font-series}
+\revert Lyrics.LyricText.font-shape
+\revert Lyrics.LyricText.font-series
@end example
ããããã強調ããå¿
è¦ã®ããåèªãããããããå ´åãå
¥åããã®ã@c
diff --git a/Documentation/ja/notation/changing-defaults.itely b/Documentation/ja/notation/changing-defaults.itely
index b9aa8ebc54..537877abae 100644
--- a/Documentation/ja/notation/changing-defaults.itely
+++ b/Documentation/ja/notation/changing-defaults.itely
@@ -1361,7 +1361,7 @@ squashedPosition = #0
@qq{main} ã¨ããã³ã³ããã¹ãã®ä¸ã«é
ç½®ãç´ãã«ã¯ä»¥ä¸ã®ããã«ãã¾ã:
@example
-@code{\new Staff \with @{ alignAboveContext = #"main" @} }
+\new Staff \with @{ alignAboveContext = #"main" @}
@end example
@code{ChoirStaff} ã®ãããªè¤æ°ã®èã®ã¬ã¤ã¢ã¦ãã§ä¸æçãªæè©ãé
ç½®ããå ´å
@@ -4300,7 +4300,7 @@ Web ã§ãã¸ã¨æ²ç·ãæãããæ§åã示ãã¢ãã¡ã¼ã·ã§ã³ã@c
@code{\shape} ã®æ§æã¯ä»¥ä¸ã®éãã§ã:
@example
-[-]@code{\shape} @var{displacements} @var{item}
+[-]\shape @var{displacements} @var{item}
@end example
ãã㯠@var{item} ã®å¶å¾¡ãã¤ã³ãã @var{displacements} ã ã移åããã¾ãã@c
diff --git a/Documentation/ja/notation/input.itely b/Documentation/ja/notation/input.itely
index c7429f51f8..42f6efcab1 100644
--- a/Documentation/ja/notation/input.itely
+++ b/Documentation/ja/notation/input.itely
@@ -1090,9 +1090,9 @@ scoreTitleMarkup = \markup @{ \column @{
以ä¸ã®æ§æãç¨ãã¾ã:
@example
-@code{variable} = @code{\markup} @{
+variable = \markup @{
...
- @code{\on-the-fly} #@var{procedure} @var{markup}
+ \on-the-fly #@var{procedure} @var{markup}
...
@}
@end example
@@ -1155,9 +1155,9 @@ scoreTitleMarkup = \markup @{ \column @{
ã§ãã¾ããä¾ãã°ã
@example
- @code{\on-the-fly #first-page}
- @code{\on-the-fly #last-page}
- @code{@{ \markup ... \fromproperty #'header: ... @}}
+ \on-the-fly #first-page
+ \on-the-fly #last-page
+ @{ \markup ... \fromproperty #'header: ... @}
@end example
ããã¯ãåºåãåä¸ã®ãã¼ã¸ãã©ãããå¤æãã¾ãã
@@ -2188,7 +2188,7 @@ LilyPond 㯠UTF-8 ã¨ã³ã³ã¼ãã£ã³ã°
LilyPond ã¯å¤è¨èªããã¹ãããPango ã©ã¤ãã©ãªãç¨ãã¦ã@c
ã¬ã¤ã¢ã¦ããã¦æç»ãã¾ãã
-Lilypond ã¯å
¥åã®ã¨ã³ã³ã¼ãã£ã³ã°å¤æãã¾ã£ããè¡ãã¾ããã@c
+LilyPond ã¯å
¥åã®ã¨ã³ã³ã¼ãã£ã³ã°å¤æãã¾ã£ããè¡ãã¾ããã@c
ããã¯é ASCII æåãå«ããã¹ã¦ã®ããã¹ã
-- ã¿ã¤ãã«ãæè©ããã¹ããããã¯æ¼å¥æ示 --
ã UTF-8 ã§ã¨ã³ã³ã¼ããã¦å
¥åããå¿
è¦ãããã¨ãããã¨ãæå³ãã¾ãã@c
diff --git a/Documentation/ja/notation/rhythms.itely b/Documentation/ja/notation/rhythms.itely
index 2f91192bb6..4193aa328b 100644
--- a/Documentation/ja/notation/rhythms.itely
+++ b/Documentation/ja/notation/rhythms.itely
@@ -1712,7 +1712,7 @@ cis4 d cis! d
æ§æã¯ä»¥ä¸ã®éãã§ã:
@example
-\compoundMeter #'@code{(list of lists)}
+\compoundMeter #'(list of lists)
@end example
æãç°¡åãªæ§æã¯åä¸ã®ãªã¹ãã§ããã@c
@@ -3212,7 +3212,7 @@ c1 | c | c | c
@emph{acciaccatura} ã®ããã«ã¹ã©ãã·ã¥ä»ãã®ç¬¦å¹¹ãæã¤ã@c
ã¹ã©ã¼ã¯ä»ããªãè£
飾å°é³ç¬¦ãèå»ãããã¨ãã§ãã¾ãã
-Lilypond ã¯ããã« 2 ã¤ç¹æ®ãªã¿ã¤ãã®è£
飾å°é³ç¬¦ããµãã¼ããã¾ã:
+LilyPond ã¯ããã« 2 ã¤ç¹æ®ãªã¿ã¤ãã®è£
飾å°é³ç¬¦ããµãã¼ããã¾ã:
@emph{acciaccatura} (é·ããæããªãè£
飾å°é³ç¬¦ã§ã@c
ã¹ã©ãã·ã¥ä»ãã®ç¬¦å¹¹ãæã¤ã¹ã©ã¼ã§ã¤ãªããããå°ããªé³ç¬¦) ã¨
@emph{appoggiatura} (ä¸å®ã®æ¯çã§ä¸»é³ç¬¦ããæ¼å¥æéãã¨ãã@c
diff --git a/Documentation/ja/notation/spacing.itely b/Documentation/ja/notation/spacing.itely
index a7bcbafe56..dad396f717 100644
--- a/Documentation/ja/notation/spacing.itely
+++ b/Documentation/ja/notation/spacing.itely
@@ -3128,7 +3128,7 @@ Essay on automated music engraving:
@subsection ãããã¼ã·ã§ãã« ãã¼ãã¼ã·ã§ã³
@translationof Proportional notation
-Lilypond ã¯ãããã¼ã·ã§ãã« ãã¼ãã¼ã·ã§ã³ããµãã¼ããã¾ãã@c
+LilyPond ã¯ãããã¼ã·ã§ãã« ãã¼ãã¼ã·ã§ã³ããµãã¼ããã¾ãã@c
ãã®è¨èæ³ã§ã¯ãåé³ç¬¦ã¯æ¼å¥æéã«ç¸å½ããæ°´å¹³æ¹åã®ã¹ãã¼ã¹ãã¨ãã¾ãã@c
ãã®ã¿ã¤ãã®æ°´å¹³ã¹ãã¼ã¹ã¯ãæ¹ç¼ç´ä¸ã®æ°´å¹³æ¹åã¹ãã¼ã¹ã¨åçã§ãã@c
20 ä¸ç´å¾åã21 ä¸ç´ååã®æ¥½èã®ä¸ã«ã¯ã@c
diff --git a/Documentation/ja/translations.itexi b/Documentation/ja/translations.itexi
index 16a47dbd1c..dc089be323 100644
--- a/Documentation/ja/translations.itexi
+++ b/Documentation/ja/translations.itexi
@@ -16,7 +16,7 @@ td { border: 1px solid black; text-align: center; }
@end html
@end ifhtml
-@emph{æçµæ´æ°æ¥ Sat Jul 2 15:06:05 UTC 2016
+@emph{æçµæ´æ°æ¥ Sun Aug 7 13:59:13 UTC 2016
}
@multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667
@@ -59,7 +59,7 @@ Yoshiki Sawada
@item
LilyPond --- \TITLE\
@*
-1139
+1138
@tab Masamichi Hosoda
@*
Yoshiki Sawada
@@ -266,7 +266,7 @@ partially
@item
LilyPond --- \TITLE\
@*
-1139
+1138
@tab Yoshiki Sawada
@tab
@tab
@@ -320,7 +320,7 @@ LilyPond --- \TITLE\
@item
1.1 ããã
@*
-5169
+5224
@tab Yoshiki Sawada
@tab
@tab
@@ -337,7 +337,7 @@ LilyPond --- \TITLE\
@ifhtml
@html
-partially
+partially
@end html
@end ifhtml
@ifnothtml
@@ -347,7 +347,7 @@ partially
@item
1.2 ãªãºã
@*
-6795
+6822
@tab Yoshiki Sawada
@tab
@tab
@@ -364,7 +364,7 @@ partially
@ifhtml
@html
-partially
+partially
@end html
@end ifhtml
@ifnothtml
@@ -445,7 +445,7 @@ partially
@ifhtml
@html
-partially
+partially
@end html
@end ifhtml
@ifnothtml
@@ -565,7 +565,7 @@ partially
@item
2.1 声楽
@*
-4975
+4977
@tab Yoshiki Sawada
@tab
@tab
@@ -619,7 +619,7 @@ partially
@item
2.3 ãã¬ããã®ç¡ã弦楽å¨
@*
-303
+279
@tab Yoshiki Sawada
@tab
@tab
@@ -636,7 +636,7 @@ partially
@ifhtml
@html
-partially
+partially
@end html
@end ifhtml
@ifnothtml
@@ -646,7 +646,7 @@ partially
@item
2.4 ãã¬ããã®ãã弦楽å¨
@*
-2820
+2821
@tab Yoshiki Sawada
@tab
@tab
@@ -690,7 +690,7 @@ partially
@ifhtml
@html
-partially
+partially
@end html
@end ifhtml
@ifnothtml
@@ -727,7 +727,7 @@ partially
@item
2.7 åé³è¨èæ³
@*
-1931
+1979
@tab Yoshiki Sawada
@tab
@tab
@@ -744,7 +744,7 @@ partially
@ifhtml
@html
-partially
+partially
@end html
@end ifhtml
@ifnothtml
@@ -808,24 +808,24 @@ partially
@item
3 å
¥åºåå
¨è¬
@*
-12704
+12824
@tab Yoshiki Sawada
@tab
@tab
@ifhtml
@html
-ä¸é¨ (94 %)
+ä¸é¨ (95 %)
@end html
@end ifhtml
@ifnothtml
-ä¸é¨ (94 %)
+ä¸é¨ (95 %)
@end ifnothtml
@tab
@ifhtml
@html
-partially
+partially
@end html
@end ifhtml
@ifnothtml
@@ -852,7 +852,7 @@ partially
@ifhtml
@html
-partially
+partially
@end html
@end ifhtml
@ifnothtml
@@ -862,7 +862,7 @@ partially
@item
5 ããã©ã«ããå¤æ´ãã
@*
-15598
+15597
@tab Yoshiki Sawada
@tab
@tab
@@ -879,7 +879,7 @@ partially
@ifhtml
@html
-partially
+partially
@end html
@end ifhtml
@ifnothtml
@@ -957,7 +957,7 @@ Yoshiki Sawada
@item
LilyPond --- \TITLE\
@*
-1139
+1138
@tab Masamichi Hosoda
@*
Yoshiki Sawada
@@ -1113,7 +1113,7 @@ partially
@ifhtml
@html
-partially
+partially
@end html
@end ifhtml
@ifnothtml
@@ -1166,7 +1166,7 @@ Yoshinobu Ishizaki
@item
LilyPond --- \TITLE\
@*
-1139
+1138
@tab Masamichi Hosoda
@*
Yoshiki Sawada
diff --git a/Documentation/ja/usage/running.itely b/Documentation/ja/usage/running.itely
index 980d2a5cf0..c0bfd3f1ef 100644
--- a/Documentation/ja/usage/running.itely
+++ b/Documentation/ja/usage/running.itely
@@ -184,7 +184,7 @@ forfiles /s /p "C:\Documents\My Scores" /M *.ly /c "cmd /c lilypond @@file"
@node LilyPond ã®åºæ¬çãªã³ãã³ã ã©ã¤ã³ ãªãã·ã§ã³
-@unnumberedsubsec Lilypond ã®åºæ¬çãªã³ãã³ã ã©ã¤ã³ ãªãã·ã§ã³
+@unnumberedsubsec LilyPond ã®åºæ¬çãªã³ãã³ã ã©ã¤ã³ ãªãã·ã§ã³
@translationof Basic command line options for LilyPond
@cindex Invoking @command{lilypond} (@command{lilypond} ãå¼ã³åºã)
diff --git a/Documentation/ja/web/introduction.itexi b/Documentation/ja/web/introduction.itexi
index 7fa0d615ae..ba880085f0 100644
--- a/Documentation/ja/web/introduction.itexi
+++ b/Documentation/ja/web/introduction.itexi
@@ -298,7 +298,7 @@ LilyPond ã使ã£ããªã³ã©ã¤ã³ãã¼ã«ãããã¤ãããã¾ãã
LilyPond ã¯ä¸è¬çãªãã©ãããã©ã¼ã å
¨ã¦
(GNU/Linux, MacOS, ãã㦠Windows) ã§åãã¾ãã@c
LilyPond ã«ã¯åºç¯å²ã®ããã¥ã¡ã³ãã¨æ°ç¾ã®å®ä¾ãã¡ã¤ã«ãä»å±ãã¾ãã@c
-Lilypond ã¦ã¼ã¶ã¼ ã¡ã¼ãªã³ã° ãªã¹ãã§è³ªåã«çãã¦ããã@c
+LilyPond ã¦ã¼ã¶ã¼ ã¡ã¼ãªã³ã° ãªã¹ãã§è³ªåã«çãã¦ããã@c
æ´»çºãªã¦ã¼ã¶ ã³ãã¥ããã£ãããã¾ãã@c
éçºãã¼ã ã¯åé¡ãæ©æã«è§£æ±ºãããããæ´»åãã¦ãã¾ãã@c
é常ã¯ããã«åçãããã¾ããããã°ãã°å ±åãããåé¡ã«å¯¾ãã@c
@@ -452,7 +452,7 @@ LilyPond ã¯èæãããªãã©ã¾ã§ãã¹ã¦ã®ç¨®é¡ã®å£°æ¥½ã«å¯¾ãã¦
å°ãå¤ãã£ãè¦æ±ãããä¸ä¸ã®ã¢ãããã示ãã¾ãã@c
ããã¼ ãã¤ã¹ã®æåã¯ä»ã¨ç°ãªãã¾ããã@c
åãæåã§ãããã®ããã«æã£ã¦ãã¾ãã@c
-Lilypond ã¯ããããã£ããã¨å¦çãã¾ã
+LilyPond ã¯ããããã£ããã¨å¦çãã¾ã
ã´ã¡ãã«ã³æ§å¼ã®é³é¨è¨å·ããããã®ããé³ç¬¦ã表ãã¹ã©ãã·ã¥ä»ãã®@c
符幹ãããç¹å®ã®é³ç¬¦ã°ã«ã¼ãä¸ã®é£çµç·ã«ã«ã注ç®ãã¦ãã ããã
@@ -1022,7 +1022,7 @@ LilyPond ããã¹ãã¼ãã使ãæããè¦æ ãã«ããã¦ã
@qq{[..æåã®ãªã¼ã±ã¹ãã©ãªãã¼ãµã«ã®å¾ã§] ç§ã¯æ¥½èã®åºæ¥ã«ã¤ãã¦@c
ããããã®è³è¾ãããã ãã¾ããã@c
éè¦ãªã®ã¯ã@c
-Lilypondã«ã¯æ¥½èã®è¦æ ããããè¯ãããããã®æ°å¤ãã®æ¹æ³ãããã®ã§ããã@c
+LilyPondã«ã¯æ¥½èã®è¦æ ããããè¯ãããããã®æ°å¤ãã®æ¹æ³ãããã®ã§ããã@c
ç§ããªã¼ã±ã¹ãã©ã«æ¸¡ããã®ã¯@c
åºæ¬çã«çã®ããã®ã¾ã¾ã®åºåçµæã ã£ãã¨ãããã¨ã§ãã}
@divEnd
@@ -1032,10 +1032,10 @@ Lilypondã«ã¯æ¥½èã®è¦æ ããããè¯ãããããã®æ°å¤ãã®æ¹æ³
@subsubheading Kieren MacMillan, ä½æ²å®¶ (ã«ãã ããã³ã)
@qq{ãã®ç´ æ´ãããä»äºãããéçºãã¼ã ã«æè¬ã¨è³è¾ã®æãã@c
-Lilypondã§å¾ãããçµæã«è¿ãç©ã¯ä»ã§ã¯ããã¾ãã
+LilyPondã§å¾ãããçµæã«è¿ãç©ã¯ä»ã§ã¯ããã¾ãã
-- ãã®å大ãªã¢ããªã±ã¼ã·ã§ã³ã¯ãç§ã®æ¥½èåºçã®å¿
è¦æ§ã«å¯¾ãã¦ã@c
æå¾
以ä¸ã®çµæãééããªãããããã¦ããã¾ãã@c
-[..] åºæ¬çã«ãããã£ã¦ããªã Lilypond ã®åºå㯠[..]
+[..] åºæ¬çã«ãããã£ã¦ããªã LilyPond ã®åºå㯠[..]
ç§ãæ¯è¼ããæè¿ã® @q{ãã} ã®åºçç©
(Warner Bros. ã®æ¥½èããããã @q{èè} ã®æè¿ã®æ¥½èã®å¤§å¤æ°)
ãããè¯ãã§ãã[..]}
diff --git a/Documentation/learning/tweaks.itely b/Documentation/learning/tweaks.itely
index 001f4136a3..b014ee5b47 100644
--- a/Documentation/learning/tweaks.itely
+++ b/Documentation/learning/tweaks.itely
@@ -692,9 +692,9 @@ through them looking for a property that might control the heaviness of
slurs, and you should find
@example
-@code{thickness} (number)
- @code{1.2}
- Line thickness, generally measured in @code{line-thickness}
+thickness (number)
+ 1.2
+ Line thickness, generally measured in line-thickness
@end example
This looks a good bet to change the heaviness. It tells us that
@@ -2054,7 +2054,7 @@ individual notes in a chord is possible by using the
command is:
@example
-@code{\set fingeringOrientations = #'([up] [left/right] [down])}
+\set fingeringOrientations = #'([up] [left/right] [down])
@end example
@noindent
@@ -4066,11 +4066,11 @@ themselves prevents their use in simple variables. As an
alternative can we use @code{\override} and @code{\revert} commands?
@example
-@code{\override Lyrics.LyricText.font-shape = #'italic}
-@code{\override Lyrics.LyricText.font-series = #'bold}
+\override Lyrics.LyricText.font-shape = #'italic
+\override Lyrics.LyricText.font-series = #'bold
-@code{\revert Lyrics.LyricText.font-shape}
-@code{\revert Lyrics.LyricText.font-series}
+\revert Lyrics.LyricText.font-shape
+\revert Lyrics.LyricText.font-series
@end example
These would also be extremely tedious to enter if there were many
diff --git a/Documentation/lilypond-texi2html.init b/Documentation/lilypond-texi2html.init
index 9cb5772de4..b6970ac606 100644
--- a/Documentation/lilypond-texi2html.init
+++ b/Documentation/lilypond-texi2html.init
@@ -94,8 +94,8 @@ use Encode qw(decode);
my $LY_LANGUAGES = {};
$LY_LANGUAGES->{'ca'} = {
- 'Back to Documentation Index' => '',
- 'Grà cies a ${webdev_link} per allotjar ${lily_site}.' => '',
+ 'Back to Documentation Index' => 'Torna a l\'Ãndex de la documentació',
+ '
Thanks to ${webdev_link} for hosting ${lily_site}.' => '
Agraïm a ${webdev_link} l\'allotjament de ${lily_site}.',
};
$LY_LANGUAGES->{'cs'} = {
@@ -147,6 +147,141 @@ $LY_LANGUAGES->{'zh'} = {
# FIXME: request the translations below then send them to texi2html/texinfo devs
+$LANGUAGES->{'ca'} = {
+ ' The buttons in the navigation panels have the following meaning:' => ' Els botons als panells de navegació tenen els significats següents:',
+ ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => ' on l\'@strong{exemple} suposa que la posició actual és a la @strong{ Subsubsecció U-Dos-Tres } d\'un document a l\'estructura següent:',
+ ' Up ' => ' Amunt ',
+ '(outside of any element)' => '(fora de qualsevol element)',
+ '(outside of any node)' => '(fora de qualsevol node)',
+ '@b{{quotation_arg}:} ' => '@b{{quotation_arg}:} ',
+ '@cite{{book}}' => '@cite{{book}}',
+ '@{No value for `{value}\'@}' => '@{Cap valor per a `{value}\'@}',
+ 'About' => 'Quant a',
+ 'About (help)' => 'Quant a (ajuda)',
+ 'About This Document' => 'Quant a aquest document',
+ 'April' => 'Abril',
+ 'August' => 'Agost',
+ 'Back' => 'Enrere',
+ 'Back section in previous file' => 'Secció enrere al fitxer previ',
+ 'Beginning of this chapter or previous chapter' => 'Inici d\'aquest capÃtol o capÃtul previ',
+ 'Button' => 'Botó',
+ 'Contents' => 'Continguts',
+ 'Cover (top) of document' => 'Portada (part superior) del document',
+ 'Current' => 'Actual',
+ 'Current Position' => 'Posició actual',
+ 'Current section' => 'Secció actual',
+ 'December' => 'Desembre',
+ 'FastBack' => 'Enrere rà pid',
+ 'FastForward' => 'Endavant rà pid',
+ 'February' => 'Febrer',
+ 'First' => 'Primera',
+ 'First section in reading order' => 'Primera secció en ordre de lectura',
+ 'Following' => 'Següent',
+ 'Following node' => 'Node següent',
+ 'Footnotes' => 'Notes a peu de pà gina',
+ 'Forward' => 'Endavant',
+ 'Forward section in next file' => 'Secció següent al fitxer següent',
+ 'From 1.2.3 go to' => 'De 1.2.3 ves a',
+ 'Go to' => 'Ves a',
+ 'Index' => 'Ãndex',
+ 'Index Entry' => 'Entrada de l\'Ãndex',
+ 'January' => 'Gener',
+ 'July' => 'Juliol',
+ 'Jump to' => 'Salta a',
+ 'June' => 'June',
+ 'Last' => 'Ãltima',
+ 'Last section in reading order' => 'Ãltima secció en ordre de lectura',
+ 'March' => 'Març',
+ 'May' => 'Maig',
+ 'Menu:' => 'Menú',
+ 'Name' => 'Nom',
+ 'Next' => 'Següent',
+ 'Next chapter' => 'CapÃtol segúent',
+ 'Next file' => 'Fitxer següent',
+ 'Next node' => 'Node següent',
+ 'Next section in reading order' => 'Secció següent en ordre de lectura',
+ 'Next section on same level' => 'Secció següent al mateix nivell',
+ 'NextFile' => 'Fitxer següent',
+ 'Node following in node reading order' => 'Node següent en ordre de lectura',
+ 'Node up' => 'Node amunt',
+ 'NodeNext' => 'Node següent',
+ 'NodePrev' => 'Node anterior',
+ 'NodeUp' => 'Node superior',
+ 'November' => 'Novembre',
+ 'October' => 'Octubre',
+ 'Overview' => 'Panorà mica',
+ 'Prev' => 'Previ',
+ 'PrevFile' => 'Fitxer previ',
+ 'Previous' => 'Anterior',
+ 'Previous file' => 'Fitxer anterior',
+ 'Previous node' => 'Node anterior',
+ 'Previous section in reading order' => 'Secció anterior en ordre de lectura',
+ 'Previous section on same level' => 'Secció prèvia al mateix nivell',
+ 'Section' => 'Secció',
+ 'Section One' => 'Secció u',
+ 'See ' => 'Vegeu',
+ 'See @cite{{book}}' => 'Vegeu @cite{{book}}',
+ 'See section `@asis{}`{section_name}\'@asis{}\' in @cite{{book}}' => 'Vegeu la secció `@asis{}`{section_name}\'@asis{}\' a @cite{{book}}',
+ 'See section `{section}\' in @cite{{book}}' => 'Vegeu la secció `{section}\' a @cite{{book}}',
+ 'See section {reference_name}' => 'Vegeu la secció {reference_name}',
+ 'See {node_file_href}' => 'Vegeu {node_file_href}',
+ 'See {node_file_href} @cite{{book}}' => 'Vegeu {node_file_href} @cite{{book}}',
+ 'See {node_file_href} section `{section}\' in @cite{{book}}' => 'Vegeu {node_file_href} a la secció `{section}\' a @cite{{book}}',
+ 'See {reference_name}' => 'Vegeu {reference_name}',
+ 'See {ref}' => 'Vegeu {ref}',
+ 'See {title_ref}' => 'Vegeu {title_ref}',
+ 'September' => 'Setembre',
+ 'Short Table of Contents' => 'Ãndex brevu',
+ 'Short table of contents' => 'Ãndex breu',
+ 'Subsection One-Four' => 'Subsecció U-Quatre',
+ 'Subsection One-One' => 'Subsecció U-U',
+ 'Subsection One-Three' => 'Subsecció U-Tres',
+ 'Subsection One-Two' => 'Subsecció U-Dos',
+ 'Subsubsection One-Two-Four' => 'Subsubseció U-Dos-Quatre',
+ 'Subsubsection One-Two-One' => 'Subsubsecció U-Dos-U',
+ 'Subsubsection One-Two-Three' => 'Subsubsecció U-Dos-Tres',
+ 'Subsubsection One-Two-Two' => 'Subsubsecció U-Dos-Dos',
+ 'T2H_today' => '%s, %d %d',
+ 'Table of Contents' => 'Ãndex',
+ 'Table of contents' => 'Ãndex',
+ 'The node you are looking for is at {href}.' => 'El node que esteu buscant és {href}',
+ 'This' => 'Aquest',
+ 'This document was generated on @i{{date}} using @uref{{program_homepage}, @i{{program}}}.' => 'Aquest document s\'ha generat el @i{{date}} amb @uref{{program_homepage}, @i{{program}}}.',
+ 'This document was generated using @uref{{program_homepage}, @emph{{program}}}.' => 'Aquest document sha generat amb @uref{{program_homepage}, @emph{{program}}}.',
+ 'Top' => 'Inici',
+ 'Untitled Document' => 'Document sense tÃtol',
+ 'Up' => 'Amunt',
+ 'Up node' => 'Node superior',
+ 'Up section' => 'Secció supeior',
+ 'current' => 'actual',
+ 'on @emph{{date}}' => 'el @emph{{date}}',
+ 'section `@asis{}`{section_name}\'@asis{}\' in @cite{{book}}' => 'secció `@asis{}`{section_name}\'@asis{}\' a @cite{{book}}',
+ 'section `{section}\' in @cite{{book}}' => 'secció `{section}\' a @cite{{book}}',
+ 'see ' => 'vegeu ',
+ 'see @cite{{book}}' => 'vegeu @cite{{book}}',
+ 'see section `@asis{}`{section_name}\'@asis{}\' in @cite{{book}}' => 'vegeu la secció `@asis{}`{section_name}\'@asis{}\' a @cite{{book}}',
+ 'see section `{section}\' in @cite{{book}}' => 'vegeu la secció `{section}\' a @cite{{book}}',
+ 'see section {reference_name}' => 'vegeu la secció {reference_name}',
+ 'see {node_file_href}' => 'vegeu {node_file_href}',
+ 'see {node_file_href} @cite{{book}}' => 'vegeu {node_file_href} @cite{{book}}',
+ 'see {node_file_href} section `{section}\' in @cite{{book}}' => 'vegeu {node_file_href} a la secció `{section}\' a @cite{{book}}',
+ 'see {reference_name}' => 'vegeu {reference_name}',
+ 'see {ref}' => 'vegeu {ref}',
+ 'see {title_ref}' => 'vegeu {title_ref}',
+ '{acronym_like} ({explanation})' => '{acronym_like} ({explanation})',
+ '{name} of {class}' => '{name} de {class}',
+ '{name} on {class}' => '{name} a {class}',
+ '{node_file_href}' => '{node_file_href}',
+ '{node_file_href} @cite{{book}}' => '{node_file_href} @cite{{book}}',
+ '{node_file_href} section `{section}\' in @cite{{book}}' => '{node_file_href} a la secció `{section}\' a @cite{{book}}',
+ '{reference_name}' => '{reference_name}',
+ '{ref}' => '{ref}',
+ '{style} {number}' => '{style} {number}',
+ '{style}: {caption_first_line}' => '{style}: {caption_first_line}',
+ '{style}: {shortcaption_first_line}' => '{style}: {shortcaption_first_line}',
+ '{title_ref}' => '{title_ref}'
+ };
+
$LANGUAGES->{'it'} = {
' The buttons in the navigation panels have the following meaning:' => ' I bottoni nei pannelli di navigazione hanno il seguente significato:',
' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => ' dove @strong{ Esempio } assume che l\'attuale posizione è alla @strong{ Sottosottosezione Uno-Due-Tre } di un documento che ha la seguente struttura:',
diff --git a/Documentation/ly-examples/orchestra.ly b/Documentation/ly-examples/orchestra.ly
index 7654521ebb..20dad7f93f 100644
--- a/Documentation/ly-examples/orchestra.ly
+++ b/Documentation/ly-examples/orchestra.ly
@@ -1,4 +1,4 @@
-\version "2.19.21"
+\version "2.19.46"
\header {
tagline = ##f
@@ -85,7 +85,6 @@ offCr = {
\context {
\type "Engraver_group"
\name "MarkLine"
- \consists "Output_property_engraver"
\consists "Axis_group_engraver"
\consists "Mark_engraver"
\consists "Metronome_mark_engraver"
diff --git a/Documentation/macros.itexi b/Documentation/macros.itexi
index 6e567a56d5..cc09619dcc 100644
--- a/Documentation/macros.itexi
+++ b/Documentation/macros.itexi
@@ -186,16 +186,20 @@ For LilyPond version @version{}
@c it doesn't matter, but a future implementation will probably
@c add some code which needs this restriction.
+@c @raggedright can be enabled as soon as texinfo 5.x or larger
+@c is in use for Gub and LilyDev 3.
+
@macro predefined
@noindent
@subsubheading Predefined commands
+@c @raggedright
@end macro
@c Due to a bug in texi2html (texi2html.pl CVS versions <= 1.245)
@c the next macro must not be empty.
@macro endpredefined
-@c
+@c @end raggedright
@end macro
diff --git a/Documentation/misc/announce-v2.12.ca.html b/Documentation/misc/announce-v2.12.ca.html
new file mode 100644
index 0000000000..df4fbba3d7
--- /dev/null
+++ b/Documentation/misc/announce-v2.12.ca.html
@@ -0,0 +1,122 @@
+
+
+
Está disponible LilyPond 2.12 “Rune”
+
+Ya está disponible LilyPond versión 2.12: la edición del duodécimo aniversario
+
+Diciembre de 2008.
+
+Nos llena de orgullo anunciar el lanzamiento de GNU/LilyPond 2.12
+“Rune”.
+
+
+Nuestra alegrÃa está teñida de tristeza, pues el que fue durante
+mucho tiempo colaborador del proyecto LilyPond y amigo, Rune Zedeler,
+falleció el pasado 2 de julio de 2008. Esta edición está dedicada a su
+memoria.
+
+
+Rune era programador y músico, e hizo valiosos aportes a
+LilyPond. HabÃa estado implicado en el proyecto durante los últimos
+seis años, y nuestra comunidad le echará de menos con gran añoranza.
+
+
+Principales novedades
+
+
+- Se ha mejorado enormemente la detección de colisiones. Los objetos
+fuera del pentagrama ahora se evitan automáticamente, de forma que se
+necesitan muchos menos ajustes manuales para obtener un resultado
+satisfactorio.
+
+- La documentación también se ha reescrito casi por completo durante
+ el "Proyecto Magno de Documentación" (GDP) que ha durado un año, y la
+ documentación en lÃnea es ahora mucho más atractiva visualmente y
+ también se navega por ella mucho más fácilmente. El programa está
+ traducido a 6 idiomas, y la documentación completa está disponible
+ en español, y parcialmente en francés y alemán. ¡Nunca ha sido tan
+ fácil empezar con 'Pond!
+
+- Se han incorporado casi 30 nuevas funcionalidades, entre ellas los
+ diagramas transportables de posiciones de guitarra, alteraciones
+ microtonales y un conversor musicxml2ly muy mejorado, y se han
+ corregido casi 200 bugs. Para ver los detalles de estas nuevas
+ posibilidades, dirÃjase
+ a http://lilypond.org/doc/v2.12/Documentation/topdocs/NEWS.html.
+
+
+
+
+¡Feliz tipografÃa musical!
+
+LilyPond le llega por cortesÃa de...
+
+Equipo de desarrollo
+
+Han-Wen Nienhuys – Desarrollos esenciales
+Jan Nieuwenhuizen – Desarrollos esenciales
+Joe Neeman – Desarrollos esenciales
+Graham Percival – Editor de la documentación y Maestro desinsectador
+Valentin Villenave – Editor del repositorio LSR y Maestro desinsectador
+Mats Bengtsson – Gurú de apoyo
+John Mandereau – Maestro de la infraestructura de traducción
+
+Colaboradores
+
+Rune Zedeler,
+Maximilian Albert,
+Milan Zamazal,
+Reinhold Kainhofer (desarrollo de musicxml2ly),
+Erlend Aasland,
+Stan Sanderson (revisor de las regresiones),
+Neil Puttock.
+
+Proyecto Magno de Documentación
+
+Trevor Daniels – Editor adjunto de la documentación
+Andrew Hawryluk, Carl Sorensen, Eyolf Ãstrem, Francisco Vila,
+Jay Hamilton, Jonathan Kulp, Joseph Harfouch, Patrick McCarty,
+Ralph Palmer, Till Rettig – trabajos en la Referencia de la Notación
+Kurt Kroon – Actualizaciones del glosario, trabajos en la Referencia de la Notación
+Alard de Boer – Formato
+Michael Rasmussen – Formato
+Trevor BaÄa – Encabezamientos evocadores
+Reinhold Kainhofer – Asistencia técnica
+Neil Puttock – Editor de fragmentos de código, asistencia técnica.
+
+Traductores
+
+Clytie Siddall, Damien Heurtebise, Francisco Vila, Heikki Junes,
+Jean-Charles Malahieude, John Mandereau, Nicolas Klutchnikoff, Till
+Rettig, Valentin Villenave.
+
+Patrocinadores
+
+Mike Amundsen, Trevor BaÄa.
+
+Cazadores de fallos; sugerencias
+
+Adam James Wilson, Alard de Boer, Alex Rolex, Andy Haupt, Arvid
+Grøtting, Bertalan Fodor, Benjamin Drung, Cameron Horsburgh, Carl
+Sorensen, Christian Hitz, Christian Herzberg, David Bobroff, David
+Griffel, Daniel Hulme, Daniel Johnson, Dominic Neumann, Eduardo
+Vieira, Frédéric Chiasson, Georg Dummer, Georg Romstorfer, Gilles
+Thibault, Hernán J. González, Hu Haipeng, Jay Anderson, James
+Kilfinger, Jean-Marie Mouchel, Jean-Yves Baudais, Jesús Guillermo
+Andrade, Jonathan Henkelman, Kazuhiro Suzuki, Kevin Dalley, Laura
+Conrad, Luc Wehli, Maarten Hijzelendoorn, Marc Lanoiselée, Mark
+Polesky, Matthijs Frankeno, Martijn Vromans, Marnen Laibow-Koser,
+Maximilian Albert, MirosÅaw Doroszewski, Mike Coleman, Neil Puttock,
+Nicolas Mayencourt, Nicolas Sceaux, Orm Finnendahl, Peter Budny,
+Phillip Kirlin, Pierre-Emmanuel Brame, Ralph Palmer, Renaud Flavigny,
+Rick Hansen, Risto Vääräniemi, Robin Bannister, Roland Goretzki, Rune
+Zedeler, Ruud van Silfhout, Sean Reed, Steven Weber, Tomas Sauer,
+Thomas Scharkowski, Trevor BaÄa, Vivian Barty-Taylor, Werner Lemberg,
+Wilbert Berendsen, William Oram, Yota Moteuchi, Zack Charter, and
+Zoltan Selyem.
diff --git a/Documentation/misc/browser-language.ca.html b/Documentation/misc/browser-language.ca.html
new file mode 100644
index 0000000000..84f8bda839
--- /dev/null
+++ b/Documentation/misc/browser-language.ca.html
@@ -0,0 +1,72 @@
+
+
+Ãs de la selecció automà tica de la llengua
+
+
+ Per obtenir la selecció automà tica de la llengua, heu d'indicar-li
+ al navegador quin és la vostra llengua preferida. La forma de fer-lo
+ depèn del navegador que esteu fent servir.
+
+
+
+
+
+
+ - Mozilla Firefox versió 0.9 i posteriors
+ -
+ GNU/Linux
+
+ Edita -> Preferències -> Avançat -> General -> Llengües
+
+
+ -
+ Microsoft Windows
+
+ Eines -> Opcions -> General -> Llengües
+
+ A versions anteriores heu d'anar a about:config i canviar el
+ el valor de intl.accept_languages.
+
+
+ - Mozilla / Netscape 4.x i posteriors
+ -
+
+ Edita -> Preferències -> Navegador -> Llengües
+
+ Nota: amb el Netscape 4.x heu d'assegurar-vos de seleccionar
+ la llengua a partir de les alternatives possibles. Algunes persones
+ han comunicat problemes perquè van entrar la llengua a mà .
+
+
+ - Microsoft Internet Explorer
+ -
+ Microsoft Windows
+
+ Eines (o Vista o Extres) -> Opcions d'Internet -> (General) Llengües
+
+
+ -
+ MacOS
+
+ Edita -> Preferències -> Navegador Web -> Llengua/Fonts
+
+
+
+
+
+Aquesta pà gina està agafada de
+Debian, y como tal, está sujeta a
+
+Copyright © 1997-2005
+SPI; Consulteu els termes de la llicència.
+
+Debian és una marca registrada de Software in the Public Interest, Inc.
diff --git a/Documentation/nl/learning/tweaks.itely b/Documentation/nl/learning/tweaks.itely
index 51bac2fbc2..541e2962b5 100644
--- a/Documentation/nl/learning/tweaks.itely
+++ b/Documentation/nl/learning/tweaks.itely
@@ -601,9 +601,9 @@ through them looking for a property that might control the heaviness of
slurs, and you should find
@example
-@code{thickness} (number)
- @code{1.2}
- Line thickness, generally measured in @code{line-thickness}
+thickness (number)
+ 1.2
+ Line thickness, generally measured in line-thickness
@end example
This looks a good bet to change the heaviness. It tells us that
@@ -1955,7 +1955,7 @@ individual notes in a chord is possible by using the
command is:
@example
-@code{\set fingeringOrientations = #'([up] [left/right] [down])}
+\set fingeringOrientations = #'([up] [left/right] [down])
@end example
@noindent
@@ -3769,11 +3769,11 @@ themselves prevents their use in simple variables. As an
alternative can we use @code{\override} and @code{\revert} commands?
@example
-@code{\override Lyrics.LyricText.font-shape = #'italic}
-@code{\override Lyrics.LyricText.font-series = #'bold}
+\override Lyrics.LyricText.font-shape = #'italic
+\override Lyrics.LyricText.font-series = #'bold
-@code{\revert Lyrics.LyricText.font-shape}
-@code{\revert Lyrics.LyricText.font-series}
+\revert Lyrics.LyricText.font-shape
+\revert Lyrics.LyricText.font-series
@end example
These would also be extremely tedious to enter if there were many
diff --git a/Documentation/nl/translations.itexi b/Documentation/nl/translations.itexi
index 0cfb744377..524b717627 100644
--- a/Documentation/nl/translations.itexi
+++ b/Documentation/nl/translations.itexi
@@ -16,7 +16,7 @@ td { border: 1px solid black; text-align: center; }
@end html
@end ifhtml
-@emph{Meest recente update Sat Jul 2 15:06:05 UTC 2016
+@emph{Meest recente update Sun Aug 7 13:59:13 UTC 2016
}
@multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667
@@ -57,7 +57,7 @@ gedeeltelijk
@item
LilyPond -- \TITLE\
@*
-1139
+1138
@tab Jan Nieuwenhuizen
@tab
@tab
@@ -182,7 +182,7 @@ gedeeltelijk (95 %)
@ifhtml
@html
-gedeeltelijk
+gedeeltelijk
@end html
@end ifhtml
@ifnothtml
@@ -258,7 +258,7 @@ gedeeltelijk
@item
LilyPond -- \TITLE\
@*
-1139
+1138
@tab Jan Nieuwenhuizen
@tab Tineke de Munnik
@tab
diff --git a/Documentation/nl/web/introduction.itexi b/Documentation/nl/web/introduction.itexi
index d45ea1361b..9ba487b72f 100644
--- a/Documentation/nl/web/introduction.itexi
+++ b/Documentation/nl/web/introduction.itexi
@@ -15,7 +15,7 @@
@node Inleiding
@unnumbered Inleiding
@translationof Introduction
-
+
@divClass{column-center-top}
@subheading Ons Doel
@imageFloat{flat-design,png,right}
@@ -211,9 +211,9 @@ actieve gebruikersgroep die antwoorden geeft op de
lilypond-user mailinglijst, terwijl het ontwikkelingsteam
ervoor zorgt dat problemen snel worden opgelost.
-
+
@subsubheading Verbeterde editors
-
+
Verscheidene ontwikkelaars, zelf actieve gebruikers van
LilyPond, hebben ook gereedschappen geschreven die speciaal
bedoeld zijn om het invoeren van LilyPond-bestanden sneller
@@ -228,7 +228,7 @@ vinden in @ref{Eenvoudiger bewerken}.
Nog steeds niet overtuigd? Bekijk dan maar eens enkele
specifieke @ref{Voorbeelden}. Heb je al besloten LilyPond
-te gaan proberen, lees dan eerst over onze
+te gaan proberen, lees dan eerst over onze
@ref{Tekstinvoer}.
@divEnd
@@ -710,7 +710,7 @@ Association}'s jaarblad, legt de Franse componist en LilyPond-bijdrager
Valentin Villenave uit waarom Vrije licenties, en in het bijzonder
LilyPond-gegraveerde partituren, van instrumenteel belang zijn in
het voor iedereen toegankelijk maken van genoteerde muziek.
-
+
@item
februari 2008
@@ -832,7 +832,7 @@ hun gegraveerde versie niet half zo gelikt is als de mijne!}
@qq{Hoewel ik [LilyPond] nog niet zo goed ken, ben ik
@strong{erg} onder de indruk. Ik heb het programma gebruikt
om een motet van Josquin Desprez in te voeren in mensurale
-notatie. Lilypond overtreft zonder twijfel en met gemak
+notatie. LilyPond overtreft zonder twijfel en met gemak
alle andere muzieknotatieprogramma's voor wat betreft
snelheid, gebruiksgemak en schoonheid!}
@divEnd
@@ -843,7 +843,7 @@ snelheid, gebruiksgemak en schoonheid!}
@qq{[..na de eerste orkestrepetitie] kreeg ik heel veel
complimenten over de kwaliteit van de partituren. En wat
-nog veel mooier is: terwijl Lilypond allerlei manieren
+nog veel mooier is: terwijl LilyPond allerlei manieren
biedt om te zorgen dat de partituren er nog mooier uitzien,
kreeg het orkest van mij slechts de ruwe, ongewijzigde
LilyPond-output.}
@@ -853,10 +853,10 @@ LilyPond-output.}
@subsubheading Kieren MacMillan, componist (Toronto, Canada)
@qq{Dank en lof voor het ontwikkelteam voor hun fantastische
werk. Ik heb nog nooit iets gezien wat maar in de buurt
-komt van de output die ik bereik met Lilypond -- Ik ben er
+komt van de output die ik bereik met LilyPond -- Ik ben er
zeker van dat dit fantastische programma aan al mijn
muziekpublicatie-wensen kan voldoen en deze zelfs zal
-overtreffen. [..] hoofdzakelijk pure Lilypond output [..]
+overtreffen. [..] hoofdzakelijk pure LilyPond output [..]
ziet er beter uit dan de meeste recente @q{professionele}
uitgaven waarmee ik het heb vergeleken (q.v., zo ongeveer
elke Warner Bros. partituur, en zelfs een groot deel van de
@@ -902,7 +902,7 @@ enigszins in de buurt kan komen.}
@divClass{testimonial-item}
@subsubheading David Bobroff, bastrombonist, Iceland Symphony Orchestra
-@qq{Ik vind Lilypond fantastisch [..] Hoe beter ik het
+@qq{Ik vind LilyPond fantastisch [..] Hoe beter ik het
programma leer kennen, hoe mooier ik het vind!}
@divEnd
@@ -1128,7 +1128,7 @@ zie @ref{Eenvoudiger bewerken}.
@subheading En nu?
Je bent nu zover om @ref{Download, LilyPond te downloaden}.
-Nog steeds niet overtuigd?
+Nog steeds niet overtuigd?
Lees over @ref{Eenvoudiger bewerken}.
@divEnd
@@ -1360,7 +1360,7 @@ constraint-gebaseerde programmeertaal.
LilyKDE3 voor KDE 3.5 en lilypond-KDE4 voor KDE 4.1.
@item
-@uref{https://sourceforge.net/projects/noteedit.berlios/,NoteEdit}, dat
+@uref{https://sourceforge.net/projects/noteedit.berlios/,NoteEdit}, dat
@uref{http://www.musicxml.com/xml.html,MusicXML} importeerde, is geforkt
in
@uref{http://vsr.informatik.tu-chemnitz.de/staff/jan/nted/nted.xhtml,NtEd}
@@ -1393,7 +1393,7 @@ beschreven in @ref{Achtergrond}.
@subheading Legalese
-@divClass{legal}
+@divClass{legal}
All logos and product images are copyright and trademark
acknowledged.
diff --git a/Documentation/notation/ancient.itely b/Documentation/notation/ancient.itely
index 714584210a..7e44224426 100644
--- a/Documentation/notation/ancient.itely
+++ b/Documentation/notation/ancient.itely
@@ -682,7 +682,7 @@ mensural notation or coloratio sections in white mensural notation.
Because note head style does not influence flag count, in
this style a semiminima should be notated as @code{a8*2}, not
@code{a4}, otherwise it will look like a minima.
-The multiplier can be different if coloratio is used e.g. to notate
+The multiplier can be different if coloratio is used, e.g., to notate
triplets.
Use @code{semipetrucci} style to draw half-colored
@@ -1471,7 +1471,7 @@ with any of the following commands:
@funindex \linea
@code{\linea}.
-@item Ligatures, properly speaking (i.e. notes joined together), are
+@item Ligatures, properly speaking (i.e., notes joined together), are
produced by placing one of the joining commands @code{\pes} or
@code{\flexa}, for upwards and downwards movement, respectively,
@emph{between} the notes to be joined.
@@ -1525,7 +1525,7 @@ Liquescent neumes
Another main category of notes in Gregorian chant is the so-called
liquescent neumes. They are used under certain circumstances at
-the end of a syllable which ends in a @q{liquescent} letter, i.e.
+the end of a syllable which ends in a @q{liquescent} letter, i.e.,
the sounding consonants that can hold a tone (the nasals, l, r, v,
j, and their diphthong equivalents). Thus, the liquescent neumes
are never used alone (although some of them can be produced), and
@@ -1554,7 +1554,7 @@ with the corresponding modifier, @code{\quilisma},
Virtually, within the ligature delimiters @code{\[} and @code{\]},
any number of heads may be accumulated to form a single ligature,
and head prefixes like @code{\pes}, @code{\flexa}, @code{\virga},
-@code{\inclinatum}, etc. may be mixed in as desired. The use of
+@code{\inclinatum}, etc., may be mixed in as desired. The use of
the set of rules that underlies the construction of the ligatures
in the above table is accordingly extrapolated. This way,
infinitely many different ligatures can be created.
@@ -2637,7 +2637,7 @@ typical scenarios are outlined, with suggestions of solutions.
These involve:
@itemize
-@item how to make incipits (i.e. prefatory material to indicate
+@item how to make incipits (i.e., prefatory material to indicate
what the original has looked like) to modern transcriptions of
mensural music;
@item how to achieve the @emph{Mensurstriche} layout frequently
@@ -2697,7 +2697,7 @@ produced. If no instrument name is required then use
@emph{Mensurstriche} (@q{mensuration lines}) is the accepted term
for bar lines that are drawn between the staves of a system but
not through the staves themselves. It is a common way to preserve
-the rhythmic appearance of the original, i.e. not having to break
+the rhythmic appearance of the original, i.e., not having to break
syncopated notes at bar lines, while still providing the
orientation aids that bar lines give.
@@ -2835,7 +2835,7 @@ verba = \lyricmode {
@end lilypond
Another common situation is transcription of neumatic or
-melismatic chants, i.e. chants with a varying number of notes
+melismatic chants, i.e., chants with a varying number of notes
to each syllable. In this case, one would want to set the
syllable groups clearly apart, usually also the subdivisions of a
longer melisma. One way to achieve this is to use a fixed
diff --git a/Documentation/notation/changing-defaults.itely b/Documentation/notation/changing-defaults.itely
index 7cca8e59af..c8f9ebc510 100644
--- a/Documentation/notation/changing-defaults.itely
+++ b/Documentation/notation/changing-defaults.itely
@@ -522,8 +522,8 @@ Notation Reference:
Contexts are usually terminated at the first musical moment in
which they have nothing to do. So @code{Voice} contexts die as
-soon as they contain no events; @code{Staff} contexts die as soon
-as all the @code{Voice} contexts within them contain no events; etc.
+soon as they contain no events, @code{Staff} contexts die as soon
+as all the @code{Voice} contexts within them contain no events, etc.
This can cause difficulties if earlier contexts which have died
have to be referenced, for example, when changing staves with
@code{\change} commands, associating lyrics with a voice with
@@ -1434,7 +1434,7 @@ existing contexts. To reposition it above the context called
@qq{main}, it should be defined like this:
@example
-@code{\new Staff \with @{ alignAboveContext = #"main" @} }
+\new Staff \with @{ alignAboveContext = #"main" @}
@end example
A similar situation arises when positioning a temporary lyrics
@@ -1952,7 +1952,7 @@ the @code{#}@tie{}character.
Contexts properties are usually named in
@code{studlyCaps}. They mostly control the translation from
-music to notation, e.g. @code{localAlterations} (for determining
+music to notation, e.g., @code{localAlterations} (for determining
whether to print accidentals), or @code{measurePosition} (for
determining when to print a bar line). Context properties can
change value over time while interpreting a piece of music;
@@ -2436,7 +2436,7 @@ a context will still show the values of their respective parent's
context.
The lifetime and value of a context property is dynamic and only
-available when music is being interpreted (i.e. @q{iterated}). At the
+available when music is being interpreted (i.e., @q{iterated}). At the
time of the context's creation, properties are initialized from its
corresponding definitions (along with any other modifications) of that
context. Any subsequent changes are achieved with any
@@ -2467,7 +2467,7 @@ own grob definition.
Grob definitions are accessed with a different set of commands and are
manipulated using @code{\override} and @code{\revert} and have a name
-starting with a capital letter (e.g. @samp{NoteHead}); whereas normal
+starting with a capital letter (e.g., @samp{NoteHead}); whereas normal
context properties are manipulated using @code{\set} and @code{\unset}
and are named starting with a lowercase letter.
@@ -2715,7 +2715,7 @@ be desirable to force a particular direction or placement.
@node Articulation direction indicators
@unnumberedsubsubsec Articulation direction indicators
-By default some directions are always up or always down (e.g.
+By default some directions are always up or always down (e.g.,
dynamics or fermata), while other things can alternate between
up or down based on the stem direction (like slurs or accents).
@@ -2732,9 +2732,9 @@ but a direction indicator is @strong{always} required before
@item @code{\tweak} commands
@item @code{\markup} commands
@item @code{\tag} commands
-@item string markups, e.g. -"string"
-@item fingering instructions, e.g. @w{@code{-1}}
-@item articulation shortcuts, e.g. @w{@code{-.}}, @w{@code{->}}, @w{@code{--}}
+@item string markups, e.g., -"string"
+@item fingering instructions, e.g., @w{@code{-1}}
+@item articulation shortcuts, e.g., @w{@code{-.}}, @w{@code{->}}, @w{@code{--}}
@end itemize
Direction indicators affect only the next note:
@@ -2764,7 +2764,7 @@ Alternatively, in many cases predefined commands exist to specify the
direction. These are of the form
@example
-@code{\xxxUp}, @code{\xxxDown} or @code{\xxxNeutral}
+\xxxUp, \xxxDown or \xxxNeutral
@end example
@noindent
@@ -3505,7 +3505,7 @@ to print them and @code{all-invisible} to suppress them.
The @code{break-visibility} property controls the visibility of
key signatures and changes of clef only at the start of lines,
-i.e. after a break. It has no effect on the visibility of the
+i.e., after a break. It has no effect on the visibility of the
key signature or clef following an explicit key change or an
explicit clef change within or at the end of a line. In the
following example the key signature following the explicit change
@@ -4146,7 +4146,7 @@ The VerticalAlignment and VerticalAxisGroup grobs work together.
VerticalAxisGroup groups together different grobs like Staff, Lyrics,
etc. VerticalAlignment then vertically aligns the different grobs
grouped together by VerticalAxisGroup. There is usually only one
-VerticalAlignment per score but every Staff, Lyrics, etc. has its own
+VerticalAlignment per score but every Staff, Lyrics, etc., has its own
VerticalAxisGroup.
@@ -4281,7 +4281,7 @@ the collisions to be avoided.
The syntax of @code{\shape} is
@example
-[-]@code{\shape} @var{displacements} @var{item}
+[-]\shape @var{displacements} @var{item}
@end example
This will reposition the control-points of @var{item} by the amounts
@@ -4483,7 +4483,7 @@ or a @code{\tweak} of a spanner property.
The syntax for @code{\alterBroken} is
@example
-[-]@code{\alterBroken} @var{property} @var{values} @var{item}
+[-]\alterBroken @var{property} @var{values} @var{item}
@end example
The argument @var{values} is a list of values, one for each
@@ -4546,7 +4546,7 @@ layout. Settings chosen for @code{\alterBroken} may be unsuitable
for a spanner that is no longer broken or is split into more
segments than before. Explicit use of @code{\break} can guard
against this situation.
-
+
The @code{\alterBroken} command is ineffective for spanner
properties accessed before line-breaking such as
@code{direction}.
@@ -4567,7 +4567,7 @@ Extending LilyPond:
Unpure-pure containers are useful for overriding @emph{Y-axis} spacing
calculations - specifically @code{Y-offset} and @code{Y-extent} - with a
-Scheme function instead of a literal (i.e. a number or pair).
+Scheme function instead of a literal (i.e., a number or pair).
For certain grobs, the @code{Y-extent} is based on the @code{stencil}
property, overriding the stencil property of one of these will
@@ -4712,7 +4712,7 @@ must return @code{#t}.
@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
+LilyPond constructs are allowed) or @code{#} (to use it as a Scheme
value or music function argument or music inside of music lists) to
reference arguments
(eg. @samp{#arg1}).
@@ -4743,7 +4743,7 @@ are also allowed.
Notation Reference:
@ref{Predefined type predicates}.
-Extending Lilypond:
+Extending LilyPond:
@rextend{Music functions}.
Installed Files:
diff --git a/Documentation/notation/chords.itely b/Documentation/notation/chords.itely
index 7e2e1e3544..acc8f14f9d 100644
--- a/Documentation/notation/chords.itely
+++ b/Documentation/notation/chords.itely
@@ -848,11 +848,16 @@ In figure mode, a group of bass figures is delimited by
@end lilypond
-Accidentals (including naturals) can be added to figures:
+Accidentals (including naturals) may be used for modifying scale steps.
+These are entered by appending @code{+} (for sharps), @code{-} (for flats)
+or @code{!} (for naturals) after the number. For double accidentals the
+modifier is applied twice. For the modification of the third step the
+number is often omitted, which can be achieved by using @code{_} instead
+of a number.
@lilypond[verbatim,quote,ragged-right]
\figures {
- <7! 6+ 4-> <5++> <3-->
+ <7! 6+ 4-> <5++> <3--> < _+ > < 7 _!>
}
@end lilypond
@@ -873,11 +878,11 @@ sixth steps) can be created:
}
@end lilypond
-Vertical spaces and brackets can be included in figures:
+Brackets can be included in figures:
@lilypond[verbatim,quote,ragged-right]
\figures {
- <[12 _!] 8 [6 4]>
+ <[12] 8 [6 4]>
}
@end lilypond
diff --git a/Documentation/notation/contemporary.itely b/Documentation/notation/contemporary.itely
index 665a847d7f..8a0466903b 100644
--- a/Documentation/notation/contemporary.itely
+++ b/Documentation/notation/contemporary.itely
@@ -142,7 +142,7 @@ addressed in @ref{Grouping staves}.
@unnumberedsubsubsec Extended polymetric notation
@ignore
- Extended examples e.g. different instruments
+ Extended examples e.g., different instruments
or ensembles with independent tempi
@end ignore
diff --git a/Documentation/notation/editorial.itely b/Documentation/notation/editorial.itely
index e329810ae5..b1fbb8b1c9 100644
--- a/Documentation/notation/editorial.itely
+++ b/Documentation/notation/editorial.itely
@@ -270,7 +270,7 @@ The following shorthand commands are also available:
Font size changes are achieved by scaling the design size that is
closest to the desired size. The standard font size (for
@w{@code{font-size = 0}}) depends on the standard staff height.
-For a 20pt staff, a 11pt font is selected.
+For a 20pt staff, an 11pt font is selected.
@predefined
@@ -350,7 +350,7 @@ Markup texts or strings may be used for finger changes.
@funindex \thumb
-A thumb-script can be added (e.g. cello music) to indicate
+A thumb-script can be added (e.g., cello music) to indicate
that a note should be played with the thumb.
@lilypond[verbatim,quote]
diff --git a/Documentation/notation/expressive.itely b/Documentation/notation/expressive.itely
index defe8ad946..3c249389c2 100644
--- a/Documentation/notation/expressive.itely
+++ b/Documentation/notation/expressive.itely
@@ -304,7 +304,7 @@ or @notation{decrescendo} mark, it will end at the centre of the note
that has the next @code{\<} or @code{\>} assigned to it. The next
hairpin will then start at the right edge of the same note
instead of the usual left edge had it been terminated with @code{\!}
-before.
+before. A hairpin ending on a downbeat will stop at the preceding bar line.
@lilypond[verbatim,quote]
\relative {
@@ -446,6 +446,8 @@ items such as text scripts, text spanners, and piano pedal marks.
@snippets
+@cindex hairpins at bar lines
+
@lilypondfile[verbatim,quote,texidoc,doctitle]
{setting-hairpin-behavior-at-bar-lines.ly}
@@ -683,7 +685,8 @@ occurences of outer slurs actually indicate phrasing, and phrasing
slurs may overlap a regular slur, see @ref{Phrasing slurs}. When
multiple regular slurs are needed in a single @code{Voice},
matching slur starts and ends need to be labelled by preceding
-them with @code{\=} followed by an identifying number or string.
+them with @code{\=} followed by an identifying key (a symbol or
+non-negative integer).
@lilypond[verbatim,quote]
\fixed c' {
@@ -1224,7 +1227,7 @@ information, see @ref{Ties}.
@code{\arpeggioArrowDown},
@code{\arpeggioNormal},
@code{\arpeggioBracket},
-@code{\arpeggioParenthesis}
+@code{\arpeggioParenthesis},
@code{\arpeggioParenthesisDashed}.
@endpredefined
diff --git a/Documentation/notation/fretted-strings.itely b/Documentation/notation/fretted-strings.itely
index a69f678735..5a7676d646 100644
--- a/Documentation/notation/fretted-strings.itely
+++ b/Documentation/notation/fretted-strings.itely
@@ -194,7 +194,7 @@ calligraphic tablature clef is added automatically.
@end lilypond
Default tablatures do not contain any symbols for tone duration nor any
-other musical symbols such as e.g. expressive marks.
+other musical symbols such as expressive marks, for example.
@lilypond[quote,ragged-right,verbatim]
symbols = {
@@ -668,7 +668,7 @@ one for each string, ordered by string number from 1 to N,
where string 1 is at the top of the tablature staff and
string N is at the bottom. This ordinarily results in ordering
from highest pitch to lowest pitch, but some instruments
-(e.g. ukulele) do not have strings ordered by pitch.
+(e.g., ukulele) do not have strings ordered by pitch.
A string pitch in a string tuning list is a LilyPond pitch
object. Pitch objects are created with the Scheme function
@@ -1825,7 +1825,7 @@ music = \relative {
Another playing technique (especially used on electric guitars) is
called @notation{palm mute}. The string is hereby partly muted by the
-palm of the striking hand (hence the name). Lilypond supports
+palm of the striking hand (hence the name). LilyPond supports
the notation of palm mute-style notes by changing the note head to a
triangle shape.
@@ -2019,7 +2019,7 @@ LilyPond supports tablature for lute.
To get additional bass strings use @code{additionalBassStrings}, where the
pitches of those strings are set. They will be printed below lowest line as:
-a, /a, //a, ///a, 4, 5 etc.
+a, /a, //a, ///a, 4, 5, etc.
@code{fret-letter-tablature-format} for @code{tablatureFormat} should be used,
probably @code{fretLabels} for further customizing.
diff --git a/Documentation/notation/input.itely b/Documentation/notation/input.itely
index ce33708eac..f131cd6012 100644
--- a/Documentation/notation/input.itely
+++ b/Documentation/notation/input.itely
@@ -228,7 +228,7 @@ input file, LilyPond will implicitly treat the whole
file as a single \book block, see
@ref{File structure}.
-When producing multiple files from a single source file, Lilypond
+When producing multiple files from a single source file, LilyPond
ensures that none of the output files from any @code{\book} block
overwrites the output file produced by a preceding @code{\book} from
the same input file.
@@ -273,10 +273,10 @@ will produce
@funindex \bookOutputSuffix
@funindex \bookOutputName
-Lilypond provides facilities to allow you to control what file names
+LilyPond provides facilities to allow you to control what file names
are used by the various back-ends when producing output files.
-In the previous section, we saw how Lilypond prevents name-clashes when
+In the previous section, we saw how LilyPond prevents name-clashes when
producing several outputs from a single source file. You also have the
ability to specify your own suffixes for each @code{\book} block, so
for example you can produce files called
@@ -365,9 +365,9 @@ A direct scheme expression, such as
@code{#(ly:set-option 'point-and-click #f)}.
@item
-A @code{\header} block. This sets the global (i.e. the top of
+A @code{\header} block. This sets the global (i.e., the top of
file) header block. This is the block containing the default
-settings of titling fields like composer, title, etc. for all
+settings of titling fields like composer, title, etc., for all
books within the file (see @ref{Titles explained}).
@item
@@ -496,11 +496,11 @@ circumstances to avoid errors:
@item Around every opening and closing curly bracket.
-@item After every command or variable, i.e. every item that
+@item After every command or variable, i.e., every item that
begins with a @code{\} sign.
@item After every item that is to be interpreted as a Scheme
-expression, i.e. every item that begins with a @code{#}@tie{}sign.
+expression, i.e., every item that begins with a @code{#}@tie{}sign.
@item To separate all elements of a Scheme expression.
@@ -531,7 +531,7 @@ some pieces include a lot more information.
@menu
* Creating titles headers and footers::
* Custom titles headers and footers::
-* Creating PDF metadata::
+* Creating output file metadata::
* Creating footnotes::
* Reference to page numbers::
* Table of contents::
@@ -1119,16 +1119,16 @@ markup conditionally to header and footer text defined within the
@code{\paper} block, using the following syntax:
@example
-@code{variable} = @code{\markup} @{
+variable = \markup @{
@dots{}
- @code{\on-the-fly} \@var{procedure} @var{markup}
+ \on-the-fly \@var{procedure} @var{markup}
@dots{}
@}
@end example
The @var{procedure} is called each time the @code{\markup} command
in which it appears is evaluated. The @var{procedure} should test
-for a particular condition and interpret (i.e. print) the
+for a particular condition and interpret (i.e., print) the
@var{markup} argument if and only if the condition is true.
A number of ready-made procedures for testing various conditions are
@@ -1185,8 +1185,8 @@ Several @code{\on-the-fly} conditions can be combined with an
@q{and} operation, for example,
@example
- @code{\on-the-fly \first-page}
- @code{\on-the-fly \last-page}
+ \on-the-fly \first-page
+ \on-the-fly \last-page
@code{@{ \markup @dots{} \fromproperty #'header: @dots{} @}}
@end example
@@ -1200,21 +1200,30 @@ Notation Reference:
Installed Files:
@file{../ly/titling-init.ly}.
-@node Creating PDF metadata
-@subsection Creating PDF metadata
+@node Creating output file metadata
+@subsection Creating output file metadata
@cindex PDF metadata
+@cindex MIDI metadata
In addition to being shown in the printed output, @code{\header} variables
-are also used to set PDF metadata (the information displayed by PDF readers
-as the @code{properties} of the PDF file). For example, setting the
-@code{title} property of the @code{header} block @q{Symphony I} will also give
-this title to the PDF document.
-
-@example
- @code{\header@{}
- @code{title = "Symphony I"}
- @code{@}}
+are also used to set metadata for output files. For example, with PDF
+files, this metadata could be displayed by PDF readers as the
+@code{properties} of the PDF file. For each type of output file, only the
+@code{\header} definitions of blocks that define separate files of that
+type, and blocks higher in the block hierarchy, will be consulted.
+Therefore, for PDF files, only the @code{\book} level and the top level
+@code{\header} definitions affect the document-wide PDF metadata, whereas
+for MIDI files, all headers above or at the @code{\score} level are used.
+
+For example, setting the @code{title} property of the @code{header} block
+to @q{Symphony I} will also give this title to the PDF document, and use
+it as the sequence name of the MIDI file.
+
+@example
+\header@{
+ title = "Symphony I"
+@}
@end example
If you want to set the title of the printed output to one value, but have the
@@ -1222,10 +1231,10 @@ title property of the PDF to have a different value, you can use
@code{pdftitle}, as below.
@example
- @code{\header@{}
- @code{title = "Symphony I"}
- @code{pdftitle = "Symphony I by Beethoven"}
- @code{@}}
+\header@{
+ title = "Symphony I"
+ pdftitle = "Symphony I by Beethoven"
+@}
@end example
The variables @code{title}, @code{subject}, @code{keywords},
@@ -1239,6 +1248,10 @@ both set to the current date and time. @code{ModDate} can be overridden by
setting the header variable @code{moddate} (or @code{pdfmoddate}) to a
valid PDF date string.
+The @code{title} variable sets also the sequence name for MIDI. The
+@code{midititle} variable can be used to set the sequence name
+independently of the value used for typeset output.
+
@node Creating footnotes
@subsection Creating footnotes
@@ -1325,7 +1338,7 @@ left/bottom edge and zero implies the mark is centered on the edge.
@item Context
is the context in which the grob being footnoted is created. It
-may be omitted if the grob is in a bottom context, e.g. a
+may be omitted if the grob is in a bottom context, e.g., a
@code{Voice} context.
@item GrobName
@@ -2206,7 +2219,7 @@ followed by a music expression. If @emph{and only if} the symbols
are valid LilyPond identifiers (alphabetic characters only, no
numbers, underscores, or dashes) which cannot be confused with notes,
the @code{#'} may be omitted and, as a shorthand, a list of symbols
-can use the dot separator: i.e. @code{\tag #'(violinI violinII)} can
+can use the dot separator: i.e., @code{\tag #'(violinI violinII)} can
be written @code{\tag violinI.violinII}. The same applies to
@code{\keepWithTag} and @code{\removeWithTag}.
@@ -2251,7 +2264,7 @@ music = \relative {
}
@end lilypond
-Tagged filtering can be applied to articulations, texts, etc. by
+Tagged filtering can be applied to articulations, texts, etc., by
prepending
@example
@@ -2728,7 +2741,7 @@ in your source file. This will render only the last 5 measures
(assuming 4/4 time signature) of every @code{\score} in the input
file. For longer pieces, rendering only a small part is often an order
of magnitude quicker than rendering it completely. When working on the
-beginning of a score you have already typeset (e.g. to add a new part),
+beginning of a score you have already typeset (e.g., to add a new part),
the @code{showFirstLength} property may be useful as well.
Skipping parts of a score can be controlled in a more fine-grained
@@ -2882,7 +2895,7 @@ following (without taking dots into account). For example;
@noindent
The c will take the value of a crotchet.
-@item Ornaments (i.e. mordents, trills and turns et al.)
+@item Ornaments (i.e., mordents, trills and turns et al.)
@item Rallentando, accelerando, ritardando and a tempo
@item Slurs, including phrasing slurs
@item Tenuto
@@ -2907,8 +2920,8 @@ and portato
@item Glissandi
@item Falls and doits
@item Microtonal chords
-@item Rhythms entered as annotations, e.g. swing
-@item Tempo changes without @code{\tempo} (e.g. entered as annotations)
+@item Rhythms entered as annotations, e.g., swing
+@item Tempo changes without @code{\tempo} (e.g., entered as annotations)
@item Tremolos that @emph{are} entered with a @q{@code{:}[@var{number}]}
value
@end itemize
@@ -2930,8 +2943,8 @@ To create a MIDI output file from a LilyPond input file, insert a
@}
@end example
-@warning{ A @code{@bs{}score} block that, as well as the music, contains
-only a @code{@bs{}midi} block (i.e. @emph{without} the @code{@bs{}layout}
+@warning{A @code{@bs{}score} block that, as well as the music, contains
+only a @code{@bs{}midi} block (i.e., @emph{without} the @code{@bs{}layout}
block), will only produce MIDI output files. No notation will be
printed.}
@@ -2952,7 +2965,8 @@ either the @code{\book}, @code{\bookpart} or @code{\score} blocks. See
@seealso
Notation Reference:
-@ref{File structure}.
+@ref{File structure},
+@ref{Creating output file metadata}.
Installed Files:
@file{scm/midi.scm}.
@@ -3615,7 +3629,7 @@ lilypond file.ly >display.txt
@end example
@funindex \void
-Note that Lilypond does not just display the music expression, but
+Note that LilyPond does not just display the music expression, but
also interprets it (since @code{\displayLilyMusic} returns it in
addition to displaying it). Just insert @code{\displayLilyMusic} into
the existing music in order to get information about it.
diff --git a/Documentation/notation/notation-appendices.itely b/Documentation/notation/notation-appendices.itely
index 3d8bf79f43..388c8bc388 100644
--- a/Documentation/notation/notation-appendices.itely
+++ b/Documentation/notation/notation-appendices.itely
@@ -859,12 +859,12 @@ darkcyan darkmagenta darkyellow
X color names come several variants:
Any name that is spelled as a single word with capitalization
-(e.g. @q{LightSlateBlue}) can also be spelled as space separated
-words without capitalization (e.g. @q{light slate blue}).
+(e.g., @q{LightSlateBlue}) can also be spelled as space separated
+words without capitalization (e.g., @q{light slate blue}).
-The word @q{grey} can always be spelled @q{gray} (e.g. @q{DarkSlateGray}).
+The word @q{grey} can always be spelled @q{gray} (e.g., @q{DarkSlateGray}).
-Some names can take a numerical suffix (e.g. @q{LightSalmon4}).
+Some names can take a numerical suffix (e.g., @q{LightSalmon4}).
@subsubheading Color Names without a numerical suffix:
@@ -2366,7 +2366,7 @@ An association list or @strong{alist} for short is a Scheme pair
which associates a value with a key: @w{@code{(key . value)}}. For
example, in @file{scm/lily.scm}, the alist
@w{@qq{type-p-name-alist}} associates certain type predicates
-(e.g.@tie{}@code{ly:music?}) with names (e.g.@tie{}@qq{music}) so
+(e.g., @code{ly:music?}) with names (e.g., @qq{music}) so
that type-check failures can be reported with a console message that
includes the name of the expected type predicate.
@@ -2392,7 +2392,7 @@ performed.
In Scheme, a @strong{closure} is created when a function, usually
a lambda expression, is passed as a variable. The closure contains
the function's code plus references to the lexical bindings of the
-function's free variables (i.e. those variables used in the
+function's free variables (i.e., those variables used in the
expression but defined outside it). When this function is applied
to different arguments later, the free variable bindings that were
captured in the closure are used to obtain the values of the free
diff --git a/Documentation/notation/percussion.itely b/Documentation/notation/percussion.itely
index be6bc04c35..b17dd888ee 100644
--- a/Documentation/notation/percussion.itely
+++ b/Documentation/notation/percussion.itely
@@ -168,7 +168,7 @@ Snippets:
@node Pitched percussion
@unnumberedsubsubsec Pitched percussion
-Certain pitched percussion instruments (e.g. xylophone,
+Certain pitched percussion instruments (e.g., xylophone,
vibraphone, and timpani) are written using normal staves.
This is covered in other sections of the manual.
diff --git a/Documentation/notation/pitches.itely b/Documentation/notation/pitches.itely
index 3aa7738e2b..bfed32447e 100644
--- a/Documentation/notation/pitches.itely
+++ b/Documentation/notation/pitches.itely
@@ -456,7 +456,7 @@ Internals Reference:
@knownissues
There are no generally accepted standards for denoting
-quarter-tone accidentals, so LilyPond's symbol does not conform to
+quarter-tone accidentals, so LilyPond's symbols do not conform to
any standard.
@@ -518,7 +518,7 @@ In addition to note names, accidental suffixes may
also vary depending on the language:
@quotation
-@multitable {@code{nederlands}} {-@code{s}/-@code{-sharp}} {-@code{ess}/-@code{es}} {-@code{ss}/-@code{x}/-@code{-sharpsharp}} {-@code{essess}/-@code{eses}}
+@multitable {@code{nederlands}} {-@code{s}/-@code{-sharp}} {-@code{f}/-@code{-flat}} {-@code{ss}/-@code{x}/-@code{-sharpsharp}} {-@code{ff}/-@code{-flatflat}}
@headitem Language
@tab sharp @tab flat @tab double sharp @tab double flat
@item @code{nederlands}
@@ -841,7 +841,7 @@ relative mode within transposed music, an additional @code{\relative}
must be placed inside @code{\transpose}.
Triple accidentals will not be printed if using @code{\transpose}. An
-@q{enharmonically equivalent} pitch will be used instead (e.g. d-flat
+@q{enharmonically equivalent} pitch will be used instead (e.g., d-flat
rather than e-triple-flat).
@@ -903,9 +903,14 @@ music = \relative { c'8. ees16( fis8. a16 b8.) gis16 f8. d16 }
@end lilypond
@knownissues
-Manual ties inside @code{\retrograde} will be broken and
-generate warnings. Some ties can be generated automatically
-by enabling @ref{Automatic note splitting}.
+@code{\retrograde} is a rather simple tool. Since many events are
+@q{mirrored} rather than exchanged, tweaks and directional
+modifiers for opening spanners need to be added at the matching
+closing spanners: @code{^(} needs to be ended by @code{^)}, every
+@code{\<} or @code{\cresc} needs to be ended by @code{\!} or
+@code{\endcr}, every @code{\>} or @code{\decr} needs to be ended
+by @code{\enddecr}. Property-changing commands/overrides with a
+lasting effect will likely cause surprises.
@seealso
Notation Reference:
@@ -1214,6 +1219,13 @@ will be ignored. The command
c'1
@end lilypond
+@noindent
+To be more precise, it is not the @code{\clef} command itself that
+prints a clef. Instead, it sets or changes a property of the
+@code{Clef_engraver}, which then decides by its own whether to
+display a clef or not in the current staff. The @code{forceClef}
+property overrides this decision locally to re-print a clef once.
+
When there is a manual clef change, the glyph of the changed clef
will be smaller than normal. This behaviour can be overridden.
diff --git a/Documentation/notation/rhythms.itely b/Documentation/notation/rhythms.itely
index 05d71edc49..2df6cbaee7 100644
--- a/Documentation/notation/rhythms.itely
+++ b/Documentation/notation/rhythms.itely
@@ -186,7 +186,7 @@ Internals Reference:
@c Deliberately duplicated in Durations and Rests. -gp
There is no fundamental limit to rest durations (both in terms of
longest and shortest), but the number of glyphs is limited:
-rests from 128th to maxima (8 x whole) may be printed.
+rests from 128th to maxima (8Ã whole) may be printed.
@node Tuplets
@@ -713,7 +713,7 @@ Internals Reference:
@c Deliberately duplicated in Durations and Rests. -gp
There is no fundamental limit to rest durations (both in terms of
longest and shortest), but the number of glyphs is limited: there
-are rests from 128th to maxima (8 x whole).
+are rests from 128th to maxima (8Ã whole).
@node Invisible rests
@@ -981,7 +981,7 @@ Internals Reference:
@cindex multi-measure rests and fingerings
@knownissues
-Fingerings over multi-measure rests (e.g. @code{R1*10-4}) may result
+Fingerings over multi-measure rests (e.g., @code{R1*10-4}) may result
in the fingering numeral colliding with the bar counter
numeral.
@@ -1489,7 +1489,7 @@ Internal Reference:
@funindex \cadenzaOff
In metered music bar lines are inserted and bar numbers are calculated
-automatically. In unmetered music (i.e. cadenzas), this is not
+automatically. In unmetered music (i.e., cadenzas), this is not
desirable and can be @q{switched off} using the command
@code{\cadenzaOn}, then @q{switched back on} at the appropriate place
using @code{\cadenzaOff}.
@@ -1715,7 +1715,7 @@ These are created using the @code{\compoundMeter} function. The syntax
for this is:
@example
-\compoundMeter #'@code{(list of lists)}
+\compoundMeter #'(list of lists)
@end example
The simplest construction is a single list, where the @emph{last} number
@@ -1864,7 +1864,7 @@ For consistency with previous behavior, notes and rests with
duration longer than a measure, such as @code{c1*2}, are split into
notes without any scale factor, @code{@{ c1 c1 @}}. The property
@code{completionFactor} controls this behavior, and setting it to
-@code{#f} cause split notes and rest to have the scale factor
+@code{#f} cause split notes and rests to have the scale factor
of the input durations.
@@ -2666,7 +2666,7 @@ all notes end before the end of a measure.
@warning{An incorrect duration can cause line breaks to be
inhibited, leading to a line of highly compressed music or
-music which flows off the page.}
+music that flows off the page.}
@cindex line breaks
@cindex bar lines, invisible
@@ -2758,7 +2758,7 @@ However, as such ticks are typically used in Gregorian chant, it is
preferable to use @code{\divisioMinima} there instead, described in
the section @ref{Divisiones} in Gregorian chant.
-Lilypond supports kievan notation and provides a special kievan
+LilyPond supports kievan notation and provides a special kievan
bar line:
@lilypond[quote,fragment,verbatim]
f'1 \bar "k"
@@ -2941,7 +2941,7 @@ for defining span bars correctly aligned to the main bar lines:
@end lilypond
If additional elements are needed, LilyPond provides a simple
-way to define them. For more informations on modifying or adding
+way to define them. For more information on modifying or adding
bar lines, see file @file{scm/bar-line.scm}.
In scores with many staves, a @code{\bar} command in one staff is
@@ -3432,11 +3432,23 @@ notes following the main note.
\relative { c''1 \afterGrace d1 { c16[ d] } c1 }
@end lilypond
-This will put the grace notes after a space lasting 3/4 of the
-length of the main note. The default fraction 3/4 can be changed by
-setting @code{afterGraceFraction}. The following example shows
-the results from setting the space at the default, at 15/16, and
-finally at 1/2 of the main note.
+This will place the grace notes @emph{after} the start of the main
+note. The point of time where the grace notes are placed is a
+given fraction of the main note's duration. The default setting
+of
+
+@example
+afterGraceFraction = 3/4
+@end example
+
+@noindent
+may be redefined at top level. Individual @code{\afterGrace}
+commands may have the fraction specified right after the command
+itself instead.
+
+The following example shows the results from setting with the
+default space, setting it at @code{15/16}, and finally at
+@code{1/2} of the main note.
@lilypond[quote,verbatim]
<<
@@ -3444,19 +3456,17 @@ finally at 1/2 of the main note.
c''1 \afterGrace d1 { c16[ d] } c1
}
\new Staff \relative {
- #(define afterGraceFraction (cons 15 16))
- c''1 \afterGrace d1 { c16[ d] } c1
+ c''1 \afterGrace 15/16 d1 { c16[ d] } c1
}
\new Staff \relative {
- #(define afterGraceFraction (cons 1 2))
- c''1 \afterGrace d1 { c16[ d] } c1
+ c''1 \afterGrace 1/2 d1 { c16[ d] } c1
}
>>
@end lilypond
-The space between the main note and the grace note may also be
-specified using spacers. The following example places the grace
-note after a space lasting 7/8 of the main note.
+The effect of @code{\afterGrace} can also be achieved using
+spacers. The following example places the grace note after a
+space lasting 7/8 of the main note.
@lilypond[quote,verbatim]
\new Voice \relative {
@@ -3717,10 +3727,10 @@ The next bar line then falls at 9/8 rather than 5/4.
@end lilypond
@noindent
-As the example illustrates, @code{ly:make-moment n m} constructs a
+As the example illustrates, @code{ly:make-moment n/m} constructs a
duration of n/m of a whole note. For example,
-@code{ly:make-moment 1 8} is an eighth note duration and
-@code{ly:make-moment 7 16} is the duration of seven sixteenths
+@code{ly:make-moment 1/8} is an eighth note duration and
+@code{ly:make-moment 7/16} is the duration of seven sixteenths
notes.
@seealso
diff --git a/Documentation/notation/simultaneous.itely b/Documentation/notation/simultaneous.itely
index a29dd9c4ae..d9c7fb42d4 100644
--- a/Documentation/notation/simultaneous.itely
+++ b/Documentation/notation/simultaneous.itely
@@ -180,7 +180,7 @@ chord. The chord repetition symbol is @code{q}:
@end lilypond
As with regular chords, the chord repetition symbol can be used with
-durations, articulations, markups, slurs, beams, etc. as only the
+durations, articulations, markups, slurs, beams, etc., as only the
pitches of the previous chord are duplicated.
@lilypond[verbatim,quote]
@@ -559,8 +559,8 @@ upstems, and the even-numbered voices are given downstems:
>>
@end lilypond
-@warning{Lyrics, spanners (such as slurs, ties, hairpins etc.) cannot be
-created @q{across} voices.}
+@warning{Lyrics and spanners (such as slurs, ties, hairpins, etc.) cannot
+be created @q{across} voices.}
@subsubsubheading Identical rhythms
@@ -1118,12 +1118,12 @@ started when combining notes that have just started in the other
@code{Voice}. This can lead to a number of unexpected issues including
@qq{Solo} or @qq{Unison} marks being printed incorrectly.
-@code{\partcombine} keeps all spanners (slurs, ties, hairpins etc.) in
+@code{\partcombine} keeps all spanners (slurs, ties, hairpins, etc.) in
the same @code{Voice} so that if any such spanners start or end in a
different @code{Voice}, they may not be printed properly or at all.
If the @code{\partcombine} function cannot combine both music
-expressions (i.e. when both voices have different durations), it will
+expressions (i.e., when both voices have different durations), it will
give the voices, internally, its own custom names: @code{one} and
@code{two} respectively. This means if there is any @qq{switch} to a
differently named @code{Voice} context, the events in that differently
diff --git a/Documentation/notation/spacing.itely b/Documentation/notation/spacing.itely
index bd6d4d4b78..23ed5c0f30 100644
--- a/Documentation/notation/spacing.itely
+++ b/Documentation/notation/spacing.itely
@@ -570,20 +570,20 @@ the distance between two (title or top-level) markups.
@funindex last-bottom-spacing
the distance from the last system or top-level markup on a page to
-the bottom of the printable area (i.e. the top of the bottom
+the bottom of the printable area (i.e., the top of the bottom
margin).
@item top-system-spacing
@funindex top-system-spacing
-the distance from the top of the printable area (i.e. the bottom
+the distance from the top of the printable area (i.e., the bottom
of the top margin) to the first system on a page, when there is no
(title or top-level) markup between the two.
@item top-markup-spacing
@funindex top-markup-spacing
-the distance from the top of the printable area (i.e. the bottom
+the distance from the top of the printable area (i.e., the bottom
of the top margin) to the first (title or top-level) markup on a
page, when there is no system between the two.
@end table
@@ -927,7 +927,7 @@ scores (if there are two or more scores), or by ending a score on an
even-numbered page. The values of the following three variables may
be increased to make these actions less likely.
-The values are penalties, i.e. the higher the value the less likely
+The values are penalties, i.e., the higher the value the less likely
will be the associated action relative to other choices.
@table @code
@@ -1431,7 +1431,7 @@ issue:
@end lilypond
A @code{\break} command that occurrs at a bar line will also ignored if
-the previous measure ends in the middle of a note (e.g. when a tuplet
+the previous measure ends in the middle of a note (e.g., when a tuplet
begins in one measure and ends in another). In this case remove the
@code{Forbid_line_break_engraver} from the @code{Voice} context and,
use a simultaneous music construction inserting the @code{\break} at the
@@ -1943,7 +1943,7 @@ non-staff line if @code{staff-affinity} is @code{UP}.
Each distance is measured between the @emph{reference points} of
the two items. The reference point for a staff is the vertical
-center of its @code{StaffSymbol} (i.e. the middle line if
+center of its @code{StaffSymbol} (i.e., the middle line if
@code{line-count} is odd; the middle space if @code{line-count} is
even). The reference points for individual non-staff lines are
given in the following table:
@@ -2107,7 +2107,7 @@ non-staff line. Choices are @code{UP}, @code{DOWN}, and
placed equidistant between the two nearest staves on either side,
unless collisions or other spacing constraints prevent this.
Adjacent non-staff lines should have non-increasing
-@code{staff-affinity} from top to bottom, e.g. a non-staff line
+@code{staff-affinity} from top to bottom, e.g., a non-staff line
set to @code{UP} should not immediately follow one that is set to
@code{DOWN}. Non-staff lines at the top of a system should use
@code{DOWN}; those at the bottom should use @code{UP}. Setting
@@ -2333,7 +2333,7 @@ Internals Reference:
@emph{Non-staff lines} (such as @code{Lyrics}, @code{ChordNames},
etc.) are contexts whose layout objects are engraved like staves
-(i.e. in horizontal lines within systems). Specifically,
+(i.e., in horizontal lines within systems). Specifically,
non-staff lines are non-staff contexts that contain the
@rinternals{Axis_group_engraver}.
diff --git a/Documentation/notation/staff.itely b/Documentation/notation/staff.itely
index ce859e2bb5..a114434664 100644
--- a/Documentation/notation/staff.itely
+++ b/Documentation/notation/staff.itely
@@ -1326,7 +1326,7 @@ It is possible to adjust which aspects of the music are quoted with
property. Its default value is @code{'(note-event rest-event
tie-event beam-event tuplet-span-event)}, which means that only
notes, rests, ties, beams and tuplets are quoted, but not
-articulations, dynamic marks, markup etc.
+articulations, dynamic marks, markup, etc.
@warning{When a @code{Voice} starts with @code{\cueDuring}, as in the
following example, the @code{Voice} context must be explicitly declared,
diff --git a/Documentation/notation/text.itely b/Documentation/notation/text.itely
index 22471b86b3..4d1f44a4e4 100644
--- a/Documentation/notation/text.itely
+++ b/Documentation/notation/text.itely
@@ -121,7 +121,7 @@ Internals Reference:
@knownissues
Checking to make sure that text scripts and lyrics are within the
-margins requires additonal calculations. In cases where slightly faster
+margins requires additional calculations. In cases where slightly faster
performance is desired, use
@example
@@ -505,7 +505,7 @@ Installed Files:
@file{scm/markup.scm}.
@knownissues
-Syntax errors for markup mode can be confusing.
+Syntax error messages for markup mode can be confusing.
@node Selecting font and font size
@@ -543,9 +543,9 @@ Basic font switching is supported in markup mode:
@funindex \magnify
The font size can be altered, relative to the global staff size, in a
-number of different ways
+number of different ways.
-It can be set to predefined size,
+It can be set to predefined size.
@lilypond[quote,verbatim]
\relative b' {
@@ -555,7 +555,7 @@ It can be set to predefined size,
}
@end lilypond
-It can be set relative to its previous value,
+It can be set relative to its previous value.
@lilypond[quote,verbatim]
\relative b' {
@@ -566,7 +566,7 @@ It can be set relative to its previous value,
@end lilypond
It can be increased or decreased relative to the value set by the
-global staff size,
+global staff size.
@lilypond[quote,verbatim]
\relative b' {
@@ -577,7 +577,7 @@ global staff size,
@end lilypond
It can also be set to a fixed point-size, regardless of the global staff
-size,
+size.
@lilypond[quote,verbatim]
\relative b' {
diff --git a/Documentation/notation/unfretted-strings.itely b/Documentation/notation/unfretted-strings.itely
index becdc6f3e1..f3eae55765 100644
--- a/Documentation/notation/unfretted-strings.itely
+++ b/Documentation/notation/unfretted-strings.itely
@@ -198,10 +198,6 @@ dots are required.
}
@end lilypond
-@warning{@code{@bs{}harmonic} @strong{must} be placed inside a
-chord construct even if there is only a single note. Normally
-@code{@bs{}harmonicsOn} would be used in this situation.}
-
@seealso
Music Glossary:
@rglos{harmonics}.
diff --git a/Documentation/notation/vocal.itely b/Documentation/notation/vocal.itely
index b06de6f40b..118a58e482 100644
--- a/Documentation/notation/vocal.itely
+++ b/Documentation/notation/vocal.itely
@@ -63,7 +63,7 @@ introduction to this notation is to be found in
@item
Vocal music is likely to require the use of @code{markup} mode,
either for lyrics or for other text elements (characters' names,
-etc.) This syntax is described in @ref{Text markup introduction}.
+etc.). This syntax is described in @ref{Text markup introduction}.
@item
@notation{Ambitus} may be added at the beginning of vocal staves,
@@ -791,11 +791,11 @@ should be included in the melisma:
@predefined
-
@code{\autoBeamOff},
@code{\autoBeamOn},
@code{\melisma},
@code{\melismaEnd}.
+@endpredefined
@seealso
Musical Glossary:
@@ -1902,7 +1902,7 @@ are to be ignored.
@cindex grace notes and lyrics
@cindex lyrics on grace notes
-By default, grace notes (e.g. via @code{\grace}) do not get assigned
+By default, grace notes (e.g., via @code{\grace}) do not get assigned
syllables when using @code{\lyricsto}, but this behavior can be
changed:
@@ -2300,6 +2300,7 @@ When a vocal part temporarily splits, you should use
@code{\oneVoice},
@code{\voiceOne},
@code{\voiceTwo}.
+@endpredefined
@seealso
Learning Manual:
@@ -2392,7 +2393,10 @@ above their respective staves, as shown here:
@end lilypond
@predefined
-@code{\dynamicUp}, @code{\dynamicDown}, @code{\dynamicNeutral}.
+@code{\dynamicUp},
+@code{\dynamicDown},
+@code{\dynamicNeutral}.
+@endpredefined
@seealso
Notation Reference:
diff --git a/Documentation/po/ca.po b/Documentation/po/ca.po
index 3b80f6da0d..ff8e942dc9 100644
--- a/Documentation/po/ca.po
+++ b/Documentation/po/ca.po
@@ -12,7 +12,7 @@ msgstr ""
"Project-Id-Version: ca\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-04-25 19:39+0200\n"
-"PO-Revision-Date: 2014-06-09 09:09+0200\n"
+"PO-Revision-Date: 2016-07-04 11:28+0200\n"
"Last-Translator: Walter Garcia-Fontes \n"
"Language-Team: Catalan \n"
"Language: ca\n"
@@ -42,7 +42,7 @@ msgstr "Altres idiomes: %s."
#: postprocess_html.py:70
#, python-format
msgid "About automatic language selection."
-msgstr "Quant a selecció automà tica de l'idioma."
+msgstr "Quant a la selecció automà tica de la llengua."
#: postprocess_html.py:327
msgid "stable-branch"
@@ -532,7 +532,7 @@ msgstr "InterfÃcies per a programadors"
#. @node in Documentation/extending/programming-interface.itely
#. @section in Documentation/extending/programming-interface.itely
-msgid "Lilypond code blocks"
+msgid "LilyPond code blocks"
msgstr "Blocs de codi del LilyPond"
#. @node in Documentation/extending/programming-interface.itely
@@ -6480,7 +6480,7 @@ msgstr "Inserció de la sortida del LilyPond dins d'altres programes"
#. @node in Documentation/usage/external.itely
#. @unnumberedsubsec in Documentation/usage/external.itely
msgid "Inserting LilyPond output into other programs"
-msgstr "Inserció de la sortida del Lilypond dins d'altres programes"
+msgstr "Inserció de la sortida del LilyPond dins d'altres programes"
#. @node in Documentation/usage/external.itely
msgid "Independent includes"
@@ -11343,7 +11343,7 @@ msgstr "estigui al domini públic i pugui formar part, usar-se i presentar-se di
#. Documentation/snippets/unfretted-headword.ly:37 (comment)
msgid "the LilyPond Documention Project."
-msgstr "Projecte de Documentació del Lilypond."
+msgstr "Projecte de Documentació del LilyPond."
#. Documentation/snippets/unfretted-headword.ly:39 (comment)
msgid "Statement Date: Octber the 9th, 2008"
diff --git a/Documentation/po/cs.po b/Documentation/po/cs.po
index 466ac3afaa..50d0b4c65d 100644
--- a/Documentation/po/cs.po
+++ b/Documentation/po/cs.po
@@ -528,7 +528,7 @@ msgstr "Rozhranà pro programátory"
#. @node in Documentation/extending/programming-interface.itely
#. @section in Documentation/extending/programming-interface.itely
#, fuzzy
-msgid "Lilypond code blocks"
+msgid "LilyPond code blocks"
msgstr "Složené promÄnné v LilyPondu"
#. @node in Documentation/extending/programming-interface.itely
diff --git a/Documentation/po/de.po b/Documentation/po/de.po
index 9d2033aa3a..ae9c105c7e 100644
--- a/Documentation/po/de.po
+++ b/Documentation/po/de.po
@@ -523,7 +523,7 @@ msgstr "Schnittstellen für Programmierer"
#. @node in Documentation/extending/programming-interface.itely
#. @section in Documentation/extending/programming-interface.itely
#, fuzzy
-msgid "Lilypond code blocks"
+msgid "LilyPond code blocks"
msgstr "Zusammengesetzte LilyPond-Variablen"
#. @node in Documentation/extending/programming-interface.itely
diff --git a/Documentation/po/es.po b/Documentation/po/es.po
index ccde9e84a3..1bd8ddb3f7 100644
--- a/Documentation/po/es.po
+++ b/Documentation/po/es.po
@@ -536,7 +536,7 @@ msgstr "Interfaces para programadores"
#. @node in Documentation/extending/programming-interface.itely
#. @section in Documentation/extending/programming-interface.itely
-msgid "Lilypond code blocks"
+msgid "LilyPond code blocks"
msgstr "Bloques de código de LilyPond"
#. @node in Documentation/extending/programming-interface.itely
diff --git a/Documentation/po/fr.po b/Documentation/po/fr.po
index 5553c33154..dcc94ff474 100644
--- a/Documentation/po/fr.po
+++ b/Documentation/po/fr.po
@@ -514,7 +514,7 @@ msgstr "Interfaces pour programmeurs"
#. @node in Documentation/extending/programming-interface.itely
#. @section in Documentation/extending/programming-interface.itely
-msgid "Lilypond code blocks"
+msgid "LilyPond code blocks"
msgstr "Blocs de code lilyPond"
#. @node in Documentation/extending/programming-interface.itely
diff --git a/Documentation/po/hu.po b/Documentation/po/hu.po
index abfdfb7078..ddddf92454 100644
--- a/Documentation/po/hu.po
+++ b/Documentation/po/hu.po
@@ -537,7 +537,7 @@ msgstr ""
#. @node in Documentation/extending/programming-interface.itely
#. @section in Documentation/extending/programming-interface.itely
#, fuzzy
-msgid "Lilypond code blocks"
+msgid "LilyPond code blocks"
msgstr "lilypond-book sablonok"
#. @node in Documentation/extending/programming-interface.itely
diff --git a/Documentation/po/it.po b/Documentation/po/it.po
index 710e4b35a1..1fbf062985 100644
--- a/Documentation/po/it.po
+++ b/Documentation/po/it.po
@@ -519,7 +519,7 @@ msgstr ""
#. @node in Documentation/extending/programming-interface.itely
#. @section in Documentation/extending/programming-interface.itely
-msgid "Lilypond code blocks"
+msgid "LilyPond code blocks"
msgstr ""
#. @node in Documentation/extending/programming-interface.itely
diff --git a/Documentation/po/ja.po b/Documentation/po/ja.po
index 76ffe4467f..588306bcdb 100644
--- a/Documentation/po/ja.po
+++ b/Documentation/po/ja.po
@@ -558,7 +558,7 @@ msgstr ""
#. @node in Documentation/extending/programming-interface.itely
#. @section in Documentation/extending/programming-interface.itely
#, fuzzy
-msgid "Lilypond code blocks"
+msgid "LilyPond code blocks"
msgstr "ç°å¢å¤æ°"
#. @node in Documentation/extending/programming-interface.itely
diff --git a/Documentation/po/nl.po b/Documentation/po/nl.po
index 0ce4b27c82..ae8d4bb1a8 100644
--- a/Documentation/po/nl.po
+++ b/Documentation/po/nl.po
@@ -518,7 +518,7 @@ msgstr ""
#. @node in Documentation/extending/programming-interface.itely
#. @section in Documentation/extending/programming-interface.itely
-msgid "Lilypond code blocks"
+msgid "LilyPond code blocks"
msgstr ""
#. @node in Documentation/extending/programming-interface.itely
diff --git a/Documentation/po/zh.po b/Documentation/po/zh.po
index aaa66c2b1c..1da3bcfe81 100644
--- a/Documentation/po/zh.po
+++ b/Documentation/po/zh.po
@@ -515,7 +515,7 @@ msgstr "é¢åç¨åºåççé¢"
#. @node in Documentation/extending/programming-interface.itely
#. @section in Documentation/extending/programming-interface.itely
-msgid "Lilypond code blocks"
+msgid "LilyPond code blocks"
msgstr "LilyPond 代ç å"
#. @node in Documentation/extending/programming-interface.itely
diff --git a/Documentation/snippets/engravers-one-by-one.ly b/Documentation/snippets/engravers-one-by-one.ly
index 5d1bcf060c..f9ca655110 100644
--- a/Documentation/snippets/engravers-one-by-one.ly
+++ b/Documentation/snippets/engravers-one-by-one.ly
@@ -4,7 +4,7 @@
%% and then run scripts/auxiliar/makelsr.py
%%
%% This file is in the public domain.
-\version "2.19.7"
+\version "2.19.46"
\header {
lsrtags = "contexts-and-engravers, specific-notation"
@@ -89,8 +89,6 @@ MyStaff = \context {
\description "Handles clefs, bar lines, keys, accidentals. It can contain
@code{Voice} contexts."
- \consists "Output_property_engraver"
-
\consists "Font_size_engraver"
\consists "Volta_engraver"
@@ -138,7 +136,6 @@ MyVoice = \context {
\consists "Font_size_engraver"
% must come before all
- \consists "Output_property_engraver"
\consists "Arpeggio_engraver"
\consists "Multi_measure_rest_engraver"
\consists "Text_spanner_engraver"
diff --git a/Documentation/translations.itexi b/Documentation/translations.itexi
index a12eb1c585..4bf76663c0 100644
--- a/Documentation/translations.itexi
+++ b/Documentation/translations.itexi
@@ -16,7 +16,7 @@ td { border: 1px solid black; text-align: center; }
@end html
@end ifhtml
-@emph{Last updated Sat Jul 2 15:06:05 UTC 2016
+@emph{Last updated Sun Aug 7 13:59:13 UTC 2016
}
@multitable @columnfractions 0.333333333333 0.333333333333 0.333333333333
@@ -27,7 +27,7 @@ LilyPond Changes
@item
Section titles
@*
-(2393)
+(2449)
@tab Francisco Vila
@*
@@ -77,7 +77,7 @@ up to date
@item
LilyPond --- \TITLE\
@*
-(1139)
+(1138)
@tab Francisco Vila
@*
@@ -256,7 +256,7 @@ up to date
@item
LilyPond --- \TITLE\
@*
-(1139)
+(1138)
@tab Till Paala
@*
@@ -817,7 +817,7 @@ up to date
@item
LilyPond --- \TITLE\
@*
-(1139)
+(1138)
@tab Till Paala
@*
@@ -1404,7 +1404,7 @@ partially up to date
@item
LilyPond --- \TITLE\
@*
-(1139)
+(1138)
@tab Walter Garcia-Fontes
@*
@@ -2734,7 +2734,7 @@ not translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -2843,7 +2843,7 @@ partially translated (95 %)
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -3362,10 +3362,11 @@ up to date
@end multitable
-@multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667
+@multitable @columnfractions 0.142857142857 0.142857142857 0.142857142857 0.142857142857 0.142857142857 0.142857142857 0.142857142857
@headitem
LilyPond Notation Reference
+@tab ca
@tab de
@tab es
@tab fr
@@ -3375,6 +3376,29 @@ LilyPond Notation Reference
Section titles
@*
(326)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+translated
+@end html
+@end ifhtml
+@ifnothtml
+translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -3495,7 +3519,30 @@ partially up to date
@item
LilyPond --- \TITLE\
@*
-(1139)
+(1138)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+translated
+@end html
+@end ifhtml
+@ifnothtml
+translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -3617,6 +3664,29 @@ up to date
1 Musical notation
@*
(91)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+translated
+@end html
+@end ifhtml
+@ifnothtml
+translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -3737,7 +3807,30 @@ up to date
@item
1.1 Pitches
@*
-(5169)
+(5224)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+translated
+@end html
+@end ifhtml
+@ifnothtml
+translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+partially up to date
+@end html
+@end ifhtml
+@ifnothtml
+partially up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -3755,7 +3848,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -3778,11 +3871,11 @@ translated
@ifhtml
@html
-up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Frédéric Chiasson
@*
@@ -3877,11 +3970,11 @@ translated
@ifhtml
@html
-up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Yoshiki Sawada
@*
@@ -3900,7 +3993,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -3909,7 +4002,30 @@ partially up to date
@item
1.2 Rhythms
@*
-(6795)
+(6822)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -3927,7 +4043,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -3950,11 +4066,11 @@ translated
@ifhtml
@html
-up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Frédéric Chiasson
@*
@@ -4060,11 +4176,11 @@ translated
@ifhtml
@html
-up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Yoshiki Sawada
@*
@@ -4083,7 +4199,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -4093,6 +4209,29 @@ partially up to date
1.3 Expressive marks
@*
(1798)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -4265,6 +4404,29 @@ partially up to date
1.4 Repeats
@*
(1288)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -4437,6 +4599,29 @@ partially up to date
1.5 Simultaneous notes
@*
(2919)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -4454,7 +4639,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -4477,11 +4662,11 @@ translated
@ifhtml
@html
-up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Frédéric Chiasson
@*
@@ -4578,11 +4763,11 @@ translated
@ifhtml
@html
-up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Yoshiki Sawada
@*
@@ -4601,7 +4786,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -4611,6 +4796,29 @@ partially up to date
1.6 Staff notation
@*
(2554)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -4772,6 +4980,29 @@ partially up to date
1.7 Editorial annotations
@*
(1477)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -4911,6 +5142,29 @@ partially up to date
1.8 Text
@*
(2754)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -5083,6 +5337,29 @@ partially up to date
2 Specialist notation
@*
(81)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+partially translated (2 %)
+@end html
+@end ifhtml
+@ifnothtml
+partially translated (2 %)
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -5203,7 +5480,30 @@ up to date
@item
2.1 Vocal music
@*
-(4975)
+(4977)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -5365,6 +5665,29 @@ partially up to date
2.2 Keyboard and other multi-staff instruments
@*
(904)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab  Till Paala
@*
@@ -5516,7 +5839,30 @@ partially up to date
@item
2.3 Unfretted string instruments
@*
-(303)
+(279)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -5534,7 +5880,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -5557,11 +5903,11 @@ translated
@ifhtml
@html
-up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Valentin Villenave
@*
@@ -5659,7 +6005,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -5668,7 +6014,30 @@ partially up to date
@item
2.4 Fretted string instruments
@*
-(2820)
+(2821)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -5808,6 +6177,29 @@ partially up to date
2.5 Percussion
@*
(799)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -5825,7 +6217,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -5939,7 +6331,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -5949,6 +6341,29 @@ partially up to date
2.6 Wind instruments
@*
(324)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -6095,12 +6510,35 @@ translated
@end html
@end ifhtml
@ifnothtml
-partially up to date
+partially up to date
+@end ifnothtml
+@item
+2.7 Chord notation
+@*
+(1979)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
@end ifnothtml
-@item
-2.7 Chord notation
-@*
-(1931)
@tab Till Paala
@*
@@ -6118,7 +6556,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -6141,11 +6579,11 @@ translated
@ifhtml
@html
-up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Valentin Villenave
@*
@@ -6243,7 +6681,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -6253,6 +6691,29 @@ partially up to date
2.8 Contemporary music
@*
(475)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -6392,6 +6853,29 @@ up to date
2.9 Ancient notation
@*
(5516)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -6409,7 +6893,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -6511,6 +6995,29 @@ up to date
2.10 World music
@*
(1446)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -6671,7 +7178,30 @@ partially up to date
@item
3 General input and output
@*
-(12704)
+(12824)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -6689,7 +7219,7 @@ partially translated (94 %)
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -6712,11 +7242,11 @@ translated
@ifhtml
@html
-up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Jean-Charles Malahieude
@*
@@ -6780,11 +7310,11 @@ translated
@ifhtml
@html
-up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
-up to date
+partially up to date
@end ifnothtml
@tab Yoshiki Sawada
@*
@@ -6792,18 +7322,18 @@ up to date
@ifhtml
@html
-partially translated (94 %)
+partially translated (95 %)
@end html
@end ifhtml
@ifnothtml
-partially translated (94 %)
+partially translated (95 %)
@end ifnothtml
@*
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -6813,6 +7343,29 @@ partially up to date
4 Spacing issues
@*
(10911)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -6830,7 +7383,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -6944,7 +7497,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -6953,7 +7506,30 @@ partially up to date
@item
5 Changing defaults
@*
-(15598)
+(15597)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -7105,7 +7681,7 @@ partially translated (94 %)
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -7114,7 +7690,30 @@ partially up to date
@item
A Notation manual tables
@*
-(3077)
+(3079)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -7132,7 +7731,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -7236,6 +7835,29 @@ up to date
B Cheat sheet
@*
(252)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -7375,6 +7997,29 @@ partially up to date
C GNU Free Documentation License
@*
(3724)
+@tab Walter Garcia-Fontes
+@*
+
+@ifhtml
+
+@html
+not translated
+@end html
+@end ifhtml
+@ifnothtml
+not translated
+@end ifnothtml
+@*
+
+@ifhtml
+
+@html
+up to date
+@end html
+@end ifhtml
+@ifnothtml
+up to date
+@end ifnothtml
@tab Till Paala
@*
@@ -7698,7 +8343,7 @@ up to date
@item
LilyPond --- \TITLE\
@*
-(1139)
+(1138)
@tab Walter Garcia-Fontes
@*
@@ -8751,7 +9396,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -8774,7 +9419,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -8953,7 +9598,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
@@ -9186,11 +9831,11 @@ translated
@ifhtml
@html
-up to date
+
@end html
@end ifhtml
@ifnothtml
-up to date
+
@end ifnothtml
@tab Pavel Fric
@*
@@ -9450,7 +10095,7 @@ partially up to date
@item
LilyPond --- \TITLE\
@*
-(1139)
+(1138)
@tab Walter Garcia-Fontes
@*
@@ -9798,7 +10443,7 @@ translated
@ifhtml
@html
-partially up to date
+partially up to date
@end html
@end ifhtml
@ifnothtml
diff --git a/Documentation/usage/suggestions.itely b/Documentation/usage/suggestions.itely
index 56ddfe24c8..73de64e0f9 100644
--- a/Documentation/usage/suggestions.itely
+++ b/Documentation/usage/suggestions.itely
@@ -296,13 +296,13 @@ Another very useful debugging technique is constructing
@cindex makefiles
@cindex make
-Pretty well all the platforms Lilypond can run on support a software
+Pretty well all the platforms LilyPond can run on support a software
facility called @code{make}. This software reads a special file called a
@code{Makefile} that defines what files depend on what others and what
commands you need to give the operating system to produce one file from
another. For example the makefile would spell out how to produce
@file{ballad.pdf} and @file{ballad.midi} from @file{ballad.ly} by
-running Lilypond.
+running LilyPond.
There are times when it is a good idea to create a @code{Makefile}
for your project, either for your own convenience or
diff --git a/Documentation/web/introduction.itexi b/Documentation/web/introduction.itexi
index 77eda53f3a..2ea2085ab9 100644
--- a/Documentation/web/introduction.itexi
+++ b/Documentation/web/introduction.itexi
@@ -391,7 +391,7 @@ The colors have been added for better visibility.
@subheading Customized Output
A short excerpt from Stockhausen's Klavierstück II to demonstrate
-Lilypond's ability to provide customised output.
+LilyPond's ability to provide customised output.
@exampleImage{Stockhausen_Klavierstueck2}
@divEnd
@@ -612,8 +612,8 @@ Some highlights:
version of Richard Strauss's @emph{Der Rosenkavalier} for four singers
and a chamber orchestra of thirteen players. This has been commissioned
by the Berlin Philharmonic Orchestra whose members will be the performers on
-@uref{http://www.festspielhaus.de/veranstaltung/der-kleine-rosenkavalier-02-04-2015-1100/,April 2nd and 6th}
-at the Festspielhaus, Baden-Baden, and on
+@uref{http://www.festspielhaus.de/veranstaltung/der-kleine-rosenkavalier-02-04-2015-1100/,April 2nd and 6th}
+at the Festspielhaus, Baden-Baden, and on
@uref{http://www.berliner-philharmoniker.de/konzerte/kalender/details/21070/,April 26th}
in the @emph{Philharmonie (groÃer Saal)}, Berlin. We are pleased to see
musicians of such reputation playing from LilyPond scores -- and they are
diff --git a/Documentation/web/news-front.itexi b/Documentation/web/news-front.itexi
index 349678b75d..67ce189469 100644
--- a/Documentation/web/news-front.itexi
+++ b/Documentation/web/news-front.itexi
@@ -9,19 +9,19 @@
@c used for news about the upcoming release; see CG 10.2
@newsItem
-@subheading LilyPond 2.19.45 released @emph{July 09, 2016}
+@subheading LilyPond 2.19.47 released @emph{August 13, 2016}
We are happy to announce the release of LilyPond
-2.19.45. This release includes a number of enhancements, and contains some
+2.19.47. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@newsItem
-@subheading Lilypond 2.18.2 released! @emph{March 23, 2014}
+@subheading LilyPond 2.18.2 released! @emph{March 23, 2014}
We are proud to announce the release of GNU LilyPond 2.18.2.
LilyPond is a music engraving program devoted to producing the
@@ -53,7 +53,7 @@ from data encoded directly in the LilyPond score.
@newsItem
-@subheading Lilypond 2.18.0 released! @emph{December 29, 2013}
+@subheading LilyPond 2.18.0 released! @emph{December 29, 2013}
We are proud to announce the release of GNU LilyPond 2.18.0.
LilyPond is a music engraving program devoted to producing the
diff --git a/Documentation/web/news.itexi b/Documentation/web/news.itexi
index c92da5f534..32cd7bde51 100644
--- a/Documentation/web/news.itexi
+++ b/Documentation/web/news.itexi
@@ -26,6 +26,30 @@ NOTE:
* don't duplicate entries from news-front.itexi
@end ignore
+@newsItem
+@subheading LilyPond 2.19.46 released @emph{July 26, 2016}
+
+We are happy to announce the release of LilyPond
+2.19.46. This release includes a number of enhancements, and contains some
+work in progress. You will have access to the very latest features, but
+some may be incomplete, and you may encounter bugs and crashes. If you
+require a stable version of LilyPond, we recommend using the 2.18
+version.
+
+@newsEnd
+
+@newsItem
+@subheading LilyPond 2.19.45 released @emph{July 09, 2016}
+
+We are happy to announce the release of LilyPond
+2.19.45. This release includes a number of enhancements, and contains some
+work in progress. You will have access to the very latest features, but
+some may be incomplete, and you may encounter bugs and crashes. If you
+require a stable version of LilyPond, we recommend using the 2.18
+version.
+
+@newsEnd
+
@newsItem
@subheading LilyPond 2.19.44 released @emph{June 21, 2016}
@@ -33,7 +57,7 @@ We are happy to announce the release of LilyPond
2.19.44. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -45,7 +69,7 @@ We are happy to announce the release of LilyPond
2.19.43. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -57,7 +81,7 @@ We are happy to announce the release of LilyPond
2.19.42. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -69,7 +93,7 @@ We are happy to announce the release of LilyPond
2.19.41. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -81,7 +105,7 @@ We are happy to announce the release of LilyPond
2.19.40. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -93,7 +117,7 @@ We are happy to announce the release of LilyPond
2.19.39. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -105,7 +129,7 @@ We are happy to announce the release of LilyPond
2.19.38. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -117,7 +141,7 @@ We are happy to announce the release of LilyPond
2.19.37. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -129,7 +153,7 @@ We are happy to announce the release of LilyPond
2.19.36. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -141,7 +165,7 @@ We are happy to announce the release of LilyPond
2.19.35. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -153,7 +177,7 @@ We are happy to announce the release of LilyPond
2.19.34. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -165,7 +189,7 @@ We are happy to announce the release of LilyPond
2.19.33. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -177,7 +201,7 @@ We are happy to announce the release of LilyPond
2.19.32. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -189,7 +213,7 @@ We are happy to announce the release of LilyPond
2.19.31. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -201,7 +225,7 @@ We are happy to announce the release of LilyPond
2.19.30. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -213,7 +237,7 @@ We are happy to announce the release of LilyPond
2.19.29. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -225,7 +249,7 @@ We are happy to announce the release of LilyPond
2.19.28. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -237,7 +261,7 @@ We are happy to announce the release of LilyPond
2.19.27. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -249,7 +273,7 @@ We are happy to announce the release of LilyPond
2.19.26. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -261,7 +285,7 @@ We are happy to announce the release of LilyPond
2.19.25. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -273,7 +297,7 @@ We are happy to announce the release of LilyPond
2.19.24. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -285,7 +309,7 @@ We are happy to announce the release of LilyPond
2.19.23. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -297,7 +321,7 @@ We are happy to announce the release of LilyPond
2.19.22. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -309,7 +333,7 @@ We are happy to announce the release of LilyPond
2.19.21. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -321,7 +345,7 @@ We are happy to announce the release of LilyPond
2.19.20. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -333,7 +357,7 @@ We are happy to announce the release of LilyPond
2.19.19. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -345,7 +369,7 @@ We are happy to announce the release of LilyPond
2.19.18. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -357,7 +381,7 @@ We are happy to announce the release of LilyPond
2.19.17. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -369,7 +393,7 @@ At long last, we are very happy to announce the release of LilyPond
2.19.16. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
We would like to acknowledge and thank Masamichi Hosoda for making this
@@ -384,7 +408,7 @@ We are happy to announce the release of LilyPond 2.19.15. This
release includes a number of enhancements, and contains some work
in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -396,7 +420,7 @@ We are happy to announce the release of LilyPond 2.19.14. This
release includes a number of enhancements, and contains some work
in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -408,7 +432,7 @@ We are happy to announce the release of LilyPond 2.19.13. This
release includes a number of enhancements, and contains some work
in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -420,7 +444,7 @@ We are happy to announce the release of LilyPond 2.19.12. This
release includes a number of enhancements, and contains some work
in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -432,7 +456,7 @@ We are happy to announce the release of LilyPond 2.19.11. This
release includes a number of enhancements, and contains some work
in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -444,7 +468,7 @@ We are happy to announce the release of LilyPond 2.19.10. This
release includes a number of enhancements, and contains some work
in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -456,7 +480,7 @@ We are happy to announce the release of LilyPond 2.19.9. This
release includes a number of enhancements, and contains some work
in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -468,7 +492,7 @@ We are happy to announce the release of LilyPond 2.19.8. This
release includes a number of enhancements, and contains some work
in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -480,7 +504,7 @@ We are happy to announce the release of LilyPond 2.19.7. This
release includes a number of enhancements, and contains some work
in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -492,7 +516,7 @@ We are happy to announce the release of LilyPond 2.19.6. This
release includes a number of enhancements, and contains some work
in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
-require a stable version of Lilypond, we recommend using the 2.18
+require a stable version of LilyPond, we recommend using the 2.18
version.
@newsEnd
@@ -504,7 +528,7 @@ We are happy to announce the release of LilyPond 2.19.5. This
release includes a number of enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.18 version.
+a stable version of LilyPond, we recommend using the 2.18 version.
@newsEnd
@@ -515,7 +539,7 @@ We are happy to announce the release of LilyPond 2.19.4. This
release includes a number of enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.18 version.
+a stable version of LilyPond, we recommend using the 2.18 version.
@newsEnd
@@ -548,7 +572,7 @@ We are happy to announce the release of LilyPond 2.19.3. This
release includes a number of enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.18 version.
+a stable version of LilyPond, we recommend using the 2.18 version.
@newsEnd
@@ -573,7 +597,7 @@ We are happy to announce the release of LilyPond 2.19.2. This
release includes a number of enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.18 version.
+a stable version of LilyPond, we recommend using the 2.18 version.
@newsEnd
@@ -584,7 +608,7 @@ We are happy to announce the release of LilyPond 2.19.1. This
release includes a number of enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.18 version.
+a stable version of LilyPond, we recommend using the 2.18 version.
@newsEnd
@@ -595,7 +619,7 @@ We are happy to announce the release of LilyPond 2.19.0. This
release includes a number of enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.18 version.
+a stable version of LilyPond, we recommend using the 2.18 version.
@newsEnd
@@ -649,7 +673,7 @@ We are happy to announce the release of LilyPond 2.17.29. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -660,7 +684,7 @@ We are happy to announce the release of LilyPond 2.17.28. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -671,7 +695,7 @@ We are happy to announce the release of LilyPond 2.17.27. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -682,7 +706,7 @@ We are happy to announce the release of LilyPond 2.17.26. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -693,7 +717,7 @@ We are happy to announce the release of LilyPond 2.17.25. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -704,7 +728,7 @@ We are happy to announce the release of LilyPond 2.17.24. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -715,7 +739,7 @@ We are happy to announce the release of LilyPond 2.17.23. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -726,7 +750,7 @@ We are happy to announce the release of LilyPond 2.17.22. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
This update cures the issue with the Windows version crashing with a problem
with positioning text.
@@ -740,7 +764,7 @@ We are happy to announce the release of LilyPond 2.17.21. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -751,7 +775,7 @@ We are happy to announce the release of LilyPond 2.17.20. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -770,7 +794,7 @@ We are happy to announce the release of LilyPond 2.17.19. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -781,7 +805,7 @@ We are happy to announce the release of LilyPond 2.17.18. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -792,7 +816,7 @@ We are happy to announce the release of LilyPond 2.17.17. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -803,7 +827,7 @@ We are happy to announce the release of LilyPond 2.17.16. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -814,7 +838,7 @@ We are happy to announce the release of LilyPond 2.17.15. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -826,7 +850,7 @@ release contains the usual number of bugfixes (including putting span bars back
where they should be) and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -837,7 +861,7 @@ We are happy to announce the release of LilyPond 2.17.13. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -848,7 +872,7 @@ We are happy to announce the release of LilyPond 2.17.12. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -859,7 +883,7 @@ We are happy to announce the release of LilyPond 2.17.11. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -870,7 +894,7 @@ We are happy to announce the release of LilyPond 2.17.10. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -890,7 +914,7 @@ We are happy to announce the release of LilyPond 2.17.9. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -901,7 +925,7 @@ We are happy to announce the release of LilyPond 2.17.8. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -912,7 +936,7 @@ We are happy to announce the release of LilyPond 2.17.7. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -956,7 +980,7 @@ We are happy to announce the release of LilyPond 2.17.6. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -967,7 +991,7 @@ We are happy to announce the release of LilyPond 2.17.5. This
release contains the usual number of bugfixes and enhancements, and contains
some work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you require
-a stable version of Lilypond, we recommend using the 2.16 version.
+a stable version of LilyPond, we recommend using the 2.16 version.
@newsEnd
@@ -1023,7 +1047,7 @@ and instead use the stable 2.16 version.
@newsEnd
@newsItem
-@subheading Lilypond 2.16.0 released! @emph{August 24, 2012}
+@subheading LilyPond 2.16.0 released! @emph{August 24, 2012}
We are proud to announce the release of GNU LilyPond 2.16.0.
LilyPond is a music engraving program, devoted to producing the
@@ -1086,7 +1110,7 @@ Jean-Charles Malahieude, Till Paala, Yoshiki Sawada
@newsEnd
@newsItem
-@subheading Lilypond 2.15.95 released! @emph{August 11, 2012}
+@subheading LilyPond 2.15.95 released! @emph{August 11, 2012}
We are excited to announce the release of LilyPond 2.15.95.
With this release, development on version 2.15 is frozen for the
diff --git a/Documentation/zh/translations.itexi b/Documentation/zh/translations.itexi
index 48e5871a2e..099f6ede96 100644
--- a/Documentation/zh/translations.itexi
+++ b/Documentation/zh/translations.itexi
@@ -16,7 +16,7 @@ td { border: 1px solid black; text-align: center; }
@end html
@end ifhtml
-@emph{æè¿æ´æ° Sat Jul 2 15:06:05 UTC 2016
+@emph{æè¿æ´æ° Sun Aug 7 13:59:13 UTC 2016
}
@multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667
@@ -59,7 +59,7 @@ Anthony Fok
@item
LilyPond --- \TITLE\
@*
-1139
+1138
@tab Ben Luo
@*
Anthony Fok
diff --git a/INSTALL.txt b/INSTALL.txt
index 25572a1616..b285145bd2 100644
--- a/INSTALL.txt
+++ b/INSTALL.txt
@@ -1,10 +1,7 @@
INSTALL - compiling and installing GNU LilyPond
***********************************************
-Table of Contents
-*****************
-INSTALL - compiling and installing GNU LilyPond
1 Compilation
1.1 Overview of compiling
1.2 Requirements
@@ -17,24 +14,24 @@ INSTALL - compiling and installing GNU LilyPond
Other
1.2.3 Requirements for building documentation
1.3 Getting the source code
- 1.4 Configuring `make'
- 1.4.1 Running `./autogen.sh'
- 1.4.2 Running `../configure'
+ 1.4 Configuring âmakeâ
+ 1.4.1 Running â./autogen.shâ
+ 1.4.2 Running â../configureâ
Configuration options
Checking build dependencies
Configuring target directories
1.5 Compiling LilyPond
- 1.5.1 Using `make'
- 1.5.2 Saving time with the `-j' option
+ 1.5.1 Using âmakeâ
+ 1.5.2 Saving time with the â-jâ option
1.5.3 Compiling for multiple platforms
- 1.5.4 Useful `make' variables
+ 1.5.4 Useful âmakeâ variables
1.6 Post-compilation options
1.6.1 Installing LilyPond from a local build
1.6.2 Generating documentation
- Documentation editor's edit/compile cycle
+ Documentation editorâs edit/compile cycle
Building documentation
Building a single document
- Saving time with `CPU_COUNT'
+ Saving time with âCPU_COUNTâ
AJAX search
Installing documentation
Building documentation without compiling
@@ -47,8 +44,6 @@ INSTALL - compiling and installing GNU LilyPond
Using lilypond python libraries
1.8 Concurrent stable and development versions
1.9 Build system
-
-
1 Compilation
*************
@@ -60,7 +55,7 @@ recommended for developers and packagers. Typical program users are
instead encouraged to obtain the program from a package manager (on
Unix) or by downloading a precompiled binary configured for a specific
operating system. Pre-compiled binaries are available on the *note
-Download: (lilypond-web)Download. page.
+(lilypond-web)Download:: page.
Compiling LilyPond from source is necessary if you want to build,
install, or test your own version of the program.
@@ -68,13 +63,13 @@ install, or test your own version of the program.
A successful compile can also be used to generate and install the
documentation, incorporating any changes you may have made. However, a
successful compile is not a requirement for generating the
-documentation. The documentation can be built using a Git repository
-in conjunction with a locally installed copy of the program. For more
+documentation. The documentation can be built using a Git repository in
+conjunction with a locally installed copy of the program. For more
information, see *note Building documentation without compiling::.
Attempts to compile LilyPond natively on Windows have been
-unsuccessful, though a workaround is available (see *note LilyDev:
-(lilypond-contributor)LilyDev.).
+unsuccessful, though a workaround is available (see *note
+(lilypond-contributor)LilyDev::).
1.2 Requirements
================
@@ -85,23 +80,23 @@ unsuccessful, though a workaround is available (see *note LilyDev:
This section contains the list of separate software packages that are
required to run LilyPond.
- * DejaVu fonts (http://www.dejavu-fonts.org/) These are normally
+ ⢠DejaVu fonts (http://www.dejavu-fonts.org/) These are normally
installed by default.
- * FontConfig (http://www.fontconfig.org/) Use version 2.4.0 or newer.
+ ⢠FontConfig (http://www.fontconfig.org/) Use version 2.4.0 or newer.
- * Freetype (http://www.freetype.org/) Use version 2.1.10 or newer.
+ ⢠Freetype (http://www.freetype.org/) Use version 2.1.10 or newer.
- * Ghostscript (http://www.ghostscript.com) Use version 8.60 or newer.
+ ⢠Ghostscript (http://www.ghostscript.com) Use version 8.60 or newer.
- * Guile (http://www.gnu.org/software/guile/guile.html) Use version
- 1.8.8. Version 2.x of Guile is not currently supported.
+ ⢠Guile (http://www.gnu.org/software/guile/guile.html) Use version
+ 1.8.8. Version 2.x of Guile is not currently supported.
- * Pango (http://www.pango.org/) User version 1.12 or newer.
+ ⢠Pango (http://www.pango.org/) User version 1.12 or newer.
- * Python (http://www.python.org) Use version 2.4 or newer.
+ ⢠Python (http://www.python.org) Use version 2.4 or newer.
- * International fonts. For example:
+ ⢠International fonts. For example:
Fedora:
@@ -126,7 +121,6 @@ required to run LilyPond.
These are normally installed by default and are required only to
create music with international text or lyrics.
-
1.2.2 Requirements for compiling LilyPond
-----------------------------------------
@@ -137,30 +131,30 @@ the software packages required to build LilyPond.
simple commands to download all the software needed. For others, there
is an explicit list of all the individual packages (as well as where to
get them from) for those that are not already included in your
-distributions' own repositories.
+distributionsâ own repositories.
Fedora
......
-The following instructions were tested on `Fedora' versions 22 & 23 and
+The following instructions were tested on âFedoraâ versions 22 & 23 and
will download all the software required to both compile LilyPond and
build the documentation.
- * Download and install all the LilyPond build-dependencies
+ ⢠Download and install all the LilyPond build-dependencies
(approximately 700MB);
sudo dnf builddep lilypond --nogpgcheck
- * Download and install additional `build' tools required for
+ ⢠Download and install additional âbuildâ tools required for
compiling;
sudo dnf install autoconf gcc-c++
- * Download `texi2html 1.82' directly from:
- `http://download.savannah.gnu.org/releases/texi2html/texi2html-1.82.tar.gz';
+ ⢠Download âtexi2html 1.82â directly from:
+ ;
- `texi2html' is only required if you intend to compile LilyPond's
- own documentation (e.g. to help with any document writing). The
+ âtexi2htmlâ is only required if you intend to compile LilyPondâs
+ own documentation (e.g. to help with any document writing). The
version available in the Fedora repositories is too new and will
not work. Extract the files into an appropriate location and then
run the commands;
@@ -169,50 +163,47 @@ build the documentation.
make
sudo make install
- This should install `texi2html 1.82' into `/usr/local/bin', which
- will normally take priority over `/usr/bin' where the later,
+ This should install âtexi2html 1.82â into â/usr/local/binâ, which
+ will normally take priority over â/usr/binâ where the later,
pre-installed versions gets put. Now verify that your operating
- system is able to see the correct version of `texi2html'.
+ system is able to see the correct version of âtexi2htmlâ.
texi2html --version
- * Although not `required' to compile LilyPond, if you intend to
- contribute to LilyPond (codebase or help improve the
- documentation) then it is recommended that you also need to
- install `git'.
+ ⢠Although not ârequiredâ to compile LilyPond, if you intend to
+ contribute to LilyPond (codebase or help improve the documentation)
+ then it is recommended that you also need to install âgitâ.
sudo dnf install git
- Also see *note Starting with Git: (lilypond-notation)Starting with
- Git.
+ Also see *note (lilypond-notation)Starting with Git::.
- * To use the `lily-git.tcl' GUI;
+ ⢠To use the âlily-git.tclâ GUI;
sudo dnf install tk
- See *note lily-git: (lilypond-notation)lily-git.
-
+ See *note (lilypond-notation)lily-git::.
- Note: By default, when building LilyPond's documentation,
- `pdfTeX' is be used. However ligatures (fi, fl, ff etc.) may
+ Note: By default, when building LilyPondâs documentation,
+ âpdfTeXâ is be used. However ligatures (fi, fl, ff etc.) may
not be printed in the PDF output. In this case XeTeX can be
- used instead. Download and install the `texlive-xetex'
+ used instead. Download and install the âtexlive-xetexâ
package.
sudo dnf install texlive-xetex
The scripts used to build the LilyPond documentation will use
- `XeTex' instead of `pdfTex' to generate the PDF documents if
+ âXeTexâ instead of âpdfTexâ to generate the PDF documents if
it is available. No additional configuration is required.
Linux Mint
..........
-The following instructions were tested on `Linux Mint 17.1' and `LMDE -
-Betsy' and will download all the software required to both compile
+The following instructions were tested on âLinux Mint 17.1â and âLMDE -
+Betsyâ and will download all the software required to both compile
LilyPond and build the documentation..
- * Enable the _sources_ repository;
+ ⢠Enable the _sources_ repository;
1. Using the _Software Sources_ GUI (located under
_Administration_).
@@ -225,141 +216,131 @@ LilyPond and build the documentation..
4. Click the _Update the cache_ button and when it has completed,
close the _Software Sources_ GUI.
-
- * Download and install all the LilyPond build-dependencies
+ ⢠Download and install all the LilyPond build-dependencies
(approximately 200MB);
sudo apt-get build-dep lilypond
- * Download and install additional `build' tools required for
+ ⢠Download and install additional âbuildâ tools required for
compiling;
sudo apt-get install autoconf fonts-texgyre texlive-lang-cyrillic
- * Although not `required' to compile LilyPond, if you intend to
- contribute to LilyPond (codebase or help improve the
- documentation) then it is recommended that you also need to
- install `git'.
+ ⢠Although not ârequiredâ to compile LilyPond, if you intend to
+ contribute to LilyPond (codebase or help improve the documentation)
+ then it is recommended that you also need to install âgitâ.
sudo apt-get install git
- Also see *note Starting with Git: (lilypond-notation)Starting with
- Git.
+ Also see *note (lilypond-notation)Starting with Git::.
- * To use the `lily-git.tcl' GUI;
+ ⢠To use the âlily-git.tclâ GUI;
sudo apt-get install tk
- Also see *note lily-git: (lilypond-notation)lily-git.
-
+ Also see *note (lilypond-notation)lily-git::.
- Note: By default, when building LilyPond's documentation,
- `pdfTeX' is be used. However ligatures (fi, fl, ff etc.) may
+ Note: By default, when building LilyPondâs documentation,
+ âpdfTeXâ is be used. However ligatures (fi, fl, ff etc.) may
not be printed in the PDF output. In this case XeTeX can be
- used instead. Download and install the `texlive-xetex'
+ used instead. Download and install the âtexlive-xetexâ
package.
sudo apt-get install texlive-xetex
The scripts used to build the LilyPond documentation will use
- `XeTex' instead of `pdfTex' to generate the PDF documents if
+ âXeTexâ instead of âpdfTexâ to generate the PDF documents if
it is available. No additional configuration is required.
OpenSUSE
........
-The following instructions were tested on `OpenSUSE 13.2' and will
+The following instructions were tested on âOpenSUSE 13.2â and will
download all the software required to both compile LilyPond and build
the documentation.
- * Add the _sources_ repository;
+ ⢠Add the _sources_ repository;
sudo zypper addrepo -f \
"http://download.opensuse.org/source/distribution/13.2/repo/oss/" sources
- * Download and install all the LilyPond build-dependencies
+ ⢠Download and install all the LilyPond build-dependencies
(approximately 680MB);
sudo zypper source-install lilypond
- * Download and install additional `build' tools required for
+ ⢠Download and install additional âbuildâ tools required for
compiling;
sudo zypper install make
- * Although not `required' to compile LilyPond, if you intend to
- contribute to LilyPond (codebase or help improve the
- documentation) then it is recommended that you also need to
- install `git'.
+ ⢠Although not ârequiredâ to compile LilyPond, if you intend to
+ contribute to LilyPond (codebase or help improve the documentation)
+ then it is recommended that you also need to install âgitâ.
sudo zypper install git
- Also see *note Starting with Git: (lilypond-notation)Starting with
- Git.
+ Also see *note (lilypond-notation)Starting with Git::.
- * To use the `lily-git.tcl' GUI;
+ ⢠To use the âlily-git.tclâ GUI;
sudo zypper install tk
- Also see *note lily-git: (lilypond-notation)lily-git.
+ Also see *note (lilypond-notation)lily-git::.
-
- Note: By default, when building LilyPond's documentation,
- `pdfTeX' is be used. However ligatures (fi, fl, ff etc.) may
+ Note: By default, when building LilyPondâs documentation,
+ âpdfTeXâ is be used. However ligatures (fi, fl, ff etc.) may
not be printed in the PDF output. In this case XeTeX can be
- used instead. Download and install the `texlive-xetex'
+ used instead. Download and install the âtexlive-xetexâ
package.
sudo zypper install texlive-xetex
The scripts used to build the LilyPond documentation will use
- `XeTex' instead of `pdfTex' to generate the PDF documents if
+ âXeTexâ instead of âpdfTexâ to generate the PDF documents if
it is available. No additional configuration is required.
Ubuntu
......
-The following commands were tested on Ubuntu versions `14.04 LTS',
-`14.10' and `15.04' and will download all the software required to both
+The following commands were tested on Ubuntu versions â14.04 LTSâ,
+â14.10â and â15.04â and will download all the software required to both
compile LilyPond and build the documentation.
- * Download and install all the LilyPond build-dependencies
+ ⢠Download and install all the LilyPond build-dependencies
(approximately 200MB);
sudo apt-get build-dep lilypond
- * Download and install additional `build' tools required for
+ ⢠Download and install additional âbuildâ tools required for
compiling;
sudo apt-get install autoconf fonts-texgyre texlive-lang-cyrillic
- * Although not `required' to compile LilyPond, if you intend to
- contribute to LilyPond (codebase or help improve the
- documentation) then it is recommended that you also need to
- install `git'.
+ ⢠Although not ârequiredâ to compile LilyPond, if you intend to
+ contribute to LilyPond (codebase or help improve the documentation)
+ then it is recommended that you also need to install âgitâ.
sudo apt-get install git
- Also see *note Starting with Git: (lilypond-notation)Starting with
- Git.
+ Also see *note (lilypond-notation)Starting with Git::.
- * To use the `lily-git.tcl' GUI;
+ ⢠To use the âlily-git.tclâ GUI;
sudo apt-get install tk
- Also see *note lily-git: (lilypond-notation)lily-git.
-
+ Also see *note (lilypond-notation)lily-git::.
- Note: By default, when building LilyPond's documentation,
- `pdfTeX' is be used. However ligatures (fi, fl, ff etc.) may
+ Note: By default, when building LilyPondâs documentation,
+ âpdfTeXâ is be used. However ligatures (fi, fl, ff etc.) may
not be printed in the PDF output. In this case XeTeX can be
- used instead. Download and install the `texlive-xetex'
+ used instead. Download and install the âtexlive-xetexâ
package.
sudo apt-get install texlive-xetex
The scripts used to build the LilyPond documentation will use
- `XeTex' instead of `pdfTex' to generate the PDF documents if
+ âXeTexâ instead of âpdfTexâ to generate the PDF documents if
it is available. No additional configuration is required.
Other
@@ -368,69 +349,69 @@ Other
The following individual software packages are required just to compile
LilyPond.
- * GNU Autoconf (http://www.gnu.org/software/autoconf)
+ ⢠GNU Autoconf (http://www.gnu.org/software/autoconf)
- * GNU Bison (http://www.gnu.org/software/bison/)
+ ⢠GNU Bison (http://www.gnu.org/software/bison/)
- Use version `2.0' or newer.
+ Use version â2.0â or newer.
- * GNU Compiler Collection (http://gcc.gnu.org/)
+ ⢠GNU Compiler Collection (http://gcc.gnu.org/)
- Use version `3.4' or newer (`4.x' recommended).
+ Use version â3.4â or newer (â4.xâ recommended).
- * Flex (http://flex.sourceforge.net/)
+ ⢠Flex (http://flex.sourceforge.net/)
- * FontForge (http://fontforge.sf.net/)
+ ⢠FontForge (http://fontforge.sf.net/)
- Use version `20060125' or newer (we recommend using at least
- `20100501'); it must also be compiled with the `--enable-double'
+ Use version â20060125â or newer (we recommend using at least
+ â20100501â); it must also be compiled with the â--enable-doubleâ
switch, else this can lead to inaccurate intersection calculations
which end up with poorly-rendered glyphs in the output.
- * GNU gettext (http://www.gnu.org/software/gettext/gettext.html)
+ ⢠GNU gettext (http://www.gnu.org/software/gettext/gettext.html)
- Use version `0.17' or newer.
+ Use version â0.17â or newer.
- * GNU Make (http://www.gnu.org/software/make/)
+ ⢠GNU Make (http://www.gnu.org/software/make/)
- Use version `3.78' or newer.
+ Use version â3.78â or newer.
- * MetaFont (http://metafont.tutorial.free.fr/)
+ ⢠MetaFont (http://metafont.tutorial.free.fr/)
- The `mf-nowin', `mf', `mfw' or `mfont' binaries are usually
+ The âmf-nowinâ, âmfâ, âmfwâ or âmfontâ binaries are usually
packaged along with TeX (http://www.latex-project.org/ftp.html).
- * MetaPost (http://cm.bell-labs.com/who/hobby/MetaPost.html)
+ ⢠MetaPost (http://cm.bell-labs.com/who/hobby/MetaPost.html)
- The `mpost' binary is also usually packaged with TeX
+ The âmpostâ binary is also usually packaged with TeX
(http://www.latex-project.org/ftp.html).
- * Perl (http://www.perl.org/)
+ ⢠Perl (http://www.perl.org/)
- * Texinfo (http://www.gnu.org/software/texinfo/)
+ ⢠Texinfo (http://www.gnu.org/software/texinfo/)
- Use version `4.11' or newer.
+ Use version â4.11â or newer.
- * Type 1 utilities (http://www.lcdf.org/~eddietwo/type/#t1utils)
+ ⢠Type 1 utilities (http://www.lcdf.org/~eddietwo/type/#t1utils)
- Use version `1.33' or newer.
+ Use version â1.33â or newer.
- * Cyrillic fonts (https://www.ctan.org/pkg/cyrillic?lang=en)
+ ⢠Cyrillic fonts (https://www.ctan.org/pkg/cyrillic?lang=en)
- Often packaged in repositories as `texlive-lang-cyrillic'.
+ Often packaged in repositories as âtexlive-lang-cyrillicâ.
- * TeX Gyre `OTF' font packages. As of LilyPond version `2.19.26',
+ ⢠TeX Gyre âOTFâ font packages. As of LilyPond version â2.19.26â,
the previous default serif, san serif and monospace fonts now use
- Tex Gyre's _Schola_, _Heros_ and _Cursor_ fonts respectively.
- Also See *note Fonts: (lilypond-notation)Fonts.
+ Tex Gyreâs _Schola_, _Heros_ and _Cursor_ fonts respectively. Also
+ See *note (lilypond-notation)Fonts::.
- Some distributions do not always provide `OTF' font files in the
+ Some distributions do not always provide âOTFâ font files in the
Tex Gyre packages from their repositories. Use the command
- `fc-list | grep texgyre' to list the fonts available to your system
- and check that the appropriate `*.otf' files are reported. If they
- are not then download and manually extract the `OTF' files to
- either your local `~/.fonts/' directory or use the `configure'
- command and the `--with-texgyre-dir=/path_to_otf_files/' option.
+ âfc-list | grep texgyreâ to list the fonts available to your system
+ and check that the appropriate â*.otfâ files are reported. If they
+ are not then download and manually extract the âOTFâ files to
+ either your local â~/.fonts/â directory or use the âconfigureâ
+ command and the â--with-texgyre-dir=/path_to_otf_files/â option.
The following font families are required:
@@ -439,38 +420,37 @@ LilyPond.
and Cursor
(http://www.gust.org.pl/projects/e-foundry/tex-gyre/cursor).
-
1.2.3 Requirements for building documentation
---------------------------------------------
The entire set of documentation for the most current build of LilyPond
is available online at
-`http://lilypond.org/doc/v2.19/Documentation/web/development', but you
-can also build them locally from the source code. This process
-requires some additional tools and packages.
+, but you
+can also build them locally from the source code. This process requires
+some additional tools and packages.
Note: If the instructions for one of the previously listed
- Linux in the previous section (*note Requirements for
- compiling LilyPond: (lilypond-contributor)Requirements for
- compiling LilyPond.) have been used, then the following can
- be ignored as the software should already be installed.
+ Linux in the previous section (*note
+ (lilypond-contributor)Requirements for compiling LilyPond::)
+ have been used, then the following can be ignored as the
+ software should already be installed.
- * Everything listed in *note Requirements for compiling LilyPond::
+ ⢠Everything listed in *note Requirements for compiling LilyPond::
- * ImageMagick (http://www.imagemagick.org/)
+ ⢠ImageMagick (http://www.imagemagick.org/)
- * Netpbm (http://netpbm.sourceforge.net/)
+ ⢠Netpbm (http://netpbm.sourceforge.net/)
- * gzip (http://gzip.org/)
+ ⢠gzip (http://gzip.org/)
- * rsync (http://rsync.samba.org/)
+ ⢠rsync (http://rsync.samba.org/)
- * Texi2HTML (http://www.nongnu.org/texi2html/)
+ ⢠Texi2HTML (http://www.nongnu.org/texi2html/)
- Use version `1.82'. Later versions will not work.
+ Use version â1.82â. Later versions will not work.
- Download `texi2html 1.82' directly from:
- `http://download.savannah.gnu.org/releases/texi2html/texi2html-1.82.tar.gz';
+ Download âtexi2html 1.82â directly from:
+ ;
Extract the files into an appropriate location and then run the
commands;
@@ -480,11 +460,11 @@ requires some additional tools and packages.
sudo make install
Now verify that your operating system is able to see the correct
- version of `texi2html'.
+ version of âtexi2htmlâ.
texi2html --version
- * Fonts required to build the documentation in addition to those
+ ⢠Fonts required to build the documentation in addition to those
required to run LilyPond:
gsfonts
@@ -496,13 +476,12 @@ requires some additional tools and packages.
texlive-fonts-recommended
ttf-xfree86-nonfree
-
- Note: By default, when building LilyPond's documentation,
- `pdfTeX' is be used. However ligatures (fi, fl, ff etc.) may
+ Note: By default, when building LilyPondâs documentation,
+ âpdfTeXâ is be used. However ligatures (fi, fl, ff etc.) may
not be printed in the PDF output. In this case XeTeX can be
- used instead. Download and install the `texlive-xetex'
- package. The scripts used to build the LilyPond documentation
- will use `XeTex' instead of `pdfTex' to generate the PDF
+ used instead. Download and install the âtexlive-xetexâ
+ package. The scripts used to build the LilyPond documentation
+ will use âXeTexâ instead of âpdfTexâ to generate the PDF
documents if it is available. No additional configuration is
required.
@@ -514,7 +493,7 @@ Downloading the Git repository
In general, developers compile LilyPond from within a local Git
repository. Setting up a local Git repository is explained in *note
-Starting with Git: (lilypond-contributor)Starting with Git.
+(lilypond-contributor)Starting with Git::.
Downloading a source tarball
----------------------------
@@ -522,7 +501,7 @@ Downloading a source tarball
Packagers are encouraged to use source tarballs for compiling.
The tarball for the latest stable release is available on the *note
-Source: (lilypond-web)Source. page.
+(lilypond-web)Source:: page.
The latest source code snapshot
(http://git.savannah.gnu.org/gitweb/?p=lilypond.git;a=snapshot) is also
@@ -531,14 +510,14 @@ available as a tarball from the GNU Savannah Git server.
All tagged releases (including legacy stable versions and the most
recent development release) are available here:
- `http://download.linuxaudio.org/lilypond/source/'
+
- Download the tarball to your `~/src/' directory, or some other
+ Download the tarball to your â~/src/â directory, or some other
appropriate place.
Note: Be careful where you unpack the tarball! Any
- subdirectories of the current folder named `lilypond/' or
- `lilypond-X.Y.Z/' (where X.Y.Z is the release number) will be
+ subdirectories of the current folder named âlilypond/â or
+ âlilypond-X.Y.Z/â (where X.Y.Z is the release number) will be
overwritten if there is a name clash with the tarball.
Unpack the tarball with this command:
@@ -546,23 +525,23 @@ appropriate place.
tar -xzf lilypond-X.Y.Z.tar.gz
This creates a subdirectory within the current directory called
-`lilypond-X.Y.Z/'. Once unpacked, the source files occupy about 40 MB
+âlilypond-X.Y.Z/â. Once unpacked, the source files occupy about 40 MB
of disk space.
- Windows users wanting to look at the source code may have to
-download and install the free-software 7zip archiver
-(http://www.7-zip.org) to extract the tarball.
+ Windows users wanting to look at the source code may have to download
+and install the free-software 7zip archiver (http://www.7-zip.org) to
+extract the tarball.
-1.4 Configuring `make'
+1.4 Configuring âmakeâ
======================
-1.4.1 Running `./autogen.sh'
+1.4.1 Running â./autogen.shâ
----------------------------
After you unpack the tarball (or download the Git repository), the
contents of your top source directory should be similar to the current
source tree listed at
-`http://git.sv.gnu.org/gitweb/?p=lilypond.git;a=tree'.
+.
Next, you need to create the generated files; enter the following
command from your top source directory:
@@ -570,7 +549,7 @@ command from your top source directory:
./autogen.sh --noconfigure
This will generate a number of files and directories to aid
-configuration, such as `configure', `README.txt', etc.
+configuration, such as âconfigureâ, âREADME.txtâ, etc.
Next, create the build directory with:
@@ -580,32 +559,32 @@ configuration, such as `configure', `README.txt', etc.
We heavily recommend building lilypond inside a separate directory
with this method.
-1.4.2 Running `../configure'
+1.4.2 Running â../configureâ
----------------------------
Configuration options
.....................
- Note: make sure that you are in the `build/' subdirectory of
+ Note: make sure that you are in the âbuild/â subdirectory of
your source tree.
-The `../configure' command (generated by `./autogen.sh') provides many
-options for configuring `make'. To see them all, run:
+ The â../configureâ command (generated by â./autogen.shâ) provides
+many options for configuring âmakeâ. To see them all, run:
../configure --help
Checking build dependencies
...........................
- Note: make sure that you are in the `build/' subdirectory of
+ Note: make sure that you are in the âbuild/â subdirectory of
your source tree.
-When `../configure' is run without any arguments, it will check to make
-sure your system has everything required for compilation:
+ When â../configureâ is run without any arguments, it will check to
+make sure your system has everything required for compilation:
../configure
- If any build dependency is missing, `../configure' will return with:
+ If any build dependency is missing, â../configureâ will return with:
ERROR: Please install required programs: FOO
@@ -617,7 +596,7 @@ only needed for building the documentation:
If you intend to build the documentation locally, you will need to
install or update these programs accordingly.
- Note: `../configure' may fail to issue warnings for certain
+ Note: â../configureâ may fail to issue warnings for certain
documentation build requirements that are not met. If you
experience problems when building the documentation, you may
need to do a manual check of *note Requirements for building
@@ -626,95 +605,91 @@ install or update these programs accordingly.
Configuring target directories
..............................
- Note: make sure that you are in the `build/' subdirectory of
+ Note: make sure that you are in the âbuild/â subdirectory of
your source tree.
-If you intend to use your local build to install a local copy of the
-program, you will probably want to configure the installation
-directory. Here are the relevant lines taken from the output of
-`../configure --help':
+ If you intend to use your local build to install a local copy of the
+program, you will probably want to configure the installation directory.
+Here are the relevant lines taken from the output of
+â../configure --helpâ:
- By default, ``make install'' will install all the files in
- `/usr/local/bin', `/usr/local/lib' etc. You can specify an
- installation prefix other than `/usr/local' using ``--prefix'',
- for instance ``--prefix=$HOME''.
+ By default, ââmake installââ will install all the files in
+ â/usr/local/binâ, â/usr/local/libâ etc. You can specify an
+ installation prefix other than â/usr/localâ using ââ--prefixââ, for
+ instance ââ--prefix=$HOMEââ.
- A typical installation prefix is `$HOME/usr':
+ A typical installation prefix is â$HOME/usrâ:
../configure --prefix=$HOME/usr
Note that if you plan to install a local build on a system where you
do not have root privileges, you will need to do something like this
-anyway--`make install' will only succeed if the installation prefix
-points to a directory where you have write permission (such as your
-home directory). The installation directory will be automatically
-created if necessary.
+anywayââmake installâ will only succeed if the installation prefix
+points to a directory where you have write permission (such as your home
+directory). The installation directory will be automatically created if
+necessary.
- The location of the `lilypond' command installed by this process
-will be `PREFIX/bin/lilypond'; you may want to add `PREFIX/bin/' to
-your `$PATH' if it is not already included.
+ The location of the âlilypondâ command installed by this process will
+be âPREFIX/bin/lilypondâ; you may want to add âPREFIX/bin/â to your
+â$PATHâ if it is not already included.
It is also possible to specify separate installation directories for
different types of program files. See the full output of
-`../configure --help' for more information.
+â../configure --helpâ for more information.
If you encounter any problems, please see *note Problems::.
1.5 Compiling LilyPond
======================
-1.5.1 Using `make'
+1.5.1 Using âmakeâ
------------------
- Note: make sure that you are in the `build/' subdirectory of
+ Note: make sure that you are in the âbuild/â subdirectory of
your source tree.
-LilyPond is compiled with the `make' command. Assuming `make' is
+ LilyPond is compiled with the âmakeâ command. Assuming âmakeâ is
configured properly, you can simply run:
make
- `make' is short for `make all'. To view a list of `make' targets,
+ âmakeâ is short for âmake allâ. To view a list of âmakeâ targets,
run:
make help
- TODO: Describe what `make' actually does.
-
+ TODO: Describe what âmakeâ actually does.
See also
........
-
-
- *note Generating documentation:: provides more info on the `make'
+ *note Generating documentation:: provides more info on the âmakeâ
targets used to build the LilyPond documentation.
-1.5.2 Saving time with the `-j' option
+1.5.2 Saving time with the â-jâ option
--------------------------------------
-If your system has multiple CPUs, you can speed up compilation by
-adding `-jX' to the `make' command, where `X' is one more than the
-number of cores you have. For example, a typical Core2Duo machine
-would use:
+If your system has multiple CPUs, you can speed up compilation by adding
+â-jXâ to the âmakeâ command, where âXâ is one more than the number of
+cores you have. For example, a typical Core2Duo machine would use:
make -j3
- If you get errors using the `-j' option, and `make' succeeds without
-it, try lowering the `X' value.
+ If you get errors using the â-jâ option, and âmakeâ succeeds without
+it, try lowering the âXâ value.
- Because multiple jobs run in parallel when `-j' is used, it can be
+ Because multiple jobs run in parallel when â-jâ is used, it can be
difficult to determine the source of an error when one occurs. In that
-case, running `make' without the `-j' is advised.
+case, running âmakeâ without the â-jâ is advised.
1.5.3 Compiling for multiple platforms
--------------------------------------
If you want to build multiple versions of LilyPond with different
-configuration settings, you can use the `--enable-config=CONF' option
-of `configure'. You should use `make conf=CONF' to generate the output
-in `out-CONF'. For example, suppose you want to build with and without
+configuration settings, you can use the â--enable-config=CONFâ option of
+âconfigureâ. You should use âmake conf=CONFâ to generate the output in
+âout-CONFâ. For example, suppose you want to build with and without
profiling, then use the following for the normal build
./configure --prefix=$HOME/usr/ --enable-checking
@@ -726,8 +701,8 @@ profiling, then use the following for the normal build
--enable-config=prof --disable-checking
make conf=prof
- If you wish to install a copy of the build with profiling, don't
-forget to use `conf=CONF' when issuing `make install':
+ If you wish to install a copy of the build with profiling, donât
+forget to use âconf=CONFâ when issuing âmake installâ:
make conf=prof install
@@ -735,15 +710,13 @@ forget to use `conf=CONF' when issuing `make install':
See also
........
-
-
*note Installing LilyPond from a local build::
-1.5.4 Useful `make' variables
+1.5.4 Useful âmakeâ variables
-----------------------------
-If a less verbose build output if desired, the variable `QUIET_BUILD'
-may be set to `1' on `make' command line, or in `local.make' at top of
+If a less verbose build output if desired, the variable âQUIET_BUILDâ
+may be set to â1â on âmakeâ command line, or in âlocal.makeâ at top of
the build tree.
1.6 Post-compilation options
@@ -752,17 +725,17 @@ the build tree.
1.6.1 Installing LilyPond from a local build
--------------------------------------------
-If you configured `make' to install your local build in a directory
+If you configured âmakeâ to install your local build in a directory
where you normally have write permission (such as your home directory),
-and you have compiled LilyPond by running `make', you can install the
+and you have compiled LilyPond by running âmakeâ, you can install the
program in your target directory by running:
make install
If instead, your installation directory is not one that you can
-normally write to (such as the default `/usr/local/', which typically
-is only writeable by the superuser), you will need to temporarily
-become the superuser when running `make install':
+normally write to (such as the default â/usr/local/â, which typically is
+only writeable by the superuser), you will need to temporarily become
+the superuser when running âmake installâ:
sudo make install
@@ -770,23 +743,23 @@ or...
su -c 'make install'
- If you don't have superuser privileges, then you need to configure
+ If you donât have superuser privileges, then you need to configure
the installation directory to one that you can write to, and then
re-install. See *note Configuring target directories::.
1.6.2 Generating documentation
------------------------------
-Documentation editor's edit/compile cycle
+Documentation editorâs edit/compile cycle
.........................................
- * Initial documentation build:
+ ⢠Initial documentation build:
make [-jX]
make [-jX CPU_COUNT=X] doc _## can take an hour or more_
make [-jX CPU_COUNT=X] doc-stage-1 _## to build only PDF documentation_
- * Edit/compile cycle:
+ ⢠Edit/compile cycle:
_## edit source files, then..._
@@ -795,21 +768,20 @@ Documentation editor's edit/compile cycle
_## for finding Texinfo errors._
make [-jX CPU_COUNT=X] doc _## usually faster than initial build._
- * Reset:
+ ⢠Reset:
It is generally possible to remove the compiled documentation from
- your system with `make doc-clean', but this method is not 100%
+ your system with âmake doc-cleanâ, but this method is not 100%
guaranteed. Instead, if you want to be sure you have a clean
- system, we recommend that you delete your `build/' directory, and
+ system, we recommend that you delete your âbuild/â directory, and
begin compiling from scratch. Since the documentation compile
- takes much longer than the non-documentation compile, this does
- not increase the overall time by a great deal.
-
+ takes much longer than the non-documentation compile, this does not
+ increase the overall time by a great deal.
Building documentation
......................
-After a successful compile (using `make'), the documentation can be
+After a successful compile (using âmakeâ), the documentation can be
built by issuing:
make doc
@@ -818,32 +790,31 @@ built by issuing:
make doc-stage-1
- Note: The first time you run `make doc', the process can
+ Note: The first time you run âmake docâ, the process can
easily take an hour or more with not much output on the
command line.
- After this initial build, `make doc' only makes changes to the
+ After this initial build, âmake docâ only makes changes to the
documentation where needed, so it may only take a minute or two to test
changes if the documentation is already built.
- If `make doc' succeeds, the HTML documentation tree is available in
-`out-www/offline-root/', and can be browsed locally. Various portions
-of the documentation can be found by looking in `out/' and `out-www'
+ If âmake docâ succeeds, the HTML documentation tree is available in
+âout-www/offline-root/â, and can be browsed locally. Various portions
+of the documentation can be found by looking in âout/â and âout-wwwâ
subdirectories in other places in the source tree, but these are only
_portions_ of the docs. Please do not complain about anything which is
broken in those places; the only complete set of documentation is in
-`out-www/offline-root/' from the top of the source tree.
+âout-www/offline-root/â from the top of the source tree.
- `make doc' sends the output from most of the compilation to
-logfiles. If the build fails for any reason, it should prompt you with
-the name of a logfile which will provide information to help you work
-out why the build failed. These logfiles are not deleted with
-`make doc-clean'. To remove all the logfiles generated by the
-compilation process, use:
+ âmake docâ sends the output from most of the compilation to logfiles.
+If the build fails for any reason, it should prompt you with the name of
+a logfile which will provide information to help you work out why the
+build failed. These logfiles are not deleted with âmake doc-cleanâ. To
+remove all the logfiles generated by the compilation process, use:
make log-clean
- `make doc' compiles the documents for all languages. To save some
+ âmake docâ compiles the documents for all languages. To save some
compile time, the English language documents can be compiled on their
own with:
@@ -863,8 +834,8 @@ separately by issuing:
make info
An issue when switching branches between master and translation is the
-appearance/disappearance of translated versions of some manuals. If
-you see such a warning from make:
+appearance/disappearance of translated versions of some manuals. If you
+see such a warning from make:
No rule to make target `X', needed by `Y'
@@ -873,8 +844,8 @@ Your best bet is to delete the file Y.dep and to try again.
Building a single document
..........................
-It's possible to build a single document. For example, to rebuild only
-`contributor.pdf', do the following:
+Itâs possible to build a single document. For example, to rebuild only
+âcontributor.pdfâ, do the following:
cd build/
cd Documentation/
@@ -883,30 +854,29 @@ It's possible to build a single document. For example, to rebuild only
If you are only working on a single document, test-building it in
this way can give substantial time savings - recreating
-`contributor.pdf', for example, takes a matter of seconds.
+âcontributor.pdfâ, for example, takes a matter of seconds.
-Saving time with `CPU_COUNT'
+Saving time with âCPU_COUNTâ
............................
The most time consuming task for building the documentation is running
LilyPond to build images of music, and there cannot be several
-simultaneously running `lilypond-book' instances, so the `-j' `make'
-option does not significantly speed up the build process. To help
-speed it up, the makefile variable `CPU_COUNT' may be set in
-`local.make' or on the command line to the number of `.ly' files that
-LilyPond should process simultaneously, e.g. on a bi-processor or dual
-core machine:
+simultaneously running âlilypond-bookâ instances, so the â-jâ âmakeâ
+option does not significantly speed up the build process. To help speed
+it up, the makefile variable âCPU_COUNTâ may be set in âlocal.makeâ or
+on the command line to the number of â.lyâ files that LilyPond should
+process simultaneously, e.g. on a bi-processor or dual core machine:
make -j3 CPU_COUNT=3 doc
-The recommended value of `CPU_COUNT' is one plus the number of cores or
-processors, but it is advisable to set it to a smaller value unless
-your system has enough RAM to run that many simultaneous LilyPond
-instances. Also, values for the `-j' option that pose problems with
-`make' are less likely to pose problems with `make doc' (this applies
-to both `-j' and `CPU_COUNT'). For example, with a quad-core processor,
-it is possible for `make -j5 CPU_COUNT=5 doc' to work consistently even
-if `make -j5' rarely succeeds.
+The recommended value of âCPU_COUNTâ is one plus the number of cores or
+processors, but it is advisable to set it to a smaller value unless your
+system has enough RAM to run that many simultaneous LilyPond instances.
+Also, values for the â-jâ option that pose problems with âmakeâ are less
+likely to pose problems with âmake docâ (this applies to both â-jâ and
+âCPU_COUNTâ). For example, with a quad-core processor, it is possible
+for âmake -j5 CPU_COUNT=5 docâ to work consistently even if âmake -j5â
+rarely succeeds.
AJAX search
...........
@@ -938,19 +908,19 @@ installation of Info documentation are printed on standard output.
make install-info
-Note that to get the images in Info documentation, `install-doc' target
+Note that to get the images in Info documentation, âinstall-docâ target
creates symbolic links to HTML and PDF installed documentation tree in
-`PREFIX/share/info', in order to save disk space, whereas
-`install-info' copies images in `PREFIX/share/info' subdirectories.
+âPREFIX/share/infoâ, in order to save disk space, whereas âinstall-infoâ
+copies images in âPREFIX/share/infoâ subdirectories.
It is possible to build a documentation tree in
-`out-www/online-root/', with special processing, so it can be used on a
+âout-www/online-root/â, with special processing, so it can be used on a
website with content negotiation for automatic language selection; this
can be achieved by issuing
make WEB_TARGETS=online doc
-and both `offline' and `online' targets can be generated by issuing
+and both âofflineâ and âonlineâ targets can be generated by issuing
make WEB_TARGETS="offline online" doc
@@ -961,10 +931,10 @@ available with
make help
from every directory in the build tree. Most targets for documentation
-maintenance are available from `Documentation/'; for more information,
-see *note Documentation work: (lilypond-contributor)Documentation work.
+maintenance are available from âDocumentation/â; for more information,
+see *note (lilypond-contributor)Documentation work::.
- The makefile variable `QUIET_BUILD' may be set to `1' for a less
+ The makefile variable âQUIET_BUILDâ may be set to â1â for a less
verbose build output, just like for building the programs.
Building documentation without compiling
@@ -980,14 +950,14 @@ binary, if LilyPond is already installed on your system.
make -C scripts && make -C python
nice make LILYPOND_EXTERNAL_BINARY=/path/to/bin/lilypond doc
- Please note that this may break sometimes - for example, if a new
+ Please note that this may break sometimes â for example, if a new
feature is added with a test file in input/regression, even the latest
development release of LilyPond will fail to build the docs.
- You may build the manual without building all the `input/*' stuff
-(i.e. mostly regression tests): change directory, for example to
-`Documentation/', issue `make doc', which will build documentation in a
-subdirectory `out-www' from the source files in current directory. In
+ You may build the manual without building all the âinput/*â stuff
+(i.e. mostly regression tests): change directory, for example to
+âDocumentation/â, issue âmake docâ, which will build documentation in a
+subdirectory âout-wwwâ from the source files in current directory. In
this case, if you also want to browse the documentation in its
post-processed form, change back to top directory and issue
@@ -997,7 +967,7 @@ post-processed form, change back to top directory and issue
Known issues and warnings
.........................
-You may also need to create a script for `pngtopnm' and `pnmtopng'. On
+You may also need to create a script for âpngtopnmâ and âpnmtopngâ. On
GNU/Linux, I use this:
export LD_LIBRARY_PATH=/usr/lib
@@ -1028,20 +998,20 @@ make test
been verified.
More information on the regression test suite is found at *note
-Regression tests: (lilypond-contributor)Regression tests.
+(lilypond-contributor)Regression tests::.
1.7 Problems
============
-For help and questions use . Send bug reports
-to .
+For help and questions use . Send bug reports to
+.
Bugs that are not fault of LilyPond are documented here.
Compiling on MacOS X
--------------------
-Here are special instructions for compiling under MacOS X. These
+Here are special instructions for compiling under MacOS X. These
instructions assume that dependencies are installed using MacPorts.
(http://www.macports.org/) The instructions have been tested using OS X
10.5 (Leopard).
@@ -1049,13 +1019,13 @@ instructions assume that dependencies are installed using MacPorts.
First, install the relevant dependencies using MacPorts.
Next, add the following to your relevant shell initialization files.
-This is `~/.profile' by default. You should create this file if it
-does not exist.
+This is â~/.profileâ by default. You should create this file if it does
+not exist.
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
export DYLD_FALLBACK_LIBRARY_PATH=/opt/local/lib:$DYLD_FALLBACK_LIBRARY_PATH
- Now you must edit the generated `config.make' file. Change
+ Now you must edit the generated âconfig.makeâ file. Change
FLEXLEXER_FILE = /usr/include/FlexLexer.h
@@ -1064,9 +1034,9 @@ to:
FLEXLEXER_FILE = /opt/local/include/FlexLexer.h
At this point, you should verify that you have the appropriate fonts
-installed with your ghostscript installation. Check `ls
-/opt/local/share/ghostscript/fonts' for: 'c0590*' files (.pfb, .pfb and
-.afm). If you don't have them, run the following commands to grab them
+installed with your ghostscript installation. Check âls
+/opt/local/share/ghostscript/fontsâ for: âc0590*â files (.pfb, .pfb and
+.afm). If you donât have them, run the following commands to grab them
from the ghostscript SVN server and install them in the appropriate
location:
@@ -1074,7 +1044,7 @@ location:
sudo mv urw-fonts-1.0.7pre44/* /opt/local/share/ghostscript/fonts/
rm -rf urw-fonts-1.07pre44
- Now run the `./configure' script. To avoid complications with
+ Now run the â./configureâ script. To avoid complications with
automatic font detection, add
--with-fonts-dir=/opt/local/share/ghostscript/fonts
@@ -1084,8 +1054,8 @@ Solaris
Solaris7, ./configure
- `./configure' needs a POSIX compliant shell. On Solaris7, `/bin/sh'
-is not yet POSIX compliant, but `/bin/ksh' or bash is. Run configure
+ â./configureâ needs a POSIX compliant shell. On Solaris7, â/bin/shâ
+is not yet POSIX compliant, but â/bin/kshâ or bash is. Run configure
like
CONFIG_SHELL=/bin/ksh ksh -c ./configure
@@ -1097,11 +1067,11 @@ or
FreeBSD
-------
-To use system fonts, dejaview must be installed. With the default
-port, the fonts are installed in `usr/X11R6/lib/X11/fonts/dejavu'.
+To use system fonts, dejaview must be installed. With the default port,
+the fonts are installed in âusr/X11R6/lib/X11/fonts/dejavuâ.
- Open the file `$LILYPONDBASE/usr/etc/fonts/local.conf' and add the
-following line just after the `' line. (Adjust as necessary
+ Open the file â$LILYPONDBASE/usr/etc/fonts/local.confâ and add the
+following line just after the ââ line. (Adjust as necessary
for your hierarchy.)
/usr/X11R6/lib/X11/fonts
@@ -1112,7 +1082,7 @@ International fonts
On Mac OS X, all fonts are installed by default. However, finding all
system fonts requires a bit of configuration; see this post
(http://lists.gnu.org/archive/html/lilypond-user/2007-03/msg00472.html)
-on the `lilypond-user' mailing list.
+on the âlilypond-userâ mailing list.
On Linux, international fonts are installed by different means on
every distribution. We cannot list the exact commands or packages that
@@ -1133,42 +1103,42 @@ Debian GNU/Linux
Using lilypond python libraries
-------------------------------
-If you want to use lilypond's python libraries (either running certain
+If you want to use lilypondâs python libraries (either running certain
build scripts manually, or using them in other programs), set
-`PYTHONPATH' to `python/out' in your build directory, or
-`.../usr/lib/lilypond/current/python' in the installation directory
+âPYTHONPATHâ to âpython/outâ in your build directory, or
+â.../usr/lib/lilypond/current/pythonâ in the installation directory
structure.
1.8 Concurrent stable and development versions
==============================================
-It can be useful to have both the stable and the development versions
-of Lilypond available at once. One way to do this on GNU/Linux is to
+It can be useful to have both the stable and the development versions of
+LilyPond available at once. One way to do this on GNU/Linux is to
install the stable version using the precompiled binary, and run the
-development version from the source tree. After running `make all'
-from the top directory of the Lilypond source files, there will be a
-binary called `lilypond' in the `out' directory:
+development version from the source tree. After running âmake allâ from
+the top directory of the LilyPond source files, there will be a binary
+called âlilypondâ in the âoutâ directory:
/lilypond/out/bin/lilypond
- This binary can be run without actually doing the `make install'
+ This binary can be run without actually doing the âmake installâ
command. The advantage to this is that you can have all of the latest
-changes available after pulling from git and running `make all',
-without having to uninstall the old version and reinstall the new.
+changes available after pulling from git and running âmake allâ, without
+having to uninstall the old version and reinstall the new.
- So, to use the stable version, install it as usual and use the
-normal commands:
+ So, to use the stable version, install it as usual and use the normal
+commands:
lilypond foobar.ly
To use the development version, create a link to the binary in the
source tree by saving the following line in a file somewhere in your
-`$PATH':
+â$PATHâ:
exec /lilypond/out/bin/lilypond "$@"
- Save it as `Lilypond' (with a capital L to distinguish it from the
-stable `lilypond'), and make it executable:
+ Save it as âLilypondâ (with a capital L to distinguish it from the
+stable âlilypondâ), and make it executable:
chmod +x Lilypond
@@ -1189,16 +1159,15 @@ by us. Hopefully this will change in the future.
Version-specific texinfo macros
-------------------------------
- * made with `scripts/build/create-version-itexi.py' and
- `scripts/build/create-weblinks-itexi.py'
+ ⢠made with âscripts/build/create-version-itexi.pyâ and
+ âscripts/build/create-weblinks-itexi.pyâ
- * used extensively in the `WEBSITE_ONLY_BUILD' version of the
- website (made with `website.make', used on lilypond.org)
+ ⢠used extensively in the âWEBSITE_ONLY_BUILDâ version of the website
+ (made with âwebsite.makeâ, used on lilypond.org)
- * not (?) used in the main docs?
+ ⢠not (?) used in the main docs?
- * the numbers in VERSION file: MINOR_VERSION should be 1 more than
+ ⢠the numbers in VERSION file: MINOR_VERSION should be 1 more than
the last release, VERSION_DEVEL should be the last *online*
release. Yes, VERSION_DEVEL is less than VERSION.
-
diff --git a/NEWS.txt b/NEWS.txt
index 33fc4d64f8..0aac6fc370 100644
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -1,61 +1,71 @@
New features in 2.20 since 2.18
*******************************
- * Blocks introduced with `\header' can be stored in variables and
+ ⢠Slurs and phrasing slurs may now be started from individual notes
+ in a chord. Several simultanous slurs per âVoiceâ need to be
+ distinguished by âspanner-idâ setting.
+
+ ⢠The music and grob property âspanner-idâ for distinguishing
+ simultaneous slurs and phrasing slurs has been changed from a
+ string to a âkeyâ, a non-negative integer or symbol.
+
+ ⢠There is a new command â\=â for specifying the âspanner-idâ for
+ simultaneous slurs and phrasing slurs.
+ \fixed c' {
+ 2
+ }
+ image of music
+
+ ⢠Blocks introduced with â\headerâ can be stored in variables and
used as arguments to music and scheme functions and as the body of
- `#{...#}' constructs. They are represented as a Guile module.
+ â#{...#}â constructs. They are represented as a Guile module.
- While `\book', `\bookpart', `\score', `\with', `\layout', `\midi',
- `\paper' blocks can be passed around in similar manner, they are
+ While â\bookâ, â\bookpartâ, â\scoreâ, â\withâ, â\layoutâ, â\midiâ,
+ â\paperâ blocks can be passed around in similar manner, they are
represented by different data types.
- * Dot-separated symbol lists like `FretBoard.stencil' were already
+ ⢠Dot-separated symbol lists like âFretBoard.stencilâ were already
supported as of version 2.18. They may now also contain unsigned
integers, and may alternatively be separated by commata. This
allows usage such as
-
{ \time 2,2,1 5/8 g'8 8 8 8 8 }
- [image of music]
-
+ image of music
and
- \tagGroup violin,oboe,bassoon
+ \tagGroup violin,oboe,bassoon
- * Such lists may also be used in expressions for assignments, sets,
+ ⢠Such lists may also be used in expressions for assignments, sets,
and overrides. This allows usage such as
-
{ \unset Timing.beamExceptions
\set Timing.beatStructure = 1,2,1
g'8 8 8 8 8 8 8 8 }
- [image of music]
-
+ image of music
- * Association list elements could previously be assigned values
+ ⢠Association list elements could previously be assigned values
individually (for example, paper variables like
- `system-system-spacing.basic-distance'). They may now be also
+ âsystem-system-spacing.basic-distanceâ). They may now be also
referenced in this manner, as with
- \paper {
- \void \displayScheme \system-system-spacing.basic-distance
- }
+ \paper {
+ \void \displayScheme \system-system-spacing.basic-distance
+ }
In combination with the previously mentioned changes, this allows
- setting and referencing pseudovariables like `violin.1'.
+ setting and referencing pseudovariables like âviolin.1â.
- * LilyPond source files may now be embedded inside the generated PDF
- files. This experimental feature is disabled by default and may
- be regarded as unsafe, as PDF documents with hidden content tend
- to present a security risk. Please note that not all PDF viewers
- have the ability to handle embedded documents (if not, the PDF
- output will appear normally and source files will remain
- invisible). This feature only works with the PDF backend.
+ ⢠LilyPond source files may now be embedded inside the generated PDF
+ files. This experimental feature is disabled by default and may be
+ regarded as unsafe, as PDF documents with hidden content tend to
+ present a security risk. Please note that not all PDF viewers have
+ the ability to handle embedded documents (if not, the PDF output
+ will appear normally and source files will remain invisible). This
+ feature only works with the PDF backend.
- * French note names are now defined specifically instead of being
+ ⢠French note names are now defined specifically instead of being
aliased to Italian note names: in addition to the generic
- Italian-derived syntax, the D pitch may be entered as `ré'.
- Double sharps may also be entered using the `-x' suffix.
-
- * Additional bass strings (for lute tablature) are supported.
+ Italian-derived syntax, the D pitch may be entered as âréâ. Double
+ sharps may also be entered using the â-xâ suffix.
+ ⢠Additional bass strings (for lute tablature) are supported.
m = { f'4 d' a f d a, g, fis, e, d, c, \bar "|." }
\score {
@@ -73,12 +83,10 @@ New features in 2.20 since 2.18
}
}
}
- [image of music]
-
-
- * The markup-list-command `\table' is now available. Each column
- may be aligned differently.
+ image of music
+ ⢠The markup-list-command â\tableâ is now available. Each column may
+ be aligned differently.
\markuplist {
\override #'(padding . 2)
\table
@@ -91,13 +99,11 @@ New features in 2.20 since 2.18
thousand "1000" one "1.0"
}
}
- [image of music]
+ image of music
-
- * A new markup-command, `\with-dimensions-from', makes
- `\with-dimensions' easier to use by taking the new dimensions from
+ ⢠A new markup-command, â\with-dimensions-fromâ, makes
+ â\with-dimensionsâ easier to use by taking the new dimensions from
a markup object, given as first argument.
-
\markup {
\pattern #5 #Y #0 "x"
\pattern #5 #Y #0 \with-dimensions-from "x" "f"
@@ -109,19 +115,17 @@ New features in 2.20 since 2.18
\pattern #5 #X #0 \with-dimensions-from "n" "!"
}
}
- [image of music]
+ image of music
-
- * A new page breaking function `ly:one-line-auto-height-breaking'
- places a whole score on a single line and changes the page width
- to match, just like `ly:one-line-breaking'. The difference is that
- it also automatically modifies the height of the page to fit the
+ ⢠A new page breaking function âly:one-line-auto-height-breakingâ
+ places a whole score on a single line and changes the page width to
+ match, just like âly:one-line-breakingâ. The difference is that it
+ also automatically modifies the height of the page to fit the
height of the music.
- * Markup-command `\draw-squiggle-line' is now available.
- Customizing is possible with overrides of `thickness',
- `angularity', `height' and `orientation'
-
+ ⢠Markup-command â\draw-squiggle-lineâ is now available. Customizing
+ is possible with overrides of âthicknessâ, âangularityâ, âheightâ
+ and âorientationâ
\markup
\overlay {
\draw-squiggle-line #0.5 #'(3 . 3) ##t
@@ -140,16 +144,14 @@ New features in 2.20 since 2.18
\override #'(orientation . -1)
\draw-squiggle-line #0.2 #'(-3 . 3) ##t
}
- [image of music]
-
+ image of music
- * A new command, `\RemoveAllEmptyStaves', has been made available,
- which acts exactly like `\RemoveEmptyStaves', except for also
+ ⢠A new command, â\RemoveAllEmptyStavesâ, has been made available,
+ which acts exactly like â\RemoveEmptyStavesâ, except for also
removing empty staves on the first system in a score.
- * Markup-commands `\undertie' and `\overtie' are now available, as
- well as the generic markup-command `\tie'.
-
+ ⢠Markup-commands â\undertieâ and â\overtieâ are now available, as
+ well as the generic markup-command â\tieâ.
\markup {
\undertie "undertied"
\overtie "overtied"
@@ -160,11 +162,9 @@ New features in 2.20 since 2.18
}
{ \voiceOne \m \voiceTwo \m }
- [image of music]
-
-
- * `TabStaff' is now able to print micro-tones for bendings etc.
+ image of music
+ ⢠âTabStaffâ is now able to print micro-tones for bendings etc.
\layout {
\context {
\Score
@@ -178,15 +178,14 @@ New features in 2.20 since 2.18
\new Staff << \clef "G_8" \mus >>
\new TabStaff \mus
>>
- [image of music]
-
+ image of music
- * Two new styles of whiteout are now available. The `outline' style
- approximates the contours of a glyph's outline, and its shape is
+ ⢠Two new styles of whiteout are now available. The âoutlineâ style
+ approximates the contours of a glyphâs outline, and its shape is
produced from multiple displaced copies of the glyph. The
- `rounded-box' style produces a rounded rectangle shape. For all
- three styles, including the default `box' style, the whiteout
- shape's `thickness', as a multiple of staff-line thickness, can be
+ ârounded-boxâ style produces a rounded rectangle shape. For all
+ three styles, including the default âboxâ style, the whiteout
+ shapeâs âthicknessâ, as a multiple of staff-line thickness, can be
customized.
\markup {
@@ -214,12 +213,10 @@ New features in 2.20 since 2.18
\override Staff.Clef.whiteout = 3
g'1
}
- [image of music]
-
-
- * All of `\override', `\revert', `\set', and `\unset' now work with
- the `\once' prefix for making one-time settings.
+ image of music
+ ⢠All of â\overrideâ, â\revertâ, â\setâ, and â\unsetâ now work with
+ the â\onceâ prefix for making one-time settings.
\relative {
c'4 d
\override NoteHead.color = #red
@@ -231,23 +228,22 @@ New features in 2.20 since 2.18
\revert NoteHead.color
f2 c |
}
- [image of music]
-
-
- * When outputting MIDI, LilyPond will now store the `title' defined
- in a score's `\header' block (or, if there is no such definition
- on the `\score' level, the first such definition found in a
- `\header' block of the score's enclosing `\bookpart', `\book', or
- top-level scope) as the name of the MIDI sequence in the MIDI
- file. Optionally, the name of the MIDI sequence can be overridden
- using the new `midititle' `\header' field independently of `title'
- (for example, in case `title' contains markup code which does not
- render as plain text in a satisfactory way automatically).
-
- * Music (and scheme and void) functions and markup commands that
- just supply the final parameters to a chain of overrides, music
- function and markup command calls can now be defined in the form
- of just writing the expression cut short with `\etc'.
+ image of music
+
+ ⢠When outputting MIDI, LilyPond will now store the âtitleâ defined
+ in a scoreâs â\headerâ block (or, if there is no such definition on
+ the â\scoreâ level, the first such definition found in a â\headerâ
+ block of the scoreâs enclosing â\bookpartâ, â\bookâ, or top-level
+ scope) as the name of the MIDI sequence in the MIDI file.
+ Optionally, the name of the MIDI sequence can be overridden using
+ the new âmidititleâ â\headerâ field independently of âtitleâ (for
+ example, in case âtitleâ contains markup code which does not render
+ as plain text in a satisfactory way automatically).
+
+ ⢠Music (and scheme and void) functions and markup commands that just
+ supply the final parameters to a chain of overrides, music function
+ and markup command calls can now be defined in the form of just
+ writing the expression cut short with â\etcâ.
bold-red-markup = \markup \bold \with-color #red \etc
highlight = \tweak font-size 3 \tweak color #red \etc
@@ -256,69 +252,63 @@ New features in 2.20 since 2.18
\markuplist \column-lines \bold-red { One Two }
{ c' \highlight d' e'2-\highlight -! }
- [image of music]
-
-
- * LilyPond functions defined with `define-music-function',
- `define-event-function', `define-scheme-function' and
- `define-void-function' can now be directly called from Scheme as
- if they were genuine Scheme procedures. Argument checking and
- matching will still be performed in the same manner as when
- calling the function through LilyPond input. This includes the
- insertion of defaults for optional arguments not matching their
- predicates. Instead of using `\default' in the actual argument
- list for explicitly skipping a sequence of optional arguments,
- `*unspecified*' can be employed.
-
- * Current input location and parser are now stored in GUILE fluids
- and can be referenced via the function calls `(*location*)' and
- `(*parser*)'. Consequently, a lot of functions previously taking
- an explicit `parser' argument no longer do so.
-
- Functions defined with `define-music-function',
- `define-event-function', `define-scheme-function' and
- `define-void-function' no longer use `parser' and `location'
+ image of music
+
+ ⢠LilyPond functions defined with âdefine-music-functionâ,
+ âdefine-event-functionâ, âdefine-scheme-functionâ and
+ âdefine-void-functionâ can now be directly called from Scheme as if
+ they were genuine Scheme procedures. Argument checking and
+ matching will still be performed in the same manner as when calling
+ the function through LilyPond input. This includes the insertion
+ of defaults for optional arguments not matching their predicates.
+ Instead of using â\defaultâ in the actual argument list for
+ explicitly skipping a sequence of optional arguments,
+ â*unspecified*â can be employed.
+
+ ⢠Current input location and parser are now stored in GUILE fluids
+ and can be referenced via the function calls â(*location*)â and
+ â(*parser*)â. Consequently, a lot of functions previously taking
+ an explicit âparserâ argument no longer do so.
+
+ Functions defined with âdefine-music-functionâ,
+ âdefine-event-functionâ, âdefine-scheme-functionâ and
+ âdefine-void-functionâ no longer use âparserâ and âlocationâ
arguments.
With those particular definitions, LilyPond will try to recognize
- legacy use of `parser' and `location' arguments, providing
+ legacy use of âparserâ and âlocationâ arguments, providing
backwards-compatible semantics for some time.
- * In the "english" notename language, the long notenames for pitches
+ ⢠In the "english" notename language, the long notenames for pitches
with accidentals now contain a hyphen for better readability. You
now have to write
- \key a-flat \major
+ \key a-flat \major
instead of the previous
- \key aflat \major
-
- Double accidentals do not get another hyphen, so the Dutch `cisis'
- has the long English notename `c-sharpsharp'.
-
- * The visual style of tremolo slashes (shape, style and slope) is
- now more finely controlled.
-
- [image of music]
+ \key aflat \major
+ Double accidentals do not get another hyphen, so the Dutch âcisisâ
+ has the long English notename âc-sharpsharpâ.
- * Multi-measure rests have length according to their total duration,
- under the control of `MultiMeasureRest.space-increment'.
+ ⢠The visual style of tremolo slashes (shape, style and slope) is now
+ more finely controlled.
+ image of music
- [image of music]
+ ⢠Multi-measure rests have length according to their total duration,
+ under the control of âMultiMeasureRest.space-incrementâ.
+ image of music
+ ⢠Page numbers may now be printed in roman numerals, by setting the
+ âpage-number-typeâ paper variable.
- * Page numbers may now be printed in roman numerals, by setting the
- `page-number-type' paper variable.
-
- * It is now possible to use `\time' and `\partial' together to
- change the time signature in mid measure.
+ ⢠It is now possible to use â\timeâ and â\partialâ together to change
+ the time signature in mid measure.
\override Score.BarNumber.break-visibility = #end-of-line-invisible
\partial 4 \time 3/4 f4 | 2 4 | 2 \bar "||"
\time 9/8 \partial 4. f8 8 8 | 2. 8 8 8 |
- [image of music]
-
+ image of music
- * It is now possible to override the `text' property of chord names.
+ ⢠It is now possible to override the âtextâ property of chord names.
<<
\new ChordNames \chordmode {
@@ -327,102 +317,99 @@ New features in 2.20 since 2.18
d
}
>>
- [image of music]
-
+ image of music
- * Improved horizontal alignment when using `TextScript', with
- `DynamicText' or `LyricText'.
+ ⢠Improved horizontal alignment when using âTextScriptâ, with
+ âDynamicTextâ or âLyricTextâ.
- * A new command `\magnifyStaff' has been added which scales staff
+ ⢠A new command â\magnifyStaffâ has been added which scales staff
sizes, staff lines, bar lines, beamlets and horizontal spacing
- generally at the `Staff' context level. Staff lines are prevented
+ generally at the âStaffâ context level. Staff lines are prevented
from being scaled smaller than the default since the thickness of
stems, slurs, and the like are all based on the staff line
thickness.
- * `InstrumentName' now supports `text-interface'.
-
- * There is now support for controlling the `expression level' of
- MIDI channels using the `Staff.midiExpression' context property.
- This can be used to alter the perceived volume of even sustained
- notes (albeit in a very `low-level' way) and accepts a number
- value between `0.0' and `1.0'.
-
- \score {
- \new Staff \with {
- midiExpression = #0.6
- midiInstrument = #"clarinet"
- }
- <<
- { a'1~ a'1 }
- {
- \set Staff.midiExpression = #0.7 s4\f\<
- \set Staff.midiExpression = #0.8 s4
- \set Staff.midiExpression = #0.9 s4
- \set Staff.midiExpression = #1.0 s4
-
- \set Staff.midiExpression = #0.9 s4\>
- \set Staff.midiExpression = #0.8 s4
- \set Staff.midiExpression = #0.7 s4
- \set Staff.midiExpression = #0.6 s4\!
- }
- >>
- \midi { }
- }
-
- * Support for making it easier to use alternative `music' fonts other
+ ⢠âInstrumentNameâ now supports âtext-interfaceâ.
+
+ ⢠There is now support for controlling the âexpression levelâ of MIDI
+ channels using the âStaff.midiExpressionâ context property. This
+ can be used to alter the perceived volume of even sustained notes
+ (albeit in a very âlow-levelâ way) and accepts a number value
+ between â0.0â and â1.0â.
+
+ \score {
+ \new Staff \with {
+ midiExpression = #0.6
+ midiInstrument = #"clarinet"
+ }
+ <<
+ { a'1~ a'1 }
+ {
+ \set Staff.midiExpression = #0.7 s4\f\<
+ \set Staff.midiExpression = #0.8 s4
+ \set Staff.midiExpression = #0.9 s4
+ \set Staff.midiExpression = #1.0 s4
+
+ \set Staff.midiExpression = #0.9 s4\>
+ \set Staff.midiExpression = #0.8 s4
+ \set Staff.midiExpression = #0.7 s4
+ \set Staff.midiExpression = #0.6 s4\!
+ }
+ >>
+ \midi { }
+ }
+
+ ⢠Support for making it easier to use alternative âmusicâ fonts other
than the default Emmentaler in LilyPond has been added. See
- `http://fonts.openlilylib.org/' for more information.
+ for more information.
- * Grobs and their parents can now be aligned separately allowing
- more flexibility for grob positions. For example the `left' edge
- of a grob can now be aligned on the `center' of its parent.
+ ⢠Grobs and their parents can now be aligned separately allowing more
+ flexibility for grob positions. For example the âleftâ edge of a
+ grob can now be aligned on the âcenterâ of its parent.
- * Improvements to the `\partial' command have been made to avoid
+ ⢠Improvements to the â\partialâ command have been made to avoid
problems when using multiple, parallel contexts.
- * `\chordmode' can now use `< >' and `<< >>' constructs.
+ ⢠â\chordmodeâ can now use â< >â and â<< >>â constructs.
- * A new command `\tagGroup' has now been added. This complements
- the existing `\keepWithTag' and `\removeWithTag' commands. For
+ ⢠A new command â\tagGroupâ has now been added. This complements the
+ existing â\keepWithTagâ and â\removeWithTagâ commands. For
Example:
- \tagGroup #'(violinI violinII viola cello)
+ \tagGroup #'(violinI violinII viola cello)
- declares a list of `tags' that belong to a single `tag group'.
+ declares a list of âtagsâ that belong to a single âtag groupâ.
- \keepWithTag #'violinI
+ \keepWithTag #'violinI
- Is now only concerned with `tags' from `violinI'âs tag group.
+ Is now only concerned with âtagsâ from âviolinIââs tag group.
- Any element of the included music tagged with one or more tags
- from the group, but _not_ with VIOLINI, will be removed.
+ Any element of the included music tagged with one or more tags from
+ the group, but _not_ with VIOLINI, will be removed.
- * The `\addlyrics' function now works with arbitrary contexts
- incuding `Staff'.
+ ⢠The â\addlyricsâ function now works with arbitrary contexts
+ incuding âStaffâ.
- * String numbers can now also be used to print roman numerals (e.g.
+ ⢠String numbers can now also be used to print roman numerals (e.g.
for unfretted string instruments).
-
c2\2
\romanStringNumbers
c\2
\arabicStringNumbers
c1\3
- [image of music]
+ image of music
+ ⢠The âthin-kernâ property of the âBarLineâ grob has been renamed to
+ âsegno-kernâ.
- * The `thin-kern' property of the `BarLine' grob has been renamed to
- `segno-kern'.
-
- * `KeyCancellation' grobs now ignore cue clefs (like `KeySignature'
+ ⢠âKeyCancellationâ grobs now ignore cue clefs (like âKeySignatureâ
grobs do).
- * Add support for `\once \unset'
+ ⢠Add support for â\once \unsetâ
- * It is now possible to individually color both the dots and
- parentheses in fret diagrams when using the
- `\fret-diagram-verbose' markup command.
+ ⢠It is now possible to individually color both the dots and
+ parentheses in fret diagrams when using the â\fret-diagram-verboseâ
+ markup command.
\new Voice {
c1^\markup {
@@ -452,13 +439,12 @@ New features in 2.20 since 2.18
}
}
}
- [image of music]
-
+ image of music
- * Two new properties have been added for use in
- `fret-diagram-details' when using the `\fret-diagram-verbose'
- markup command; `fret-label-horizontal-offset' which affects the
- `fret-label-indication' and `paren-padding' which controls the
+ ⢠Two new properties have been added for use in
+ âfret-diagram-detailsâ when using the â\fret-diagram-verboseâ
+ markup command; âfret-label-horizontal-offsetâ which affects the
+ âfret-label-indicationâ and âparen-paddingâ which controls the
space between the dot and the parentheses surrounding it.
\new Voice {
@@ -485,26 +471,23 @@ New features in 2.20 since 2.18
}
}
}
- [image of music]
+ image of music
-
- * A new markup command `\justify-line' has been added. Similar to
- the `\fill-line' markup command except that instead of setting
- _words_ in columns, the `\justify-line' command balances the
+ ⢠A new markup command â\justify-lineâ has been added. Similar to
+ the â\fill-lineâ markup command except that instead of setting
+ _words_ in columns, the â\justify-lineâ command balances the
whitespace between them ensuring that when there are three or more
words in a markup, the whitespace is always consistent.
\markup \fill-line {oooooo oooooo oooooo oooooo}
\markup \fill-line {ooooooooo oooooooo oo ooo}
- [image of music]
-
+ image of music
\markup \justify-line {oooooo oooooo oooooo oooooo}
\markup \justify-line {ooooooooo oooooooo oo ooo}
- [image of music]
+ image of music
-
- * A new command `\magnifyMusic' has been added, which allows the
+ ⢠A new command â\magnifyMusicâ has been added, which allows the
notation size to be changed without changing the staff size, while
automatically scaling stems, beams, and horizontal spacing.
@@ -522,32 +505,30 @@ New features in 2.20 since 2.18
}
}
>>
- [image of music]
-
+ image of music
- * A new flexible template suitable for a range of choral music, is
- now provided. This may be used to create simple choral music,
- with or without piano accompaniment, in two or four staves. Unlike
- other templates, this template is `built-in', which means it does
- not need to be copied and edited: instead it is simply `\include''d
- in the input file. For details, see *note Built-in templates:
- (lilypond-learning)Built-in templates.
+ ⢠A new flexible template suitable for a range of choral music, is
+ now provided. This may be used to create simple choral music, with
+ or without piano accompaniment, in two or four staves. Unlike
+ other templates, this template is âbuilt-inâ, which means it does
+ not need to be copied and edited: instead it is simply â\includeââd
+ in the input file. For details, see *note
+ (lilypond-learning)Built-in templates::.
- * The positioning of tuplet numbers for kneed beams has been
+ ⢠The positioning of tuplet numbers for kneed beams has been
significantly improved. Previously, tuplet numbers were placed
- according to the position of the tuplet bracket, even if it was
- not printed. This could lead to stranded tuplet numbers. Now
- they are now positioned closer to the kneed-beam when an
- appropriate beam segment exists for its placement and when the
- bracket is not drawn.
+ according to the position of the tuplet bracket, even if it was not
+ printed. This could lead to stranded tuplet numbers. Now they are
+ now positioned closer to the kneed-beam when an appropriate beam
+ segment exists for its placement and when the bracket is not drawn.
Collision detection is also added, offsetting horizontally if too
- close to an adjoining note column but preserving the number's
- vertical distance from the kneed beam. If the number itself is
- too large to fit in the available space the original,
- bracket-based, positioning system is used instead; and in the
- event of a collision (e.g. with an accidental) the tuplet number
- is moved vertically away instead.
+ close to an adjoining note column but preserving the numberâs
+ vertical distance from the kneed beam. If the number itself is too
+ large to fit in the available space the original, bracket-based,
+ positioning system is used instead; and in the event of a collision
+ (e.g. with an accidental) the tuplet number is moved vertically
+ away instead.
\time 3/4
\override Beam.auto-knee-gap = 3
@@ -556,11 +537,10 @@ New features in 2.20 since 2.18
c'8 g,, e''
g,,8 e''' c,,
}
- [image of music]
-
+ image of music
The original kneed-beam tuplet behavior is still available through
- an `\override' via a new, `knee-to-beam' property.
+ an â\overrideâ via a new, âknee-to-beamâ property.
\time 3/4
\override Beam.auto-knee-gap = 3
@@ -570,49 +550,47 @@ New features in 2.20 since 2.18
c'8 g,, e''
g,,8 e''' c,,
}
- [image of music]
-
-
- * `\lyricsto' and `\addLyrics' have been `harmonized'. Both now
- accept the same kind of delimited argument list that `\lyrics' and
- `\chords' accept. Backward compatibility has been added so music
- identifiers (i.e. `\mus') are permitted as arguments. A
- `convert-ly' rule has been added that removes redundant uses of
- `\lyricmode' and rearranges combinations with context starters such
- that `\lyricsto' in general is applied last (i.e. like
- `\lyricmode' would be).
-
- * Scheme functions and identifiers can now be used as output
+ image of music
+
+ ⢠â\lyricstoâ and â\addLyricsâ have been âharmonizedâ. Both now
+ accept the same kind of delimited argument list that â\lyricsâ and
+ â\chordsâ accept. Backward compatibility has been added so music
+ identifiers (i.e. â\musâ) are permitted as arguments. A
+ âconvert-lyâ rule has been added that removes redundant uses of
+ â\lyricmodeâ and rearranges combinations with context starters such
+ that â\lyricstoâ in general is applied last (i.e. like
+ â\lyricmodeâ would be).
+
+ ⢠Scheme functions and identifiers can now be used as output
definitions.
- * Scheme expressions can now be used as chord constituents.
+ ⢠Scheme expressions can now be used as chord constituents.
- * Improved visual spacing of small and regular `MI' Funk and Walker
+ ⢠Improved visual spacing of small and regular âMIâ Funk and Walker
noteheads so they are now the same width as other shaped notes in
- their respective sets. `SOL' noteheads are also now visually
+ their respective sets. âSOLâ noteheads are also now visually
improved when used with both the normal Aiken and Sacred Harp
heads, as well as with the thin variants.
- * `LeftEdge' now has a definable `Y-extent' (i.e.vertical). See *note
- LeftEdge: (lilypond-internals)LeftEdge.
+ ⢠âLeftEdgeâ now has a definable âY-extentâ (i.e.vertical). See
+ *note (lilypond-internals)LeftEdge::.
- * Added a new `make-path-stencil' function that supports all `path'
+ ⢠Added a new âmake-path-stencilâ function that supports all âpathâ
commands both relative and absolute:
- `lineto', `rlineto', `curveto', `rcurveto', `moveto', `rmoveto',
- `closepath'. The function also supports `single-letter' syntax
+ âlinetoâ, ârlinetoâ, âcurvetoâ, ârcurvetoâ, âmovetoâ, ârmovetoâ,
+ âclosepathâ. The function also supports âsingle-letterâ syntax
used in standard SVG path commands:
- `L', `l', `C', `c', `M', `m', `Z' and `z'. The new command is
- also backward-compatible with the original
- `make-connected-path-stencil' function. Also see
- `scm/stencil.scm'.
+ âLâ, âlâ, âCâ, âcâ, âMâ, âmâ, âZâ and âzâ. The new command is also
+ backward-compatible with the original âmake-connected-path-stencilâ
+ function. Also see âscm/stencil.scmâ.
- * Context properties named in the `alternativeRestores' property are
+ ⢠Context properties named in the âalternativeRestoresâ property are
restored to their value at the start of the _first_ alternative in
all subsequent alternatives.
- Currently the default set restores `current meter';
+ Currently the default set restores âcurrent meterâ;
\time 3/4
\repeat volta 2 { c2 e4 | }
@@ -621,10 +599,9 @@ New features in 2.20 since 2.18
{ f2 d4 | }
}
g2. |
- [image of music]
-
+ image of music
- `measure position';
+ âmeasure positionâ;
\time 3/4
\repeat volta 2 { c2 e4 | }
@@ -635,10 +612,9 @@ New features in 2.20 since 2.18
{ f2 d4 | }
}
g2. |
- [image of music]
+ image of music
-
- and `chord changes';
+ and âchord changesâ;
<<
\new ChordNames {
@@ -654,23 +630,21 @@ New features in 2.20 since 2.18
\chordmode { d:m }
}
>>
- [image of music]
-
+ image of music
- * Improved MIDI output for breathe marks. After tied notes, breaths
- take time _only_ from the last note of the tie; e.g. `{ c4~ c8
- \breathe }' performs as `{ c4~ c16 r }' instead of `{ c4 r8 }'.
- This is more consistent with articulations and how humans
- interpret breaths after ties. It now also makes it easier to
- align simultaneous breathe marks over multiple parts, all with
- different note lengths.
+ ⢠Improved MIDI output for breathe marks. After tied notes, breaths
+ take time _only_ from the last note of the tie; e.g. â{ c4~ c8
+ \breathe }â performs as â{ c4~ c16 r }â instead of â{ c4 r8 }â.
+ This is more consistent with articulations and how humans interpret
+ breaths after ties. It now also makes it easier to align
+ simultaneous breathe marks over multiple parts, all with different
+ note lengths.
- * A new note head style for Tabulature has been added;
- `TabNoteHead.style = #'slash'.
+ ⢠A new note head style for Tabulature has been added;
+ âTabNoteHead.style = #'slashâ.
- * Four new Clef glyphs have been added _Double G_, _Tenor G_,
+ ⢠Four new Clef glyphs have been added _Double G_, _Tenor G_,
_Varpercussion_ and _varC_ and their related tessitura.
-
\override Staff.Clef.full-size-change = ##t
\clef "GG" c c c c
@@ -691,14 +665,13 @@ New features in 2.20 since 2.18
\clef "tenorvarC" c c c c
\clef "baritonevarC" c c c c
\clef "varpercussion" c c c c
- [image of music]
+ image of music
-
- * Isolated durations in music sequences now stand for unpitched
+ ⢠Isolated durations in music sequences now stand for unpitched
notes. This may be useful for specifying rhythms to music or
- scheme functions. When encountered in the final score, the
- pitches are provided by the preceding note or chord. Here are two
- examples where this makes for readable input:
+ scheme functions. When encountered in the final score, the pitches
+ are provided by the preceding note or chord. Here are two examples
+ where this makes for readable input:
\new DrumStaff \with { \override StaffSymbol.line-count = 1 }
\drummode {
@@ -706,50 +679,46 @@ New features in 2.20 since 2.18
tambourine 8 \tuplet 3/2 { 16 16 16 }
8 \tuplet 3/2 { 16 16 16 } 8 8 |
}
- [image of music]
-
+ image of music
\new Staff { r16 c'16 ~ 8 ~ 4 ~ 2 | }
- [image of music]
+ image of music
-
- * `\displayLilyMusic' and its underlying Scheme functions no longer
+ ⢠â\displayLilyMusicâ and its underlying Scheme functions no longer
omit redundant note durations. This makes it easier to reliably
recognize and format standalone durations in expressions like
- { c4 d4 8 }
+ { c4 d4 8 }
- * Beaming exceptions can now be constructed using the
- `\beamExceptions' scheme function. One can now write
+ ⢠Beaming exceptions can now be constructed using the
+ â\beamExceptionsâ scheme function. One can now write
\time #'(2 1) 3/16
\set Timing.beamExceptions =
\beamExceptions { 32[ 32] 32[ 32] 32[ 32] }
c16 c c |
\repeat unfold 6 { c32 } |
- [image of music]
-
+ image of music
- with multiple exceptions separated with `|' bar checks (writing
- the exception pattern without pitches is convenient but not
- mandatory). Previously, setting the beam exceptions would have
- required writing
+ with multiple exceptions separated with â|â bar checks (writing the
+ exception pattern without pitches is convenient but not mandatory).
+ Previously, setting the beam exceptions would have required writing
- \set Timing.beamExceptions =
- #'( ;start of alist
- (end . ;entry for end of beams
- ( ;start of alist of end points
- ((1 . 32) . (2 2 2)) ;rule for 1/32 beams -- end each 1/16
- )))
+ \set Timing.beamExceptions =
+ #'( ;start of alist
+ (end . ;entry for end of beams
+ ( ;start of alist of end points
+ ((1 . 32) . (2 2 2)) ;rule for 1/32 beams -- end each 1/16
+ )))
- * The most common articulations are now reflected in MIDI output.
+ ⢠The most common articulations are now reflected in MIDI output.
Accent and marcato make notes louder; staccato, staccatissimo and
- portato make them shorter. Breath marks shorten the previous note.
+ portato make them shorter. Breath marks shorten the previous note.
- This behavior is customizable through the `midiLength' and
- `midiExtraVelocity' properties on `ArticulationEvent'. See
- `script-init.ly' for examples.
+ This behavior is customizable through the âmidiLengthâ and
+ âmidiExtraVelocityâ properties on âArticulationEventâ. See
+ âscript-init.lyâ for examples.
- * The PostScript functionality of stroke adjustment is no longer
+ ⢠The PostScript functionality of stroke adjustment is no longer
applied automatically but left to the discretion of the PostScript
device (by default, Ghostscript uses it for resolutions up to
150dpi when generating raster images). When it is enabled, a more
@@ -757,14 +726,8 @@ New features in 2.20 since 2.18
adjustment is employed mostly for stems and bar lines.
Stroke adjustment can be forced by specifying the command line
- option `-dstrokeadjust' to LilyPond. When generating `PDF' files,
- this will usually result in markedly better looking `PDF' previews
+ option â-dstrokeadjustâ to LilyPond. When generating âPDFâ files,
+ this will usually result in markedly better looking âPDFâ previews
but significantly larger file size. Print quality at high
resolutions will be unaffected.
-
-
-
-Local Variables:
-coding: utf-8
-End:
diff --git a/README.txt b/README.txt
index 68e0e1397c..09f0f1847a 100644
--- a/README.txt
+++ b/README.txt
@@ -4,67 +4,67 @@ Toplevel README
1 Toplevel README
*****************
-LilyPond is a music typesetter. It produces beautiful sheet music
-using a description file as input. LilyPond is part of the GNU Project.
+LilyPond is a music typesetter. It produces beautiful sheet music using
+a description file as input. LilyPond is part of the GNU Project.
1.1 Versioning
==============
LilyPond uses a versioning scheme that easily identifies stable and
-development releases. In a version "x.y.z", an even second number 'y'
-denotes a stable version. For development versions 'y' is odd.
+development releases. In a version "x.y.z", an even second number âyâ
+denotes a stable version. For development versions âyâ is odd.
1.2 Downloading
===============
The primary download site for sourcecode is
-`http://lilypond.org/downloads/'.
+.
1.3 Compilation
===============
For compiling and running LilyPond see the installation instructions.
These instructions can be found when you unpack lilypond, as
-`lilypond-x.y.z/INSTALL.txt'. They are also available on the web at
-`http://lilypond.org/doc/v2.12/Documentation/topdocs/INSTALL.html'.
+âlilypond-x.y.z/INSTALL.txtâ. They are also available on the web at
+.
1.4 Documentation
=================
-The documentation is available online at `http://lilypond.org/doc/'.
+The documentation is available online at .
You can also build it locally: follow the instructions under
-`Building documentation' in the installation instructions.
+âBuilding documentationâ in the installation instructions.
1.5 Comments
============
-Send your criticism, comments, bugreports, patches, etc. to the mailing
+Send your criticism, comments, bugreports, patches, etc. to the mailing
list, not to us personally.
We have the following mailing lists:
- * info-lilypond@gnu.org
+ ⢠info-lilypond@gnu.org
(http://lists.gnu.org/mailman/listinfo/info-lilypond) is a
- low-volume list for information on LilyPond project. This
- list is moderated; ask David R. Linn or
- Han-Wen to send announcements for this list.
+ low-volume list for information on LilyPond project. This list is
+ moderated; ask David R. Linn or Han-Wen
+ to send announcements for this list.
- * lilypond-devel@gnu.org
- (http://lists.gnu.org/mailman/listinfo/lilypond-devel) for
+ ⢠lilypond-devel@gnu.org
+ (http://lists.gnu.org/mailman/listinfo/lilypond-devel) for
discussions about developing LilyPond, in particular the unstable
series.
- * lilypond-user@gnu.org
- (http://lists.gnu.org/mailman/listinfo/lilypond-user) for
+ ⢠lilypond-user@gnu.org
+ (http://lists.gnu.org/mailman/listinfo/lilypond-user) for
discussions about using LilyPond, in particular the stable series.
- * bug-lilypond@gnu.org
+ ⢠bug-lilypond@gnu.org
(http://lists.gnu.org/mailman/listinfo/bug-lilypond) for sending
bugreports.
- * lilypond-auto@gnu.org
- (http://lists.gnu.org/mailman/listinfo/lilypond-auto) for
+ ⢠lilypond-auto@gnu.org
+ (http://lists.gnu.org/mailman/listinfo/lilypond-auto) for
notifications from the issue tracking systems of LilyPond.
You can search the lists from our searching facilities
diff --git a/VERSION b/VERSION
index 52ba04b1e7..0c746e0c7b 100644
--- a/VERSION
+++ b/VERSION
@@ -1,7 +1,7 @@
PACKAGE_NAME=LilyPond
MAJOR_VERSION=2
MINOR_VERSION=19
-PATCH_LEVEL=45
+PATCH_LEVEL=47
MY_PATCH_LEVEL=
VERSION_STABLE=2.18.2
-VERSION_DEVEL=2.19.45
+VERSION_DEVEL=2.19.47
diff --git a/input/regression/context-mod-with.ly b/input/regression/context-mod-with.ly
index 999c94bab8..391e49da48 100644
--- a/input/regression/context-mod-with.ly
+++ b/input/regression/context-mod-with.ly
@@ -1,4 +1,4 @@
-\version "2.19.21"
+\version "2.19.46"
\header {
texidoc = "Context modifications can be stored into a variable as a
@@ -41,11 +41,11 @@ music = \relative { \key fis \minor c''1 d e }
\mark
\markup { "Remove time sig, add ambitus, set staff to 4 lines" }
\music }
- % Some context modifications manually written in a \with block
+ % The same mods as direct value of \with
\new Staff \with \ctxmod {
\mark \markup { "The same mods using a variable" } \music
}
- % The same mods as direct value of \with
+ % Some context modifications manually written in a \with block
\new Staff \with { \ctxmod } {
\mark \markup { "The same mods using a variable and \with" }
\music
@@ -65,8 +65,8 @@ music = \relative { \key fis \minor c''1 d e }
\ctxmod
\remove "Key_engraver"
} { \mark \markup { "Also remove clef and key engravers" } \music }
- % Mods can be inserted instead of a \with block (i.e. \with is not required)
- \new Staff \ctxmod { \mark \markup { "The same mods as staff 2" } \music }
+ % Test rendered redundant by issue 4911
+ \new Staff \with \ctxmod { \mark \markup { "The same mods as staff 2" } \music }
\new Staff { \mark \markup { "Back to default" } \music }
>>
}
diff --git a/input/regression/midi/crescendo-abutting.ly b/input/regression/midi/crescendo-abutting.ly
deleted file mode 100644
index da0ff4ffa0..0000000000
--- a/input/regression/midi/crescendo-abutting.ly
+++ /dev/null
@@ -1,10 +0,0 @@
-\version "2.19.44"
-
-\header {
- texidoc="One (de)crescendo ends as the next begins."
-}
-
-\score {
- { c\< c\> c\! }
- \midi {}
-}
diff --git a/input/regression/midi/crescendo-gap-compatible-target.ly b/input/regression/midi/crescendo-gap-compatible-target.ly
new file mode 100644
index 0000000000..38c19a3d92
--- /dev/null
+++ b/input/regression/midi/crescendo-gap-compatible-target.ly
@@ -0,0 +1,18 @@
+\version "2.19.45"
+
+\header {
+ texidoc="When there is a gap between the end of a crescendo and a
+ subsequent explicit dynamic, the dynamic performer uses the explicit
+ dynamic as the target of the crescendo."
+
+ %% Note: Choosing this behavior simplified the implementation. In
+ %% the developer's opinion, it is difficult to argue that choosing a
+ %% target dynamic that under- or overshoots the explicit dynamic is
+ %% more correct.
+
+}
+
+\score {
+ { c\mf\< c\! c\f }
+ \midi {}
+}
diff --git a/input/regression/midi/crescendo-return-crescendo.ly b/input/regression/midi/crescendo-return-crescendo.ly
new file mode 100644
index 0000000000..4ab8dac24f
--- /dev/null
+++ b/input/regression/midi/crescendo-return-crescendo.ly
@@ -0,0 +1,12 @@
+\version "2.19.44"
+
+\header {
+ texidoc="The dynamic performer chooses a reasonable peak dynamic and
+ returns to the original dynamic. The latter, extreme crescendo does
+ not affect the former."
+}
+
+\score {
+ { c\mf\< c\> c\< c\sf }
+ \midi {}
+}
diff --git a/input/regression/midi/crescendo-return-louder-target.ly b/input/regression/midi/crescendo-return-louder-target.ly
new file mode 100644
index 0000000000..f3fcb36233
--- /dev/null
+++ b/input/regression/midi/crescendo-return-louder-target.ly
@@ -0,0 +1,11 @@
+\version "2.19.45"
+
+\header {
+ texidoc="The dynamic performer chooses a reasonable peak dynamic and
+ returns to the specified dynamic."
+}
+
+\score {
+ { c\mf\< c\> c\f }
+ \midi {}
+}
diff --git a/input/regression/midi/crescendo-return-softer-target.ly b/input/regression/midi/crescendo-return-softer-target.ly
new file mode 100644
index 0000000000..788724be3f
--- /dev/null
+++ b/input/regression/midi/crescendo-return-softer-target.ly
@@ -0,0 +1,11 @@
+\version "2.19.45"
+
+\header {
+ texidoc="The dynamic performer chooses a reasonable peak dynamic and
+ returns to the specified dynamic."
+}
+
+\score {
+ { c\mf\< c\> c\p }
+ \midi {}
+}
diff --git a/input/regression/midi/crescendo-return-unspecified-target.ly b/input/regression/midi/crescendo-return-unspecified-target.ly
new file mode 100644
index 0000000000..065f674ae1
--- /dev/null
+++ b/input/regression/midi/crescendo-return-unspecified-target.ly
@@ -0,0 +1,11 @@
+\version "2.19.44"
+
+\header {
+ texidoc="The dynamic performer chooses a reasonable peak dynamic and
+ returns to the original dynamic."
+}
+
+\score {
+ { c\mf\< c\> c\! }
+ \midi {}
+}
diff --git a/input/regression/midi/crescendo-single-compatible-target.ly b/input/regression/midi/crescendo-single-compatible-target.ly
new file mode 100644
index 0000000000..fcc0f5a6ef
--- /dev/null
+++ b/input/regression/midi/crescendo-single-compatible-target.ly
@@ -0,0 +1,11 @@
+\version "2.19.44"
+
+\header {
+ texidoc="The velocity of notes during a crescendo is linearly
+ interpolated between the starting and target dynamics."
+}
+
+\score {
+ { c\mf\< c c\f }
+ \midi {}
+}
diff --git a/input/regression/midi/crescendo-single-unspecified-target.ly b/input/regression/midi/crescendo-single-unspecified-target.ly
new file mode 100644
index 0000000000..d995609be9
--- /dev/null
+++ b/input/regression/midi/crescendo-single-unspecified-target.ly
@@ -0,0 +1,11 @@
+\version "2.19.44"
+
+\header {
+ texidoc="If no explicit dynamic follows a crescendo, the dynamic
+ performer chooses a reasonable target dynamic."
+}
+
+\score {
+ { c\mf\< c\! }
+ \midi {}
+}
diff --git a/input/regression/midi/decrescendo-multiple-compatible-target.ly b/input/regression/midi/decrescendo-multiple-compatible-target.ly
new file mode 100644
index 0000000000..d066381102
--- /dev/null
+++ b/input/regression/midi/decrescendo-multiple-compatible-target.ly
@@ -0,0 +1,12 @@
+\version "2.19.45"
+
+\header {
+ texidoc="The dynamic performer apportions changes to consecutive
+ decrescendi in proportion to their duration. In this case, 1/3 of
+ the change occurs over the first decrescendo."
+}
+
+\score {
+ { c\f\> c\! c2\> | c1\p }
+ \midi {}
+}
diff --git a/input/regression/midi/decrescendo-single-contrary-target.ly b/input/regression/midi/decrescendo-single-contrary-target.ly
new file mode 100644
index 0000000000..7c13541747
--- /dev/null
+++ b/input/regression/midi/decrescendo-single-contrary-target.ly
@@ -0,0 +1,15 @@
+\version "2.19.45"
+
+\header {
+ texidoc="When a decrescendo is followed by an explicit dynamic that
+ is louder than the starting dynamic, the dynamic performer chooses a
+ reasonable target dynamic. The velocity of notes during the
+ decrescendo is linearly interpolated between the starting and target
+ dynamics, with the explicit dynamic taking effect at the last
+ moment."
+}
+
+\score {
+ { c\mf\> c c\f }
+ \midi {}
+}
diff --git a/input/regression/midi/dynamic-voices-sequential.ly b/input/regression/midi/dynamic-voices-sequential.ly
new file mode 100644
index 0000000000..2d25b2d696
--- /dev/null
+++ b/input/regression/midi/dynamic-voices-sequential.ly
@@ -0,0 +1,15 @@
+\version "2.19.47"
+
+\header {
+ texidoc="The MIDI performer operates in Voice context by default,
+ so dynamics in different voices are independent."
+}
+
+\score {
+ \new Staff {
+ \new Voice = "A" c'2\p
+ \new Voice = "A" c'2 % default dynamic expected
+ }
+
+ \midi {}
+}
diff --git a/input/regression/midi/dynamic-voices-simultaneous.ly b/input/regression/midi/dynamic-voices-simultaneous.ly
new file mode 100644
index 0000000000..091dd68989
--- /dev/null
+++ b/input/regression/midi/dynamic-voices-simultaneous.ly
@@ -0,0 +1,15 @@
+\version "2.19.47"
+
+\header {
+ texidoc="The MIDI performer operates in Voice context by default,
+ so dynamics in different voices are independent."
+}
+
+\score {
+ \new Staff <<
+ \new Voice = "A" e'2\p
+ \new Voice = "A" c'2 % default dynamic expected
+ >>
+
+ \midi {}
+}
diff --git a/input/regression/midi/midi-overlapping-notes.ly b/input/regression/midi/midi-overlapping-notes.ly
new file mode 100644
index 0000000000..e808bb9ada
--- /dev/null
+++ b/input/regression/midi/midi-overlapping-notes.ly
@@ -0,0 +1,22 @@
+\header {
+
+ texidoc = "Notes with equal pitch overlapping in time on the same
+MIDI channel should produce multiple MIDI note-on events, but no
+isolated note-off events before the last of these notes ends."
+
+}
+
+\version "2.19.45"
+
+\score {
+ \new Staff \with { midiInstrument = "church organ" }
+ \new Voice \relative c' <<
+ % This combination of music expressions should not produce audible
+ % pauses between notes in the MIDI output, in particular, before the
+ % 'g1' note in the first expression.
+ { c1 s1 g1 }
+ { s4 c4 }
+ { s2 c2~ c1 s1 }
+ >>
+ \midi { }
+}
diff --git a/input/regression/remove-empty-context-mod.ly b/input/regression/remove-empty-context-mod.ly
index 9a503b53c6..83a2401a72 100644
--- a/input/regression/remove-empty-context-mod.ly
+++ b/input/regression/remove-empty-context-mod.ly
@@ -1,4 +1,4 @@
-\version "2.16.0"
+\version "2.19.46"
\header {
texidoc = "@code{\\RemoveEmptyStaves} is defined separately from
@@ -9,7 +9,7 @@ context definitions so it can be used outside of @code{\\layout} blocks."
ragged-right = ##t
}
-\new Staff \RemoveEmptyStaves {
+\new Staff \with \RemoveEmptyStaves {
c'1 \break
r1
}
diff --git a/input/regression/retrograde.ly b/input/regression/retrograde.ly
new file mode 100644
index 0000000000..dd7f7eba95
--- /dev/null
+++ b/input/regression/retrograde.ly
@@ -0,0 +1,30 @@
+\version "2.18.0"
+
+\header {
+ texidoc = "@code{\\retrograde} can deal with crescendo and
+ decrescendo as long as they are properly paired with
+ @code{\\endcr}/@code{\\!} and @code{\\enddecr}. Direction modifiers
+ on slurs like @code{^(} need to be repeated as @code{^)} at the end.
+ Ties and glissandi work mostly (in-chord ties are turned into
+ ordinary per-chord/note ties, however)."
+}
+
+\layout { ragged-right = ##t }
+
+motif =
+\relative {
+ \override TextSpanner.bound-details.left.text = "motif"
+ 2~\startTextSpan c16\< d^( e f~ f4:32^)\!\> |
+ <<
+ \context Voice = "voice" {
+ 4 g8\glissando f\stopTextSpan\enddecr }
+ \\
+ { c2 }
+ >>
+}
+
+\new Voice = "voice" {
+ \motif
+ \override TextSpanner.bound-details.left.text = "retrograde motif"
+ \retrograde \motif \bar "|."
+}
diff --git a/input/regression/scheme-text-spanner.ly b/input/regression/scheme-text-spanner.ly
index d89a959149..d97d215363 100644
--- a/input/regression/scheme-text-spanner.ly
+++ b/input/regression/scheme-text-spanner.ly
@@ -68,7 +68,7 @@ in scheme."
(SchemeTextSpanEvent
. ((description . "Used to signal where scheme text spanner brackets
start and stop.")
- (types . (scheme-text-span-event span-event event))
+ (types . (post-event scheme-text-span-event span-event event))
))
))
diff --git a/input/regression/spacing-to-empty-barline.ly b/input/regression/spacing-to-empty-barline.ly
index 16cb6656fb..b35fb67f80 100644
--- a/input/regression/spacing-to-empty-barline.ly
+++ b/input/regression/spacing-to-empty-barline.ly
@@ -1,4 +1,4 @@
-\version "2.17.30"
+\version "2.19.46"
\header {
texidoc = "An empty barline does not confuse the spacing engine too much.
@@ -15,7 +15,6 @@ The two scores should look approximately the same."
\name "Top"
\alias "Staff"
\type "Engraver_group"
- \consists "Output_property_engraver"
\consists "Bar_engraver"
\consists "Axis_group_engraver"
diff --git a/lily/audio-item.cc b/lily/audio-item.cc
index 97a15d552a..a8a78199c7 100644
--- a/lily/audio-item.cc
+++ b/lily/audio-item.cc
@@ -21,6 +21,7 @@
#include "midi-item.hh"
#include "audio-column.hh"
+#include "international.hh"
Audio_instrument::Audio_instrument (string instrument_string)
{
@@ -101,24 +102,15 @@ Audio_key::Audio_key (int acc, bool major)
major_ = major;
}
-Audio_dynamic::Audio_dynamic ()
- : volume_ (-1),
- silent_ (false)
-{
-}
-
-Audio_span_dynamic::Audio_span_dynamic (Real min_volume, Real max_volume)
-{
- grow_dir_ = CENTER;
- min_volume_ = min_volume;
- max_volume_ = max_volume;
-}
+const Real Audio_span_dynamic::MINIMUM_VOLUME = 0.0;
+const Real Audio_span_dynamic::MAXIMUM_VOLUME = 1.0;
+const Real Audio_span_dynamic::DEFAULT_VOLUME = 90.0 / 127.0;
-void
-Audio_span_dynamic::add_absolute (Audio_dynamic *d)
+Audio_span_dynamic::Audio_span_dynamic (Moment mom, Real volume)
+ : start_moment_ (mom),
+ duration_ (0)
{
- assert (d);
- dynamics_.push_back (d);
+ set_volume (volume, volume);
}
Moment
@@ -140,53 +132,60 @@ moment_to_ticks (Moment m)
return int (moment_to_real (m) * 384 * 4);
}
-void
-Audio_span_dynamic::render ()
+void Audio_span_dynamic::set_end_moment (Moment mom)
{
- if (dynamics_.size () <= 1)
- return;
-
- assert (dynamics_[0]->volume_ >= 0);
-
- while (dynamics_.back ()->volume_ > 0
- && dynamics_.size () > 1
- && sign (dynamics_.back ()->volume_ - dynamics_[0]->volume_) != grow_dir_)
+ if (mom < start_moment_)
{
- dynamics_.erase (dynamics_.end () - 1);
+ programming_error (_f ("end moment (%s) < start moment (%s)",
+ mom.to_string ().c_str (),
+ start_moment_.to_string ().c_str ()));
+ mom = start_moment_;
}
- if (dynamics_.size () <= 1)
+ duration_ = moment_to_real (mom - start_moment_);
+}
+
+void
+Audio_span_dynamic::set_volume (Real start, Real target)
+{
+ if (!(start >= 0))
{
- programming_error ("Impossible or ambiguous (de)crescendo in MIDI.");
- return;
+ programming_error (_f ("invalid start volume: %f", start));
+ start = DEFAULT_VOLUME;
}
- Real start_v = dynamics_[0]->volume_;
- if (dynamics_.back ()->volume_ < 0)
+ if (!(target >= 0))
{
- // The dynamic spanner does not end with an explicit dynamic script
- // event. Adjust the end volume by at most 1/4 of the available
- // volume range in this case.
- dynamics_.back ()->volume_ = max (min (start_v + grow_dir_ * (max_volume_ - min_volume_) * 0.25, max_volume_), min_volume_);
+ programming_error (_f ("invalid target volume: %f", target));
+ target = start;
}
- Real delta_v = dynamics_.back ()->volume_ - dynamics_[0]->volume_;
-
- Moment start = dynamics_[0]->get_column ()->when ();
+ start_volume_ = start;
+ gain_ = target - start;
+}
- Real total_t = moment_to_real (dynamics_.back ()->get_column ()->when () - start);
+Real Audio_span_dynamic::get_volume (Moment mom) const
+{
+ const Real when = moment_to_real (mom - start_moment_);
- for (vsize i = 1; i < dynamics_.size (); i++)
+ if (when <= 0)
{
- Moment dt_moment = dynamics_[i]->get_column ()->when ()
- - start;
-
- Real dt = moment_to_real (dt_moment);
-
- Real v = start_v + delta_v * (dt / total_t);
+ if (when < 0)
+ programming_error (_f ("asked to compute volume at %f for dynamic span of duration %f starting at %s",
+ when, duration_,
+ start_moment_.to_string ().c_str ()));
+ return start_volume_;
+ }
- dynamics_[i]->volume_ = v;
+ if (when >= duration_)
+ {
+ programming_error (_f ("asked to compute volume at +%f for dynamic span of duration %f starting at %s",
+ when, duration_,
+ start_moment_.to_string ().c_str ()));
+ return start_volume_ + gain_;
}
+
+ return start_volume_ + gain_ * (when / duration_);
}
Audio_tempo::Audio_tempo (int per_minute_4)
@@ -206,20 +205,8 @@ Audio_text::Audio_text (Audio_text::Type type, const string &text_string)
type_ = type;
}
-Audio_control_function_value_change
-::Audio_control_function_value_change (Control control, Real value)
- : control_ (control), value_ (value)
+Audio_control_change::Audio_control_change (int control, int value)
+ : control_ (control),
+ value_ (value)
{
}
-
-const Audio_control_function_value_change::Context_property
-Audio_control_function_value_change::context_properties_[] = {
- // property name, enum constant, lower bound for range, upper bound for range
- { "midiBalance", BALANCE, -1.0, 1.0 },
- { "midiPanPosition", PAN_POSITION, -1.0, 1.0 },
- { "midiExpression", EXPRESSION, 0.0, 1.0 },
- { "midiReverbLevel", REVERB_LEVEL, 0.0, 1.0 },
- { "midiChorusLevel", CHORUS_LEVEL, 0.0, 1.0 },
- // extra element to signify the end of the mapping, must be kept last
- { 0, NUM_CONTROLS, 0.0, 0.0 }
-};
diff --git a/lily/dynamic-performer.cc b/lily/dynamic-performer.cc
index 5ce67f0463..23b7d43bfd 100644
--- a/lily/dynamic-performer.cc
+++ b/lily/dynamic-performer.cc
@@ -19,6 +19,7 @@
#include "performer.hh"
#include "audio-item.hh"
+#include "std-vector.hh"
#include "stream-event.hh"
#include "international.hh"
@@ -29,6 +30,8 @@ class Dynamic_performer : public Performer
public:
TRANSLATOR_DECLARATIONS (Dynamic_performer);
protected:
+ virtual void acknowledge_audio_element (Audio_element_info info);
+ virtual void finalize ();
void stop_translation_timestep ();
void process_music ();
Real equalize_volume (Real);
@@ -36,25 +39,286 @@ protected:
void listen_decrescendo (Stream_event *);
void listen_crescendo (Stream_event *);
void listen_absolute_dynamic (Stream_event *);
+
+private:
+ void close_and_enqueue_span ();
+ Real compute_departure_volume (Direction depart_dir,
+ Real start_vol,
+ Real end_vol,
+ Real min_vol,
+ Real max_vol);
+ bool drive_state_machine (Direction next_grow_dir);
+ // next_vol < 0 means select a target dynamic based on growth direction.
+ // return actual next volume (computed if not provided)
+ Real finish_queued_spans (Real next_vol = -1.0);
+ Real look_up_absolute_volume (SCM dynamicString,
+ Real defaultValue);
+
+private:
+ // This performer queues a number of dynamic spans waiting for the following
+ // pattern before computing their volume levels.
+ //
+ // 1. the first (de)crescendo, followed by ...
+ // 2. zero or more spans that either change in the same direction as the
+ // first or do not change, followed by ...
+ // 3. zero or more spans that either change in the opposite direction as the
+ // first or do not change
+ //
+ // The search may be cut short by an absolute dynamic or the end of the
+ // context.
+ enum State
+ {
+ STATE_INITIAL = 0, // waiting for a (de)crescendo
+ STATE_DEPART, // enqueued the first span, gathering same-direction spans
+ STATE_RETURN // gathering opposite-direction spans
+ };
+
+ struct UnfinishedSpan
+ {
+ Audio_span_dynamic *dynamic_;
+ Direction grow_dir_;
+
+ UnfinishedSpan () : dynamic_ (0), grow_dir_ (CENTER) {}
+ };
+
+ struct DynamicQueue
+ {
+ vector spans_;
+ // total duration of (de)crescendi (i.e. excluding fixed-volume spans)
+ Real change_duration_;
+ Real min_target_vol_;
+ Real max_target_vol_;
+
+ DynamicQueue () : change_duration_ (0) {}
+
+ void clear ()
+ {
+ spans_.clear ();
+ change_duration_ = 0;
+ }
+
+ void push_back (const UnfinishedSpan &span,
+ Real min_target_vol,
+ Real max_target_vol)
+ {
+ if (span.grow_dir_ != CENTER)
+ change_duration_ += span.dynamic_->get_duration ();
+ min_target_vol_ = min_target_vol;
+ max_target_vol_ = max_target_vol;
+ spans_.push_back (span);
+ }
+
+ void set_volume (Real start_vol, Real target_vol);
+ };
+
private:
+ vector notes_;
Stream_event *script_event_;
Drul_array span_events_;
- Drul_array grow_dir_;
- Real last_volume_;
- Audio_dynamic *absolute_;
- Audio_span_dynamic *span_dynamic_;
- Audio_span_dynamic *finished_span_dynamic_;
+ Direction next_grow_dir_;
+ Direction depart_dir_;
+ UnfinishedSpan open_span_;
+ DynamicQueue depart_queue_;
+ DynamicQueue return_queue_;
+ State state_;
};
Dynamic_performer::Dynamic_performer ()
+ : script_event_ (0),
+ next_grow_dir_ (CENTER),
+ depart_dir_ (CENTER),
+ state_ (STATE_INITIAL)
{
- last_volume_ = -1;
- script_event_ = 0;
- absolute_ = 0;
span_events_[LEFT]
- = span_events_[RIGHT] = 0;
- span_dynamic_ = 0;
- finished_span_dynamic_ = 0;
+ = span_events_[RIGHT] = 0;
+}
+
+void
+Dynamic_performer::acknowledge_audio_element (Audio_element_info inf)
+{
+ // Keep track of the notes played in this translation time step so that they
+ // can be pointed to the current dynamic in stop_translation_timestep.
+ if (Audio_note *n = dynamic_cast (inf.elem_)) {
+ notes_.push_back (n);
+ }
+}
+
+bool
+Dynamic_performer::drive_state_machine (Direction next_grow_dir)
+{
+ switch (state_)
+ {
+ case STATE_INITIAL:
+ if (next_grow_dir != CENTER)
+ {
+ state_ = STATE_DEPART;
+ depart_dir_ = next_grow_dir;
+ }
+ break;
+
+ case STATE_DEPART:
+ if (next_grow_dir == -depart_dir_)
+ state_ = STATE_RETURN;
+ break;
+
+ case STATE_RETURN:
+ if (next_grow_dir == depart_dir_)
+ {
+ state_ = STATE_DEPART;
+ return true;
+ }
+ break;
+ }
+
+ return false;
+}
+
+void
+Dynamic_performer::close_and_enqueue_span ()
+{
+ if (!open_span_.dynamic_)
+ programming_error ("no open dynamic span");
+ else
+ {
+ DynamicQueue &dq
+ = (state_ == STATE_RETURN) ? return_queue_ : depart_queue_;
+
+ // Changing equalizer settings in the course of the performance does not
+ // seem very likely. This is a fig leaf: Equalize these limit volumes
+ // now as the required context properties are current. Note that only
+ // the limits at the end of the last span in the queue are kept.
+
+ // Resist diminishing to silence. (Idea: Look up "ppppp"
+ // with dynamicAbsoluteVolumeFunction, however that would yield 0.25.)
+ const Real min_target = equalize_volume (0.1);
+ const Real max_target
+ = equalize_volume (Audio_span_dynamic::MAXIMUM_VOLUME);
+
+ open_span_.dynamic_->set_end_moment (now_mom ());
+ dq.push_back (open_span_, min_target, max_target);
+ }
+
+ open_span_ = UnfinishedSpan ();
+}
+
+// Set the starting and target volume for each span in the queue. The gain
+// (loss) of any (de)crescendo is proportional to its share of the total time
+// spent changing.
+void
+Dynamic_performer::DynamicQueue::set_volume (Real start_vol,
+ Real target_vol)
+{
+ const Real gain = target_vol - start_vol;
+ Real dur = 0; // duration of (de)crescendi processed so far
+ Real vol = start_vol;
+ for (vector::iterator it = spans_.begin ();
+ it != spans_.end (); ++it)
+ {
+ const Real prev_vol = vol;
+ if (it->grow_dir_ != CENTER)
+ {
+ // grant this (de)crescendo its portion of the gain
+ dur += it->dynamic_->get_duration ();
+ vol = start_vol + gain * (dur / change_duration_);
+ }
+ it->dynamic_->set_volume (prev_vol, vol);
+ }
+}
+
+// Return a volume which is reasonably distant from the given start and end
+// volumes in the given direction, for use as a peak volume in a passage with a
+// crescendo followed by a decrescendo (or vice versa). If the given volumes
+// are equal, the returned volume is a also reasonable target volume for a
+// single (de)crescendo.
+//
+// The given minimum and maximum volumes are the allowable dynamic range.
+Real
+Dynamic_performer::compute_departure_volume (Direction depart_dir,
+ Real start_vol,
+ Real end_vol,
+ Real min_vol,
+ Real max_vol)
+{
+ if (depart_dir == CENTER)
+ return start_vol;
+
+ // Try to find a volume that is a minimum distance from the starting and
+ // ending volumes. If the endpoint volumes differ, the nearer one is padded
+ // less than the farther one.
+ //
+ // Example: mf < ... > p. The legacy behavior was to use a 25% of the
+ // dynamic range for a (de)crescendo to an unspecified target, and this tries
+ // to preserve that, but is not possible to use a 25% change for both the
+ // crescendo and the decrescendo and meet the constraints of this example.
+ // The decrescendo is a greater change than the crescendo. Believing that
+ // 25% is already more than enough for either, pad using 25% for the greater
+ // change and 7% for the lesser change.
+ //
+ // Idea: Use a context property or callback, e.g. the difference between two
+ // dynamics in dynamicAbsoluteVolumeFunction. 0.25 is the default difference
+ // between "p" and "ff". (Isn't that rather wide for this purpose?) 0.07 is
+ // the default difference between "mp" and "mf".
+ const Real far_padding = 0.25;
+ const Real near_padding = 0.07;
+
+ // If for some reason one of the endpoints is already below the supposed
+ // minimum or maximum, just accept it.
+ min_vol = min (min (min_vol, start_vol), end_vol);
+ max_vol = max (max (max_vol, start_vol), end_vol);
+
+ const Real vol_range = max_vol - min_vol;
+
+ const Real near_vol = minmax (depart_dir, start_vol, end_vol)
+ + depart_dir * near_padding * vol_range;
+ const Real far_vol = minmax (-depart_dir, start_vol, end_vol)
+ + depart_dir * far_padding * vol_range;
+ const Real depart_vol = minmax (depart_dir, near_vol, far_vol);
+ return max (min (depart_vol, max_vol), min_vol);
+}
+
+Real
+Dynamic_performer::finish_queued_spans (Real next_vol)
+{
+ if (depart_queue_.spans_.empty ())
+ {
+ programming_error ("no dynamic span to finish");
+ return next_vol;
+ }
+
+ const Real start_vol = depart_queue_.spans_.front ().dynamic_->get_start_volume ();
+
+ if (return_queue_.spans_.empty ())
+ {
+ Real depart_vol = next_vol;
+
+ // If the next dynamic is not specified or is inconsistent with the
+ // direction of growth, choose a reasonable target.
+ if ((next_vol < 0) || (depart_dir_ != sign (next_vol - start_vol)))
+ {
+ depart_vol = compute_departure_volume (depart_dir_,
+ start_vol, start_vol,
+ depart_queue_.min_target_vol_,
+ depart_queue_.max_target_vol_);
+ }
+
+ depart_queue_.set_volume (start_vol, depart_vol);
+ depart_queue_.clear ();
+ return (next_vol >= 0) ? next_vol : depart_vol;
+ }
+ else
+ {
+ // If the next dynamic is not specified, return to the starting volume.
+ const Real return_vol = (next_vol >= 0) ? next_vol : start_vol;
+ Real depart_vol = compute_departure_volume (depart_dir_,
+ start_vol, return_vol,
+ depart_queue_.min_target_vol_,
+ depart_queue_.max_target_vol_);
+ depart_queue_.set_volume (start_vol, depart_vol);
+ depart_queue_.clear ();
+ return_queue_.set_volume (depart_vol, return_vol);
+ return_queue_.clear ();
+ return return_vol;
+ }
}
Real
@@ -67,7 +331,8 @@ Dynamic_performer::equalize_volume (Real volume)
SCM max = get_property ("midiMaximumVolume");
if (scm_is_number (min) || scm_is_number (max))
{
- Interval iv (0, 1);
+ Interval iv (Audio_span_dynamic::MINIMUM_VOLUME,
+ Audio_span_dynamic::MAXIMUM_VOLUME);
if (scm_is_number (min))
iv[MIN] = scm_to_double (min);
if (scm_is_number (max))
@@ -97,125 +362,124 @@ Dynamic_performer::equalize_volume (Real volume)
volume = iv[MIN] + iv.length () * volume;
}
}
- return volume;
+ return std::max (std::min (volume, Audio_span_dynamic::MAXIMUM_VOLUME),
+ Audio_span_dynamic::MINIMUM_VOLUME);
+}
+
+void
+Dynamic_performer::finalize ()
+{
+ if (open_span_.dynamic_)
+ close_and_enqueue_span ();
+ finish_queued_spans ();
+}
+
+Real
+Dynamic_performer::look_up_absolute_volume (SCM dynamicString,
+ Real defaultValue)
+{
+ SCM proc = get_property ("dynamicAbsoluteVolumeFunction");
+
+ SCM svolume = SCM_EOL;
+ if (ly_is_procedure (proc))
+ svolume = scm_call_1 (proc, dynamicString);
+
+ return robust_scm2double (svolume, defaultValue);
}
void
Dynamic_performer::process_music ()
{
- if (span_events_[START] || span_events_[STOP] || script_event_)
+ Real volume = -1;
+
+ if (script_event_) // explicit dynamic
{
- // End the previous spanner when a new one begins or at an explicit stop
- // or absolute dynamic.
- finished_span_dynamic_ = span_dynamic_;
- span_dynamic_ = 0;
+ volume = look_up_absolute_volume (script_event_->get_property ("text"),
+ Audio_span_dynamic::DEFAULT_VOLUME);
+ volume = equalize_volume (volume);
}
-
- if (span_events_[START])
+ else if (!open_span_.dynamic_) // first time only
{
- // Start of a dynamic spanner. Create a new Audio_span_dynamic for
- // collecting changes in dynamics within this spanner.
- span_dynamic_ = new Audio_span_dynamic (equalize_volume (0.1), equalize_volume (1.0));
- announce_element (Audio_element_info (span_dynamic_, span_events_[START]));
-
- span_dynamic_->grow_dir_ = grow_dir_[START];
+ // Idea: look_up_absolute_volume (ly_symbol2scm ("mf")).
+ // It is likely to change regtests.
+ volume = equalize_volume (Audio_span_dynamic::DEFAULT_VOLUME);
}
- if (script_event_
- || span_dynamic_
- || finished_span_dynamic_)
+ // end the current span at relevant points
+ if (open_span_.dynamic_
+ && (span_events_[START] || span_events_[STOP] || script_event_))
{
- // New change in dynamics.
- absolute_ = new Audio_dynamic ();
-
+ close_and_enqueue_span ();
if (script_event_)
{
- // Explicit dynamic script event: determine the volume.
- SCM proc = get_property ("dynamicAbsoluteVolumeFunction");
-
- SCM svolume = SCM_EOL;
- if (ly_is_procedure (proc))
- {
- // urg
- svolume = scm_call_1 (proc, script_event_->get_property ("text"));
- }
-
- Real volume = robust_scm2double (svolume, 0.5);
-
- last_volume_
- = absolute_->volume_ = equalize_volume (volume);
+ state_ = STATE_INITIAL;
+ volume = finish_queued_spans (volume);
}
-
- Audio_element_info info (absolute_, script_event_);
- announce_element (info);
}
- if (last_volume_ < 0)
+ // start a new span so that some dynamic is always in effect
+ if (!open_span_.dynamic_)
{
- absolute_ = new Audio_dynamic ();
-
- last_volume_
- = absolute_->volume_ = equalize_volume (0.71); // Backward compatible
+ if (drive_state_machine (next_grow_dir_))
+ volume = finish_queued_spans (volume);
- Audio_element_info info (absolute_, script_event_);
- announce_element (info);
- }
+ // if not known by now, use a default volume for robustness
+ if (volume < 0)
+ volume = equalize_volume (Audio_span_dynamic::DEFAULT_VOLUME);
- if (span_dynamic_)
- span_dynamic_->add_absolute (absolute_);
+ Stream_event *cause
+ = span_events_[START] ? span_events_[START]
+ : script_event_ ? script_event_
+ : span_events_[STOP];
- if (finished_span_dynamic_)
- finished_span_dynamic_->add_absolute (absolute_);
+ open_span_.dynamic_ = new Audio_span_dynamic (now_mom (), volume);
+ open_span_.grow_dir_ = next_grow_dir_;
+ announce_element (Audio_element_info (open_span_.dynamic_, cause));
+ }
}
void
Dynamic_performer::stop_translation_timestep ()
{
- if (finished_span_dynamic_)
- {
- finished_span_dynamic_->render ();
- finished_span_dynamic_ = 0;
- }
-
- if (absolute_)
+ // link notes to the current dynamic
+ if (!open_span_.dynamic_)
+ programming_error("no current dynamic");
+ else
{
- if (absolute_->volume_ < 0)
- {
- absolute_->volume_ = last_volume_;
- }
- else
+ for (vector::const_iterator ni = notes_.begin ();
+ ni != notes_.end (); ++ni)
{
- last_volume_ = absolute_->volume_;
+ (*ni)->dynamic_ = open_span_.dynamic_;
}
}
+ notes_.clear ();
- absolute_ = 0;
script_event_ = 0;
span_events_[LEFT]
- = span_events_[RIGHT] = 0;
+ = span_events_[RIGHT] = 0;
+ next_grow_dir_ = CENTER;
}
void
Dynamic_performer::listen_decrescendo (Stream_event *r)
{
Direction d = to_dir (r->get_property ("span-direction"));
- span_events_[d] = r;
- grow_dir_[d] = SMALLER;
+ if (ASSIGN_EVENT_ONCE (span_events_[d], r) && (d == START))
+ next_grow_dir_ = SMALLER;
}
void
Dynamic_performer::listen_crescendo (Stream_event *r)
{
Direction d = to_dir (r->get_property ("span-direction"));
- span_events_[d] = r;
- grow_dir_[d] = BIGGER;
+ if (ASSIGN_EVENT_ONCE (span_events_[d], r) && (d == START))
+ next_grow_dir_ = BIGGER;
}
void
Dynamic_performer::listen_absolute_dynamic (Stream_event *r)
{
- if (!script_event_)
- script_event_ = r;
+ ASSIGN_EVENT_ONCE (script_event_, r);
}
void
diff --git a/lily/grob.cc b/lily/grob.cc
index 7ce89d5015..eafa66288e 100644
--- a/lily/grob.cc
+++ b/lily/grob.cc
@@ -333,7 +333,7 @@ Real
Grob::relative_coordinate (Grob const *refp, Axis a) const
{
/* eaa - hmmm, should we do a programming_error() here? */
- if ((this == NULL) || (refp == this))
+ if (refp == this)
return 0.0;
/* We catch PARENT_L_ == nil case with this, but we crash if we did
@@ -342,7 +342,8 @@ Grob::relative_coordinate (Grob const *refp, Axis a) const
if (refp == dim_cache_[a].parent_)
return off;
- off += dim_cache_[a].parent_->relative_coordinate (refp, a);
+ if (dim_cache_[a].parent_ != NULL)
+ off += dim_cache_[a].parent_->relative_coordinate (refp, a);
return off;
}
diff --git a/lily/include/audio-item.hh b/lily/include/audio-item.hh
index 8c41d18a52..f3a97a2949 100644
--- a/lily/include/audio-item.hh
+++ b/lily/include/audio-item.hh
@@ -40,26 +40,32 @@ private:
Audio_item &operator = (Audio_item const &);
};
-class Audio_dynamic : public Audio_item
+// Audio_span_dynamic is open at the end of the interval, so the volume
+// grows/diminshes toward a target, but whether it reaches it depends on the
+// next Audio_span_dynamic in the performance. For example, a crescendo
+// notated as mf < p is represented as [mf < x) [p ...) i.e. growth to some
+// volume louder than mf followed by an abrupt change to p.
+class Audio_span_dynamic : public Audio_element
{
public:
- Audio_dynamic ();
+ static const Real MINIMUM_VOLUME;
+ static const Real MAXIMUM_VOLUME;
+ static const Real DEFAULT_VOLUME;
- Real volume_;
- bool silent_;
-};
+private:
+ Moment start_moment_;
+ Real start_volume_;
+ Real duration_; // = target moment - start moment
+ Real gain_; // = target volume - start volume
-class Audio_span_dynamic : public Audio_element
-{
public:
- Direction grow_dir_;
- vector dynamics_;
- Real min_volume_;
- Real max_volume_;
-
- virtual void render ();
- void add_absolute (Audio_dynamic *);
- Audio_span_dynamic (Real min_volume, Real max_volume);
+ Moment get_start_moment () const { return start_moment_; }
+ Real get_start_volume () const { return start_volume_; }
+ Real get_duration () const { return duration_; }
+ void set_end_moment (Moment);
+ void set_volume (Real start, Real target);
+ Real get_volume (Moment) const;
+ Audio_span_dynamic (Moment mom, Real volume);
};
class Audio_key : public Audio_item
@@ -92,7 +98,7 @@ public:
Pitch pitch_;
Moment length_mom_;
Pitch transposing_;
- Audio_dynamic *dynamic_;
+ Audio_span_dynamic *dynamic_;
int extra_velocity_;
Audio_note *tied_;
@@ -138,36 +144,13 @@ public:
int one_beat_;
};
-class Audio_control_function_value_change : public Audio_item
+class Audio_control_change : public Audio_item
{
public:
- // Supported control functions.
- enum Control
- {
- BALANCE = 0, PAN_POSITION, EXPRESSION, REVERB_LEVEL, CHORUS_LEVEL,
- // pseudo value for representing the size of the enum; must be kept last
- NUM_CONTROLS
- };
-
- Audio_control_function_value_change (Control control, Real value);
-
- // Information about a context property corresponding to a control function
- // (name, the corresponding enumeration value, and the allowed range for the
- // value of the context property).
- struct Context_property
- {
- const char *name_;
- Control control_;
- Real range_min_;
- Real range_max_;
- };
-
- // Mapping from supported control functions to the corresponding context
- // properties.
- static const Context_property context_properties_[];
+ Audio_control_change (int control, int value);
- Control control_;
- Real value_;
+ int control_;
+ int value_;
};
int moment_to_ticks (Moment);
diff --git a/lily/include/lily-proto.hh b/lily/include/lily-proto.hh
index ee3946e0fd..6de69e16b9 100644
--- a/lily/include/lily-proto.hh
+++ b/lily/include/lily-proto.hh
@@ -24,7 +24,7 @@
class All_font_metrics;
class Audio_column;
-class Audio_control_function_value_change;
+class Audio_control_change;
class Audio_dynamic;
class Audio_element;
class Audio_instrument;
@@ -90,7 +90,8 @@ class Lyric_engraver;
class Lyric_performer;
class Mensural_ligature_engraver;
class Midi_chunk;
-class Midi_control_function_value_change;
+class Midi_control_change;
+class Midi_control_change_announcer;
class Midi_duration;
class Midi_dynamic;
class Midi_event;
diff --git a/lily/include/midi-cc-announcer.hh b/lily/include/midi-cc-announcer.hh
new file mode 100644
index 0000000000..38cb93f15a
--- /dev/null
+++ b/lily/include/midi-cc-announcer.hh
@@ -0,0 +1,64 @@
+/*
+ This file is part of LilyPond, the GNU music typesetter.
+
+ Copyright (C) 2016 by Heikki Tauriainen .
+
+ 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 .
+*/
+
+#ifndef MIDI_CC_ANNOUNCER_HH
+#define MIDI_CC_ANNOUNCER_HH
+
+#include "input.hh"
+#include "performer.hh"
+#include "audio-item.hh"
+
+/* Base class for announcing MIDI control changes. */
+class Midi_control_change_announcer
+{
+public:
+ /* Constructor. The optional parameter can be used to specify an Input
+ to use for relativizing warning messages about out-of-range values. */
+ Midi_control_change_announcer (Input *origin = 0);
+ virtual ~Midi_control_change_announcer ();
+
+ void announce_from_context_properties ();
+
+ /* Announces MIDI CC changes by creating new Audio_control_change events
+ from them, and calling 'do_announce' on each event. Control change
+ events will be created from every supported MIDI context property for
+ which the 'get_property_value' function returns a value that is
+ compatible with the expected type of the context property's value. */
+ void announce_control_changes ();
+
+private:
+ virtual SCM get_property_value (const char *property_name) = 0;
+ virtual void do_announce (Audio_control_change *item) = 0;
+ void warn (const string &message);
+
+ Input *origin_;
+
+ struct Control_spec
+ {
+ const char *const context_property_name_;
+ const Real range_min_;
+ const Real range_max_;
+ const int msb_control_number_;
+ const int lsb_control_number_;
+ };
+
+ static const Control_spec controls_[];
+};
+
+#endif // MIDI_CC_ANNOUNCER_HH
diff --git a/lily/include/midi-item.hh b/lily/include/midi-item.hh
index b593ce1527..57bb2d4da2 100644
--- a/lily/include/midi-item.hh
+++ b/lily/include/midi-item.hh
@@ -52,27 +52,27 @@ public:
Midi_channel_item (Audio_item *ai);
};
-/**
- Midi control function value changes.
-*/
-class Midi_control_function_value_change : public Midi_channel_item
+class Midi_duration : public Midi_item
{
public:
- DECLARE_CLASSNAME (Midi_control_function_value_change);
- Midi_control_function_value_change (Audio_control_function_value_change *ai);
- virtual ~Midi_control_function_value_change ();
+ Midi_duration (Real seconds_f);
+
virtual string to_string () const;
- Audio_control_function_value_change::Control control_;
- Real value_;
+ Real seconds_;
};
-class Midi_duration : public Midi_item
+/**
+ MIDI control change
+*/
+class Midi_control_change : public Midi_channel_item
{
public:
- Midi_duration (Real seconds_f);
-
+ DECLARE_CLASSNAME (Midi_control_change);
+ Midi_control_change (Audio_control_change *ai);
+ virtual ~Midi_control_change ();
virtual string to_string () const;
- Real seconds_;
+
+ Audio_control_change *audio_;
};
/**
@@ -157,17 +157,6 @@ public:
Audio_text *audio_;
};
-class Midi_dynamic : public Midi_channel_item
-{
-public:
- Midi_dynamic (Audio_dynamic *);
- DECLARE_CLASSNAME (Midi_dynamic);
-
- virtual string to_string () const;
-
- Audio_dynamic *audio_;
-};
-
class Midi_piano_pedal : public Midi_channel_item
{
public:
diff --git a/lily/include/slur-engraver.hh b/lily/include/slur-engraver.hh
index 572e7ea023..1885625ed9 100644
--- a/lily/include/slur-engraver.hh
+++ b/lily/include/slur-engraver.hh
@@ -60,8 +60,8 @@ protected:
void stop_translation_timestep ();
void process_music ();
- bool can_create_slur (const string&, vsize, vsize *, Stream_event *);
- void create_slur (const string &spanner_id, Event_info evi, Grob *g_cause, Direction dir, bool left_broken);
+ bool can_create_slur (SCM, vsize, vsize *, Stream_event *);
+ void create_slur (SCM spanner_id, Event_info evi, Grob *g_cause, Direction dir, bool left_broken);
bool try_to_end (Event_info evi);
virtual void set_melisma (bool);
diff --git a/lily/midi-cc-announcer.cc b/lily/midi-cc-announcer.cc
new file mode 100644
index 0000000000..7fb4ed6c27
--- /dev/null
+++ b/lily/midi-cc-announcer.cc
@@ -0,0 +1,110 @@
+/*
+ This file is part of LilyPond, the GNU music typesetter.
+
+ Copyright (C) 2016 by Heikki Tauriainen .
+
+ 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 .
+*/
+
+#include "audio-item.hh"
+#include "input.hh"
+#include "international.hh"
+#include "libc-extension.hh"
+#include "midi-cc-announcer.hh"
+
+/*
+ Context properties for setting MIDI controls. Each MIDI control
+ specification has the following components:
+ 1. The name of the LilyPond context property used to change the value of
+ the MIDI control.
+ 2. The lower bound for the numeric range of the LilyPond context property.
+ 3. The upper bound for the numeric range of the LilyPond context property.
+ 4. The MIDI control number for setting the most significant 7 bits of the
+ control value.
+ 5. The MIDI control number for setting the least significant 7 bits of the
+ control value, if the control supports 14-bit ("fine") resolution. If
+ the control supports only 7-bit ("coarse") resolution, the LSB control
+ number should be negative.
+*/
+const Midi_control_change_announcer::Control_spec
+Midi_control_change_announcer::controls_[]
+=
+{
+ { "midiBalance", -1.0, 1.0, 8, 40 },
+ { "midiPanPosition", -1.0, 1.0, 10, 42 },
+ { "midiExpression", 0.0, 1.0, 11, 43 },
+ { "midiReverbLevel", 0.0, 1.0, 91, -1 },
+ { "midiChorusLevel", 0.0, 1.0, 93, -1 },
+ // This element should be kept last in the array.
+ { 0, 0.0, 0.0, 0, 0 }
+};
+
+Midi_control_change_announcer::Midi_control_change_announcer (Input *origin)
+ : origin_ (origin)
+{
+}
+
+Midi_control_change_announcer::~Midi_control_change_announcer ()
+{
+}
+
+void Midi_control_change_announcer::announce_control_changes ()
+{
+ for (const Control_spec *spec = controls_; spec->context_property_name_;
+ ++spec)
+ {
+ SCM value = get_property_value (spec->context_property_name_);
+ if (!scm_is_number (value))
+ continue;
+ Real val = scm_to_double (value);
+ if (val >= spec->range_min_ && val <= spec->range_max_)
+ {
+ // Normalize the value to the 0.0 to 1.0 range.
+ val = ((val - spec->range_min_)
+ / (spec->range_max_ - spec->range_min_));
+ // Transform the normalized context property value into a 14-bit or
+ // a 7-bit (non-negative) integer depending on the MIDI control's
+ // resolution. For directional value changes, #CENTER will
+ // correspond to 0.5 exactly, and my_round rounds upwards when in
+ // case of doubt. That means that center position will round to
+ // 0x40 or 0x2000 by a hair's breadth.
+ const Real full_fine_scale = 0x3FFF;
+ const Real full_coarse_scale = 0x7F;
+ const bool fine_resolution = (spec->lsb_control_number_ >= 0);
+ const int v = (int) (my_round (val * (fine_resolution
+ ? full_fine_scale
+ : full_coarse_scale)));
+ // Announce a control change for the most significant 7 bits of the
+ // control value (and, if the control supports fine resolution, for
+ // the least significant 7 bits as well).
+ do_announce (new Audio_control_change (spec->msb_control_number_,
+ fine_resolution
+ ? (v >> 7) : v));
+ if (fine_resolution)
+ do_announce (new Audio_control_change (spec->lsb_control_number_,
+ v & 0x7F));
+ }
+ else
+ warn (_f ("ignoring out-of-range value change for MIDI property `%s'",
+ spec->context_property_name_));
+ }
+}
+
+void Midi_control_change_announcer::warn (const string &message)
+{
+ if (origin_)
+ origin_->warning (message);
+ else
+ warning (message);
+}
diff --git a/lily/midi-cc-performer.cc b/lily/midi-cc-performer.cc
new file mode 100644
index 0000000000..2aff5d0039
--- /dev/null
+++ b/lily/midi-cc-performer.cc
@@ -0,0 +1,150 @@
+/*
+ This file is part of LilyPond, the GNU music typesetter.
+
+ Copyright (C) 2013--2016 by Heikki Tauriainen .
+ Adapted from performer implementations
+ Copyright (C) 1996--2015 Jan Nieuwenhuizen ,
+ Han-Wen Nienhyus and others.
+
+ 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 .
+*/
+
+#include "performer.hh"
+
+#include "audio-item.hh"
+#include "context.hh"
+#include "dispatcher.hh"
+#include "international.hh"
+#include "listener.hh"
+#include "midi-cc-announcer.hh"
+#include "stream-event.hh"
+
+#include "translator.icc"
+
+/**
+ MIDI control change performer. Announces "set property" events on MIDI
+ context properties.
+*/
+class Midi_control_change_performer : public Performer
+{
+public:
+ TRANSLATOR_DECLARATIONS (Midi_control_change_performer);
+ void announce_control_change (SCM);
+ ~Midi_control_change_performer ();
+
+ void connect_to_context (Context *c);
+ void disconnect_from_context (Context *c);
+
+private:
+ class Control_change_announcer : public Midi_control_change_announcer
+ {
+ public:
+ Control_change_announcer (Midi_control_change_performer *p,
+ Stream_event *ev, const string &s);
+
+ SCM get_property_value (const char *property_name);
+ void do_announce (Audio_control_change *item);
+
+ private:
+ Midi_control_change_performer *performer_;
+ Stream_event *event_;
+ string symbol_;
+ };
+};
+
+Midi_control_change_performer::Midi_control_change_performer ()
+{
+}
+
+Midi_control_change_performer::~Midi_control_change_performer ()
+{
+}
+
+void
+Midi_control_change_performer::connect_to_context (Context *c)
+{
+ c->events_below ()->
+ add_listener (GET_LISTENER (Midi_control_change_performer,
+ announce_control_change),
+ ly_symbol2scm ("SetProperty"));
+}
+
+void
+Midi_control_change_performer::disconnect_from_context (Context *c)
+{
+ c->events_below ()->
+ remove_listener (GET_LISTENER (Midi_control_change_performer,
+ announce_control_change),
+ ly_symbol2scm ("SetProperty"));
+}
+
+void
+Midi_control_change_performer::announce_control_change (SCM sev)
+{
+ Stream_event *ev = unsmob (sev);
+ SCM sym = ev->get_property ("symbol");
+ if (!scm_is_symbol (sym))
+ return;
+
+ Control_change_announcer a (this, ev, ly_symbol2string (sym));
+ a.announce_control_changes ();
+}
+
+Midi_control_change_performer::Control_change_announcer::Control_change_announcer
+(Midi_control_change_performer *p, Stream_event *ev, const string &s)
+ : Midi_control_change_announcer (ev->origin ()),
+ performer_ (p),
+ event_ (ev),
+ symbol_ (s)
+{
+}
+
+SCM
+Midi_control_change_performer::Control_change_announcer::get_property_value
+(const char *property_name)
+{
+ return symbol_ == property_name ? event_->get_property ("value") : SCM_EOL;
+}
+
+void Midi_control_change_performer::Control_change_announcer::do_announce
+(Audio_control_change *item)
+{
+ performer_->announce_element (Audio_element_info (item, 0));
+}
+
+void
+Midi_control_change_performer::boot ()
+{
+
+}
+
+ADD_TRANSLATOR (Midi_control_change_performer,
+ /* doc */
+ "This performer listens to SetProperty events on context "
+ "properties for generating MIDI control changes and "
+ "prepares them for MIDI output.",
+
+ /* create */
+ "",
+
+ /* read */
+ "midiBalance "
+ "midiPanPosition "
+ "midiExpression "
+ "midiReverbLevel "
+ "midiChorusLevel ",
+
+ /* write */
+ ""
+ );
diff --git a/lily/midi-control-function-performer.cc b/lily/midi-control-function-performer.cc
deleted file mode 100644
index a112e6bcef..0000000000
--- a/lily/midi-control-function-performer.cc
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- This file is part of LilyPond, the GNU music typesetter.
-
- Copyright (C) 2013--2015 by Heikki Tauriainen .
- Adapted from performer implementations
- Copyright (C) 1996--2015 Jan Nieuwenhuizen ,
- Han-Wen Nienhyus and others.
-
- 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 .
-*/
-
-#include "performer.hh"
-
-#include "audio-item.hh"
-#include "context.hh"
-#include "dispatcher.hh"
-#include "international.hh"
-#include "listener.hh"
-#include "stream-event.hh"
-
-#include "translator.icc"
-
-/**
- MIDI control function performer. Announces "set property" events on MIDI
- context properties.
-*/
-class Midi_control_function_performer : public Performer
-{
-public:
- TRANSLATOR_DECLARATIONS (Midi_control_function_performer);
- void announce_function_value_change (SCM);
- ~Midi_control_function_performer ();
-
- void connect_to_context (Context *c);
- void disconnect_from_context (Context *c);
-};
-
-Midi_control_function_performer::Midi_control_function_performer ()
-{
-}
-
-Midi_control_function_performer::~Midi_control_function_performer ()
-{
-}
-
-void
-Midi_control_function_performer::connect_to_context (Context *c)
-{
- c->events_below ()->
- add_listener (GET_LISTENER (Midi_control_function_performer, announce_function_value_change),
- ly_symbol2scm ("SetProperty"));
-}
-
-void
-Midi_control_function_performer::disconnect_from_context (Context *c)
-{
- c->events_below ()->
- remove_listener (GET_LISTENER (Midi_control_function_performer, announce_function_value_change),
- ly_symbol2scm ("SetProperty"));
-}
-
-void
-Midi_control_function_performer::announce_function_value_change (SCM sev)
-{
- Stream_event *ev = unsmob (sev);
- SCM sym = ev->get_property ("symbol");
- if (!scm_is_symbol (sym))
- return;
-
- // Search for a matching context property; if found, check that the value
- // of the property is within the allowed range, and announce a possible
- // change in the value of the corresponding control function.
- string symbol = ly_symbol2string (sym);
- for (const Audio_control_function_value_change::Context_property *p
- = Audio_control_function_value_change::context_properties_;
- p->name_; ++p)
- {
- if (symbol == p->name_)
- {
- SCM value = ev->get_property ("value");
- if (scm_is_number (value))
- {
- Real val = scm_to_double (value);
- if (val >= p->range_min_ && val <= p->range_max_)
- {
- // Normalize the value to the 0.0 to 1.0 range.
- val = ((val - p->range_min_)
- / (p->range_max_ - p->range_min_));
- Audio_control_function_value_change *item
- = new Audio_control_function_value_change (p->control_,
- val);
- announce_element (Audio_element_info (item, 0));
- }
- else
- ev->origin ()->
- warning (_f ("ignoring out-of-range value change for MIDI "
- "property `%s'",
- p->name_));
- }
- break;
- }
- }
-}
-
-void
-Midi_control_function_performer::boot ()
-{
-
-}
-
-ADD_TRANSLATOR (Midi_control_function_performer,
- /* doc */
- "",
-
- /* create */
- "",
-
- /* read */
- "midiBalance "
- "midiPanPosition "
- "midiExpression "
- "midiReverbLevel "
- "midiChorusLevel ",
-
- /* write */
- ""
- );
diff --git a/lily/midi-item.cc b/lily/midi-item.cc
index 33dd9f11bd..ba29ba0ba5 100644
--- a/lily/midi-item.cc
+++ b/lily/midi-item.cc
@@ -19,6 +19,7 @@
#include "midi-item.hh"
+#include "audio-column.hh"
#include "duration.hh"
#include "international.hh"
#include "libc-extension.hh"
@@ -42,8 +43,6 @@ Midi_item::get_midi (Audio_item *a)
return i->str_.length () ? new Midi_instrument (i) : 0;
else if (Audio_note *i = dynamic_cast (a))
return new Midi_note (i);
- else if (Audio_dynamic *i = dynamic_cast (a))
- return new Midi_dynamic (i);
else if (Audio_piano_pedal *i = dynamic_cast (a))
return new Midi_piano_pedal (i);
else if (Audio_tempo *i = dynamic_cast (a))
@@ -52,9 +51,8 @@ Midi_item::get_midi (Audio_item *a)
return new Midi_time_signature (i);
else if (Audio_text *i = dynamic_cast (a))
return new Midi_text (i);
- else if (Audio_control_function_value_change *i
- = dynamic_cast (a))
- return new Midi_control_function_value_change (i);
+ else if (Audio_control_change *i = dynamic_cast (a))
+ return new Midi_control_change (i);
else
assert (0);
@@ -106,9 +104,9 @@ Midi_channel_item::Midi_channel_item (Audio_item *ai)
{
}
-Midi_control_function_value_change
-::Midi_control_function_value_change (Audio_control_function_value_change *ai)
- : Midi_channel_item (ai), control_ (ai->control_), value_ (ai->value_)
+Midi_control_change::Midi_control_change (Audio_control_change *ai)
+ : Midi_channel_item (ai),
+ audio_ (ai)
{
}
@@ -120,7 +118,7 @@ Midi_channel_item::~Midi_channel_item ()
{
}
-Midi_control_function_value_change::~Midi_control_function_value_change ()
+Midi_control_change::~Midi_control_change ()
{
}
@@ -193,8 +191,8 @@ Midi_time_signature::to_string () const
Midi_note::Midi_note (Audio_note *a)
: Midi_channel_item (a),
audio_ (a),
- dynamic_byte_ (min (max (Byte ((a->dynamic_ && a->dynamic_->volume_ >= 0
- ? a->dynamic_->volume_ * 0x7f : 0x5a)
+ dynamic_byte_ (min (max (Byte ((a->dynamic_
+ ? a->dynamic_->get_volume (a->audio_column_->when ()) * 0x7f : 0x5a)
+ a->extra_velocity_),
Byte (0)), Byte (0x7f)))
{
@@ -275,40 +273,6 @@ Midi_note_off::to_string () const
return str;
}
-Midi_dynamic::Midi_dynamic (Audio_dynamic *a)
- : Midi_channel_item (a),
- audio_ (a)
-{
-}
-
-string
-Midi_dynamic::to_string () const
-{
- Byte status_byte = (char) (0xB0 + channel_);
- string str = ::to_string ((char)status_byte);
-
- /*
- Main volume controller (per channel):
- 07 MSB
- 27 LSB
- */
- static Real const full_scale = 127;
-
- int volume = (int) (audio_->volume_ * full_scale);
- if (volume <= 0)
- volume = 1;
- if (volume > full_scale)
- volume = (int)full_scale;
-
- int const volume_default = 100;
- if (audio_->volume_ < 0 || audio_->silent_)
- volume = volume_default;
-
- str += ::to_string ((char)0x07);
- str += ::to_string ((char)volume);
- return str;
-}
-
Midi_piano_pedal::Midi_piano_pedal (Audio_piano_pedal *a)
: Midi_channel_item (a),
audio_ (a)
@@ -363,63 +327,12 @@ Midi_text::to_string () const
}
string
-Midi_control_function_value_change::to_string () const
+Midi_control_change::to_string () const
{
- // MIDI control function information. A MIDI control function may have one
- // or two assigned control numbers depending on whether it supports coarse
- // (7-bit) or fine (14-bit) resolution. If the control function supports
- // fine resolution, the first (respectively, second) member of the structure
- // represents the control number for setting the most (least) significant 7
- // bits of the control function's value.
- struct Control_function
- {
- int msb_control_number_;
- int lsb_control_number_;
- };
-
- // Mapping from supported control functions (enumeration values defined in
- // Audio_controller_value_change::Control) to the corresponding MIDI control
- // numbers.
- static const Control_function control_functions[] =
- {
- // When adding support for new control functions, please note the
- // following:
- // - The order of the control number definitions should be kept
- // consistent with the order of the enumeration values defined in
- // Audio_control_function_value_change::Control.
- // - If the control function has only coarse resolution, the function's
- // control number should be stored in the MSB member of the array
- // element, and the LSB member should be set to a negative value.
-
- { 8, 40 }, // balance
- { 10, 42 }, // pan position
- { 11, 43 }, // expression
- { 91, -1 }, // reverb level (only coarse resolution available)
- { 93, -1 } // chorus level (only coarse resolution available)
- };
-
- string str;
- const Control_function *control_function = &control_functions[control_];
- static const Real full_fine_scale = 0x3FFF;
- static const Real full_coarse_scale = 0x7F;
- bool fine_resolution = (control_function->lsb_control_number_ >= 0);
- // value_ is in range [0.0 .. 1.0]. For directional value ranges,
- // #CENTER will correspond to 0.5 exactly, and my_round rounds
- // upwards when in case of doubt. That means that center position
- // will round to 0x40 or 0x2000 by a hair's breadth.
- int value = (int) my_round (value_ * (fine_resolution ?
- full_fine_scale : full_coarse_scale));
Byte status_byte = (char) (0xB0 + channel_);
- str += ::to_string ((char)status_byte);
- str += ::to_string ((char)(control_function->msb_control_number_));
- str += ::to_string ((char)(fine_resolution ? (value >> 7) : value));
- if (fine_resolution)
- {
- str += ::to_string ((char)0x00);
- str += ::to_string ((char)status_byte);
- str += ::to_string ((char)(control_function->lsb_control_number_));
- str += ::to_string ((char)(value & 0x7F));
- }
+ string str = ::to_string ((char)status_byte);
+ str += ::to_string ((char) (audio_->control_));
+ str += ::to_string ((char) (audio_->value_));
return str;
}
diff --git a/lily/midi-walker.cc b/lily/midi-walker.cc
index bc6c93dc56..d9765c6814 100644
--- a/lily/midi-walker.cc
+++ b/lily/midi-walker.cc
@@ -89,8 +89,9 @@ Midi_walker::do_start_note (Midi_note *note)
Real (384 * 4)) + now_ticks;
for (vsize i = 0; i < stop_note_queue.size (); i++)
{
- /* if this pitch already in queue */
- if (stop_note_queue[i].val->get_semitone_pitch ()
+ /* if this pitch already in queue, and is not already ignored */
+ if (!stop_note_queue[i].ignore_ &&
+ stop_note_queue[i].val->get_semitone_pitch ()
== note->get_semitone_pitch ())
{
int queued_ticks
diff --git a/lily/output-property-engraver.cc b/lily/output-property-engraver.cc
index 7a0fa2d3c3..370d6e1c1f 100644
--- a/lily/output-property-engraver.cc
+++ b/lily/output-property-engraver.cc
@@ -37,15 +37,12 @@ protected:
void stop_translation_timestep ();
};
+// We only run this in the Score context, so all events are likely to
+// find a target
void
Output_property_engraver::listen_apply_output (Stream_event *ev)
{
- /*
- UGH. Only swallow the output property event in the context
- it was intended for. This is inelegant but not inefficient.
- */
- if (context ()->is_alias (ev->get_property ("context-type")))
- props_.push_back (ev);
+ props_.push_back (ev);
}
void
@@ -59,11 +56,16 @@ Output_property_engraver::acknowledge_grob (Grob_info inf)
if (scm_is_symbol (grob)
&& ly_symbol2string (grob) != inf.grob ()->name ())
continue;
+ SCM typ = o->get_property ("context-type");
SCM proc = o->get_property ("procedure");
- scm_call_3 (proc,
- inf.grob ()->self_scm (),
- d->self_scm (),
- context ()->self_scm ());
+ for (Context *c = d; c; c = c->get_parent_context ())
+ {
+ if (c->is_alias (typ))
+ scm_call_3 (proc,
+ inf.grob ()->self_scm (),
+ d->self_scm (),
+ c->self_scm ());
+ }
}
}
diff --git a/lily/parser.yy b/lily/parser.yy
index 52fe450b7d..83e95491c2 100644
--- a/lily/parser.yy
+++ b/lily/parser.yy
@@ -229,7 +229,7 @@ static Music *make_music_with_input (SCM name, Input where);
SCM check_scheme_arg (Lily_parser *parser, Input loc,
SCM arg, SCM args, SCM pred, SCM disp = SCM_UNDEFINED);
SCM make_music_from_simple (Lily_parser *parser, Input loc, SCM pitch);
-SCM loc_on_music (Lily_parser *parser, Input loc, SCM arg);
+SCM loc_on_copy (Lily_parser *parser, Input loc, SCM arg);
SCM make_chord_elements (Input loc, SCM pitch, SCM dur, SCM modification_list);
SCM make_chord_step (SCM step, Rational alter);
SCM make_simple_markup (SCM a);
@@ -346,7 +346,6 @@ If we give names, Bison complains.
%token BOOK_IDENTIFIER
%token CHORD_MODIFIER
%token CHORD_REPETITION
-%token CONTEXT_MOD_IDENTIFIER
%token DRUM_PITCH
/* Artificial token for durations in argument lists */
%token DURATION_ARG
@@ -501,8 +500,8 @@ lookup:
LOOKUP_IDENTIFIER
| LOOKUP_IDENTIFIER '.' symbol_list_rev
{
- $$ = loc_on_music (parser, @$,
- nested_property ($1, scm_reverse_x ($3, SCM_EOL)));
+ $$ = loc_on_copy (parser, @$,
+ nested_property ($1, scm_reverse_x ($3, SCM_EOL)));
}
;
@@ -1494,14 +1493,6 @@ context_modification:
parser->lexer_->pop_state ();
$$ = $4;
}
- | WITH CONTEXT_MOD_IDENTIFIER
- {
- $$ = $2;
- }
- | CONTEXT_MOD_IDENTIFIER
- {
- $$ = $1;
- }
| WITH context_modification_arg
{
if (unsmob ($2)) {
@@ -1511,7 +1502,10 @@ context_modification:
if (unsmob ($2))
$$ = $2;
else {
- parser->parser_error (@2, _ ("not a context mod"));
+ // let's permit \with #*unspecified* to go for
+ // an empty context mod
+ if (!scm_is_eq ($2, SCM_UNSPECIFIED))
+ parser->parser_error (@2, _ ("not a context mod"));
$$ = Context_mod ().smobbed_copy ();
}
}
@@ -1564,24 +1558,16 @@ context_mod_list:
if (!SCM_UNBNDP ($2))
unsmob ($1)->add_context_mod ($2);
}
- | context_mod_list CONTEXT_MOD_IDENTIFIER {
- Context_mod *md = unsmob ($2);
- if (md)
- unsmob ($1)->add_context_mods (md->get_mods ());
- }
| context_mod_list context_mod_arg {
- if (scm_is_eq ($2, SCM_UNSPECIFIED))
- ;
- else if (unsmob ($2)) {
+ if (unsmob ($2)) {
SCM proc = parser->lexer_->lookup_identifier ("context-mod-music-handler");
$2 = scm_call_1 (proc, $2);
}
if (unsmob ($2))
unsmob ($$)->add_context_mods
(unsmob ($2)->get_mods ());
- else {
+ else if (!scm_is_eq ($2, SCM_UNSPECIFIED))
parser->parser_error (@2, _ ("not a context mod"));
- }
}
;
@@ -2006,7 +1992,7 @@ function_arglist_backup:
$$ = scm_cons ($$, $3);
else
{
- $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @3, $1), $3);
MYBACKUP (SCM_ARG, $4, @4);
}
}
@@ -2017,7 +2003,7 @@ function_arglist_backup:
{
$$ = scm_cons ($4, $3);
} else {
- $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @3, $1), $3);
MYBACKUP (EVENT_IDENTIFIER, $4, @4);
}
}
@@ -2033,7 +2019,7 @@ function_arglist_backup:
} else if (scm_is_true (scm_call_1 ($2, $4)))
$$ = scm_cons ($4, $3);
else {
- $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @3, $1), $3);
MYBACKUP (PITCH_IDENTIFIER, $4, @4);
}
}
@@ -2049,7 +2035,7 @@ function_arglist_backup:
} else if (scm_is_true (scm_call_1 ($2, $4)))
$$ = scm_cons ($4, $3);
else {
- $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @3, $1), $3);
MYBACKUP (TONICNAME_PITCH, $4, @4);
}
}
@@ -2058,7 +2044,7 @@ function_arglist_backup:
if (scm_is_true (scm_call_1 ($2, $4)))
$$ = scm_cons ($4, $3);
else {
- $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @3, $1), $3);
MYBACKUP (SCM_IDENTIFIER, $4, @4);
}
}
@@ -2080,11 +2066,11 @@ function_arglist_backup:
($2, make_music_from_simple (parser, @4, d))))
MYREPARSE (@4, $2, DURATION_ARG, d);
else {
- $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @3, $1), $3);
MYBACKUP (UNSIGNED, $4, @4);
}
} else {
- $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @3, $1), $3);
MYBACKUP (UNSIGNED, $4, @4);
}
}
@@ -2096,7 +2082,7 @@ function_arglist_backup:
$$ = $3;
MYREPARSE (@4, $2, REAL, $4);
} else {
- $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @3, $1), $3);
MYBACKUP (REAL, $4, @4);
}
}
@@ -2106,7 +2092,7 @@ function_arglist_backup:
{
$$ = scm_cons ($4, $3);
} else {
- $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @3, $1), $3);
MYBACKUP (NUMBER_IDENTIFIER, $4, @4);
}
}
@@ -2123,7 +2109,7 @@ function_arglist_backup:
if (scm_is_true (scm_call_1 ($2, $$)))
$$ = scm_cons ($$, $3);
else {
- $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @3, $1), $3);
MYBACKUP (UNSIGNED, $5, @5);
parser->lexer_->push_extra_token (@4, '-');
}
@@ -2136,7 +2122,7 @@ function_arglist_backup:
MYREPARSE (@5, $2, REAL, n);
$$ = $3;
} else {
- $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @3, $1), $3);
MYBACKUP (REAL, n, @5);
}
}
@@ -2146,7 +2132,7 @@ function_arglist_backup:
if (scm_is_true (scm_call_1 ($2, n))) {
$$ = scm_cons (n, $3);
} else {
- $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @3, $1), $3);
MYBACKUP (NUMBER_IDENTIFIER, n, @5);
}
}
@@ -2160,7 +2146,7 @@ function_arglist_backup:
($2, make_music_from_simple (parser, @4, $4))))
MYREPARSE (@4, $2, DURATION_ARG, $4);
else {
- $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @3, $1), $3);
MYBACKUP (DURATION_IDENTIFIER, $4, @4);
}
}
@@ -2175,7 +2161,7 @@ function_arglist_backup:
else
$$ = scm_cons (res, $3);
else {
- $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @3, $1), $3);
MYBACKUP (SCM_IDENTIFIER, $4, @4);
}
}
@@ -2190,7 +2176,7 @@ function_arglist_backup:
else
$$ = scm_cons (res, $3);
else {
- $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @3, $1), $3);
MYBACKUP (STRING, $4, @4);
}
}
@@ -2229,7 +2215,7 @@ function_arglist:
function_arglist_nonbackup
| EXPECT_OPTIONAL EXPECT_SCM function_arglist_skip_nonbackup DEFAULT
{
- $$ = scm_cons (loc_on_music (parser, @4, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @4, $1), $3);
}
;
@@ -2237,7 +2223,7 @@ function_arglist_skip_nonbackup:
function_arglist_nonbackup
| EXPECT_OPTIONAL EXPECT_SCM function_arglist_skip_nonbackup
{
- $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @3, $1), $3);
}
;
@@ -2497,7 +2483,7 @@ function_arglist_optional:
function_arglist_backup
| EXPECT_OPTIONAL EXPECT_SCM function_arglist_skip_backup DEFAULT
{
- $$ = scm_cons (loc_on_music (parser, @4, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @4, $1), $3);
}
| function_arglist_skip_backup BACKUP
;
@@ -2506,7 +2492,7 @@ function_arglist_skip_backup:
function_arglist_backup
| EXPECT_OPTIONAL EXPECT_SCM function_arglist_skip_backup
{
- $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
+ $$ = scm_cons (loc_on_copy (parser, @3, $1), $3);
}
;
@@ -2956,15 +2942,11 @@ event_chord:
}
} %prec ':'
| CHORD_REPETITION optional_notemode_duration post_events {
- Input i;
- i.set_location (@1, @3);
- $$ = MAKE_SYNTAX (repetition_chord, i,
+ $$ = MAKE_SYNTAX (repetition_chord, @$,
$2, scm_reverse_x ($3, SCM_EOL));
} %prec ':'
| MULTI_MEASURE_REST optional_notemode_duration post_events {
- Input i;
- i.set_location (@1, @3);
- $$ = MAKE_SYNTAX (multi_measure_rest, i, $2,
+ $$ = MAKE_SYNTAX (multi_measure_rest, @$, $2,
scm_reverse_x ($3, SCM_EOL));
} %prec ':'
| tempo_event
@@ -4088,7 +4070,7 @@ Lily_lexer::try_special_identifiers (SCM *destination, SCM sid)
return SCM_IDENTIFIER;
} else if (unsmob (sid)) {
*destination = unsmob (sid)->smobbed_copy ();
- return CONTEXT_MOD_IDENTIFIER;
+ return SCM_IDENTIFIER;
} else if (Music *mus = unsmob (sid)) {
mus = mus->clone ();
*destination = mus->self_scm ();
@@ -4164,7 +4146,7 @@ SCM check_scheme_arg (Lily_parser *parser, Input loc,
return args;
}
-SCM loc_on_music (Lily_parser *parser, Input loc, SCM arg)
+SCM loc_on_copy (Lily_parser *parser, Input loc, SCM arg)
{
if (Music *m = unsmob (arg))
{
@@ -4172,6 +4154,34 @@ SCM loc_on_music (Lily_parser *parser, Input loc, SCM arg)
m->set_spot (parser->lexer_->override_input (loc));
return m->unprotect ();
}
+ if (Book *b = unsmob (arg))
+ {
+ b = b->clone ();
+ b->origin ()->set_spot (parser->lexer_->override_input (loc));
+ return b->unprotect ();
+ }
+ if (Context_def *cd = unsmob (arg))
+ {
+ cd = cd->clone ();
+ cd->origin ()->set_spot (parser->lexer_->override_input (loc));
+ return cd->unprotect ();
+ }
+ if (Output_def *od = unsmob (arg))
+ {
+ od = od->clone ();
+ od->input_origin_ = parser->lexer_->override_input (loc);
+ return od->unprotect ();
+ }
+ if (Score *s = unsmob (arg))
+ {
+ s = s->clone ();
+ s->origin ()->set_spot (parser->lexer_->override_input (loc));
+ return s->unprotect ();
+ }
+ if (Context_mod *cm = unsmob (arg))
+ {
+ return cm->smobbed_copy ();
+ }
return arg;
}
diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc
index 1a06ca6422..80ceb5f431 100644
--- a/lily/slur-engraver.cc
+++ b/lily/slur-engraver.cc
@@ -189,14 +189,14 @@ Slur_engraver::finalize ()
}
void
-Slur_engraver::create_slur (const string &spanner_id, Event_info evi, Grob *g_cause, Direction dir, bool left_broken)
+Slur_engraver::create_slur (SCM spanner_id, Event_info evi, Grob *g_cause, Direction dir, bool left_broken)
{
Grob *ccc = left_broken
? unsmob (get_property ("currentCommandColumn"))
: 0; // efficiency
SCM cause = evi.slur_ ? evi.slur_->self_scm () : g_cause->self_scm ();
Spanner *slur = make_spanner (grob_symbol (), cause);
- slur->set_property ("spanner-id", ly_string2scm (spanner_id));
+ slur->set_property ("spanner-id", spanner_id);
if (dir)
set_grob_direction (slur, dir);
if (left_broken)
@@ -209,7 +209,7 @@ Slur_engraver::create_slur (const string &spanner_id, Event_info evi, Grob *g_ca
{
set_grob_direction (slur, DOWN);
slur = make_spanner (grob_symbol (), cause);
- slur->set_property ("spanner-id", ly_string2scm (spanner_id));
+ slur->set_property ("spanner-id", spanner_id);
set_grob_direction (slur, UP);
if (left_broken)
slur->set_bound (LEFT, ccc);
@@ -221,7 +221,7 @@ Slur_engraver::create_slur (const string &spanner_id, Event_info evi, Grob *g_ca
}
bool
-Slur_engraver::can_create_slur (const string &id, vsize old_slurs, vsize *event_idx, Stream_event *ev)
+Slur_engraver::can_create_slur (SCM id, vsize old_slurs, vsize *event_idx, Stream_event *ev)
{
for (vsize j = slurs_.size (); j--;)
{
@@ -229,7 +229,7 @@ Slur_engraver::can_create_slur (const string &id, vsize old_slurs, vsize *event_
Direction updown = to_dir (ev->get_property ("direction"));
// Check if we already have a slur with the same spanner-id.
- if (id == robust_scm2string (slur->get_property ("spanner-id"), ""))
+ if (ly_is_equal (id, slur->get_property ("spanner-id")))
{
if (j < old_slurs)
{
@@ -280,13 +280,13 @@ Slur_engraver::can_create_slur (const string &id, vsize old_slurs, vsize *event_
bool
Slur_engraver::try_to_end (Event_info evi)
{
- string id = robust_scm2string (evi.slur_->get_property ("spanner-id"), "");
+ SCM id = evi.slur_->get_property ("spanner-id");
// Find the slurs that are ended with this event (by checking the spanner-id)
bool ended = false;
for (vsize j = slurs_.size (); j--;)
{
- if (id == robust_scm2string (slurs_[j]->get_property ("spanner-id"), ""))
+ if (ly_is_equal (id, slurs_[j]->get_property ("spanner-id")))
{
ended = true;
end_slurs_.push_back (slurs_[j]);
@@ -305,16 +305,14 @@ Slur_engraver::process_music ()
{
for (vsize i = 0; i < stop_events_.size (); i++)
{
- string id = robust_scm2string
- (stop_events_[i].slur_->get_property ("spanner-id"), "");
+ SCM id = stop_events_[i].slur_->get_property ("spanner-id");
bool ended = try_to_end (stop_events_[i]);
if (ended)
{
// Ignore redundant stop events for this id
for (vsize j = stop_events_.size (); --j > i;)
{
- if (id == robust_scm2string
- (stop_events_[j].slur_->get_property ("spanner-id"), ""))
+ if (ly_is_equal (id, stop_events_[j].slur_->get_property ("spanner-id")))
stop_events_.erase (stop_events_.begin () + j);
}
}
@@ -326,7 +324,7 @@ Slur_engraver::process_music ()
for (vsize i = start_events_.size (); i--;)
{
Stream_event *ev = start_events_[i].slur_;
- string id = robust_scm2string (ev->get_property ("spanner-id"), "");
+ SCM id = ev->get_property ("spanner-id");
Direction updown = to_dir (ev->get_property ("direction"));
if (can_create_slur (id, old_slurs, &i, ev))
diff --git a/lily/staff-performer.cc b/lily/staff-performer.cc
index 3a05cbd0e2..592c6a7e01 100644
--- a/lily/staff-performer.cc
+++ b/lily/staff-performer.cc
@@ -25,6 +25,7 @@
#include "audio-staff.hh"
#include "context.hh"
#include "international.hh"
+#include "midi-cc-announcer.hh"
#include "performer-group.hh"
#include "warn.hh"
#include "lily-imports.hh"
@@ -54,7 +55,22 @@ private:
int get_channel (const string &instrument);
Audio_staff *get_audio_staff (const string &voice);
Audio_staff *new_audio_staff (const string &voice);
- Audio_dynamic *get_dynamic (const string &voice);
+
+ class Midi_control_initializer : public Midi_control_change_announcer
+ {
+ public:
+ Midi_control_initializer (Staff_performer *performer,
+ Audio_staff *audio_staff,
+ int channel);
+
+ SCM get_property_value (const char *property_name);
+ void do_announce (Audio_control_change *item);
+
+ private:
+ Staff_performer *performer_;
+ Audio_staff *audio_staff_;
+ int channel_;
+ };
string instrument_string_;
int channel_;
@@ -62,10 +78,8 @@ private:
Audio_text *instrument_name_;
Audio_text *name_;
Audio_tempo *tempo_;
- map > note_map_;
map staff_map_;
map channel_map_;
- map dynamic_map_;
// Would prefer to have the following two items be
// members of the containing class Performance,
// so they can be reset for each new midi file output.
@@ -135,32 +149,9 @@ Staff_performer::new_audio_staff (const string &voice)
staff_map_[voice] = audio_staff;
if (!instrument_string_.empty ())
set_instrument (channel_, voice);
- // Set initial values (if any) for control functions.
- for (const Audio_control_function_value_change::Context_property *p
- = Audio_control_function_value_change::context_properties_;
- p->name_; ++p)
- {
- SCM value = get_property (p->name_);
- if (scm_is_number (value))
- {
- Real val = scm_to_double (value);
- if (val >= p->range_min_ && val <= p->range_max_)
- {
- // Normalize the value to the 0.0 to 1.0 range.
- val = ((val - p->range_min_)
- / (p->range_max_ - p->range_min_));
- Audio_control_function_value_change *item
- = new Audio_control_function_value_change (p->control_, val);
- item->channel_ = channel_;
- audio_staff->add_audio_item (item);
- announce_element (Audio_element_info (item, 0));
- }
- else
- warning (_f ("ignoring out-of-range value change for MIDI "
- "property `%s'",
- p->name_));
- }
- }
+ // Set initial values (if any) for MIDI controls.
+ Midi_control_initializer i (this, audio_staff, channel_);
+ i.announce_control_changes ();
return audio_staff;
}
@@ -184,15 +175,6 @@ Staff_performer::get_audio_staff (const string &voice)
return new_audio_staff (voice);
}
-Audio_dynamic *
-Staff_performer::get_dynamic (const string &voice)
-{
- map::const_iterator i = dynamic_map_.find (voice);
- if (i != dynamic_map_.end ())
- return i->second;
- return 0;
-}
-
void
Staff_performer::process_music ()
{
@@ -226,22 +208,6 @@ Staff_performer::stop_translation_timestep ()
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 >::iterator vi = note_map_.begin ();
- vi != note_map_.end (); ++vi)
- {
- Audio_dynamic *d = get_dynamic (vi->first);
- if (d)
- {
- for (deque::iterator ni = vi->second.begin ();
- ni != vi->second.end (); ++ni)
- (*ni)->dynamic_ = d;
- }
- }
- note_map_.clear ();
}
void
@@ -316,47 +282,50 @@ Staff_performer::get_channel (const string &instrument)
void
Staff_performer::acknowledge_audio_element (Audio_element_info inf)
{
- if (Audio_item *ai = dynamic_cast (inf.elem_))
+ /* map each context (voice) to its own track */
+ Context *c = inf.origin_contexts (this)[0];
+ string voice;
+ if (c->is_alias (ly_symbol2scm ("Voice")))
+ voice = c->id_string ();
+ SCM channel_mapping = get_property ("midiChannelMapping");
+ string str = new_instrument_string ();
+ if (!scm_is_eq (channel_mapping, ly_symbol2scm ("instrument")))
+ channel_ = get_channel (voice);
+ else if (channel_ < 0 && str.empty ())
+ channel_ = get_channel (str);
+ if (str.length ())
{
- /* map each context (voice) to its own track */
- Context *c = inf.origin_contexts (this)[0];
- string voice;
- if (c->is_alias (ly_symbol2scm ("Voice")))
- voice = c->id_string ();
- SCM channel_mapping = get_property ("midiChannelMapping");
- string str = new_instrument_string ();
- if (!scm_is_eq (channel_mapping, ly_symbol2scm ("instrument")))
- channel_ = get_channel (voice);
- else if (channel_ < 0 && str.empty ())
+ if (!scm_is_eq (channel_mapping, ly_symbol2scm ("voice")))
channel_ = get_channel (str);
- if (str.length ())
- {
- if (!scm_is_eq (channel_mapping, ly_symbol2scm ("voice")))
- channel_ = get_channel (str);
- set_instrument (channel_, voice);
- set_instrument_name (voice);
- }
+ set_instrument (channel_, voice);
+ set_instrument_name (voice);
+ }
+ Audio_staff *audio_staff = get_audio_staff (voice);
+ if (Audio_item *ai = dynamic_cast (inf.elem_))
+ {
ai->channel_ = channel_;
- Audio_staff *audio_staff = get_audio_staff (voice);
- bool encode_dynamics_as_velocity_ = true;
- if (encode_dynamics_as_velocity_)
- {
- if (Audio_note *n = dynamic_cast (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 (inf.elem_))
- {
- dynamic_map_[voice] = d;
- // Output volume as velocity: skip Midi_dynamic output for the
- // current element.
- return;
- }
- }
audio_staff->add_audio_item (ai);
}
}
+Staff_performer::Midi_control_initializer::Midi_control_initializer
+(Staff_performer *performer, Audio_staff *audio_staff, int channel)
+ : performer_ (performer),
+ audio_staff_ (audio_staff),
+ channel_ (channel)
+{
+}
+
+SCM Staff_performer::Midi_control_initializer::get_property_value
+(const char *property_name)
+{
+ return performer_->get_property (property_name);
+}
+
+void Staff_performer::Midi_control_initializer::do_announce
+(Audio_control_change *item)
+{
+ item->channel_ = channel_;
+ audio_staff_->add_audio_item (item);
+ performer_->announce_element (Audio_element_info (item, 0));
+}
diff --git a/ly/Welcome-to-LilyPond-MacOS.ly b/ly/Welcome-to-LilyPond-MacOS.ly
index fe8e3b02a7..5768d8b5f0 100644
--- a/ly/Welcome-to-LilyPond-MacOS.ly
+++ b/ly/Welcome-to-LilyPond-MacOS.ly
@@ -23,7 +23,7 @@ That's it. For more information, visit http://lilypond.org .
%}
-\version "2.19.45" % necessary for upgrading to future LilyPond versions.
+\version "2.19.47" % necessary for upgrading to future LilyPond versions.
\header{
title = "A scale in LilyPond"
diff --git a/ly/Welcome_to_LilyPond.ly b/ly/Welcome_to_LilyPond.ly
index cb4128f17f..0dae0bf064 100644
--- a/ly/Welcome_to_LilyPond.ly
+++ b/ly/Welcome_to_LilyPond.ly
@@ -32,7 +32,7 @@ Good luck with LilyPond! Happy engraving.
%}
-\version "2.19.45" % necessary for upgrading to future LilyPond versions.
+\version "2.19.47" % necessary for upgrading to future LilyPond versions.
\header{
title = "A scale in LilyPond"
diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly
index 3637871a66..0b5b8f7f2a 100644
--- a/ly/engraver-init.ly
+++ b/ly/engraver-init.ly
@@ -16,7 +16,7 @@
%%%% You should have received a copy of the GNU General Public License
%%%% along with LilyPond. If not, see .
-\version "2.19.19"
+\version "2.19.46"
\context {
\name "Global"
@@ -35,7 +35,6 @@
\description "A context for displaying fret diagrams."
\consists "Fretboard_engraver"
- \consists "Output_property_engraver"
\consists "Axis_group_engraver"
\consists "Separating_line_group_engraver"
\consists "Font_size_engraver"
@@ -54,7 +53,6 @@
\type "Engraver_group"
\name "Staff"
- \consists "Output_property_engraver"
\consists "Bar_engraver"
\consists "Pure_from_neighbor_engraver"
%% Bar_engraver must be first so default bars aren't overwritten
@@ -177,7 +175,6 @@ contained staves are not connected vertically."
\override Stem.neutral-direction = #UP
\override Beam.neutral-direction = #UP
- \consists "Output_property_engraver"
\consists "Font_size_engraver"
\consists "Separating_line_group_engraver"
\consists "Dot_column_engraver"
@@ -218,7 +215,6 @@ multiple voices on the same staff."
\consists "Font_size_engraver"
\consists "Pitched_trill_engraver"
- \consists "Output_property_engraver"
\consists "Arpeggio_engraver"
\consists "Multi_measure_rest_engraver"
\consists "Text_spanner_engraver"
@@ -371,7 +367,6 @@ together, never separately."
\override DynamicText.extra-spacing-width = ##f
\consists "Span_bar_stub_engraver"
\consists "Span_arpeggio_engraver"
- \consists "Output_property_engraver"
systemStartDelimiter = #'SystemStartBracket
%% explicitly set instrument, so it is not inherited from the parent
instrumentName = #'()
@@ -433,7 +428,6 @@ it with a different one. Often used with @code{\\stopStaff} and
\type "Engraver_group"
\name "Dynamics"
\alias "Voice"
- \consists "Output_property_engraver"
\consists "Bar_engraver"
\consists "Piano_pedal_engraver"
\consists "Script_engraver"
@@ -535,7 +529,6 @@ printing of a single line of lyrics."
% \key, \transposition
\description "Typesets chord names."
- \consists "Output_property_engraver"
\consists "Separating_line_group_engraver"
\consists "Chord_name_engraver"
\consists "Axis_group_engraver"
diff --git a/ly/grace-init.ly b/ly/grace-init.ly
index 6fe32f49fb..a46111e4d9 100644
--- a/ly/grace-init.ly
+++ b/ly/grace-init.ly
@@ -1,7 +1,7 @@
\version "2.17.6"
-startGraceSlur = #(make-music 'SlurEvent 'span-direction START 'spanner-id "grace")
-stopGraceSlur = #(make-music 'SlurEvent 'span-direction STOP 'spanner-id "grace")
+startGraceSlur = #(make-music 'SlurEvent 'span-direction START 'spanner-id 'grace)
+stopGraceSlur = #(make-music 'SlurEvent 'span-direction STOP 'spanner-id 'grace)
startGraceMusic = {
diff --git a/ly/music-functions-init.ly b/ly/music-functions-init.ly
index a23d154fd8..76c2ec64b8 100644
--- a/ly/music-functions-init.ly
+++ b/ly/music-functions-init.ly
@@ -56,12 +56,17 @@ addQuote =
(add-quotable name music))
%% keep these two together
-afterGraceFraction = #(cons 6 8)
+afterGraceFraction = 3/4
afterGrace =
-#(define-music-function (main grace) (ly:music? ly:music?)
- (_i "Create @var{grace} note(s) after a @var{main} music expression.")
+#(define-music-function (fraction main grace) ((fraction?) ly:music? ly:music?)
+ (_i "Create @var{grace} note(s) after a @var{main} music expression.
+
+The musical position of the grace expression is after a
+given fraction of the main note's duration has passed. If
+@var{fraction} is not specified as first argument, it is taken from
+@code{afterGraceFraction} which has a default value of @code{3/4}.")
(let ((main-length (ly:music-length main))
- (fraction (ly:parser-lookup 'afterGraceFraction)))
+ (fraction (or fraction (ly:parser-lookup 'afterGraceFraction))))
(make-simultaneous-music
(list
main
@@ -71,10 +76,8 @@ afterGrace =
(make-music 'SkipMusic
'duration (ly:make-duration
0 0
- (* (ly:moment-main-numerator main-length)
- (car fraction))
- (* (ly:moment-main-denominator main-length)
- (cdr fraction))))
+ (* (ly:moment-main main-length)
+ (/ (car fraction) (cdr fraction)))))
(make-music 'GraceMusic
'element grace)))))))
@@ -1014,13 +1017,10 @@ creation.")
(if p
(make-music 'ApplyOutputEvent
'context-type (first p)
+ 'symbol (second p)
'procedure
(lambda (grob orig-context context)
- (if (equal?
- (cdr (assoc 'name (ly:grob-property grob 'meta)))
- (second p))
- (ly:grob-set-nested-property!
- grob (cddr p) value))))
+ (ly:grob-set-nested-property! grob (cddr p) value)))
(make-music 'Music))))
@@ -1551,7 +1551,12 @@ retrograde =
#(define-music-function (music)
(ly:music?)
(_i "Return @var{music} in reverse order.")
- (retrograde-music music))
+ (retrograde-music
+ (expand-repeat-notes!
+ (expand-repeat-chords!
+ (cons 'rhythmic-event
+ (ly:parser-lookup '$chord-repeat-events))
+ music))))
revertTimeSignatureSettings =
#(define-music-function
diff --git a/ly/performer-init.ly b/ly/performer-init.ly
index 00c4bdf3da..644a0bd2d6 100644
--- a/ly/performer-init.ly
+++ b/ly/performer-init.ly
@@ -31,7 +31,7 @@
\consists "Staff_performer"
\consists "Key_performer"
- \consists "Midi_control_function_performer"
+ \consists "Midi_control_change_performer"
}
\context {
diff --git a/ly/spanners-init.ly b/ly/spanners-init.ly
index 756a55579e..8d8a69444f 100644
--- a/ly/spanners-init.ly
+++ b/ly/spanners-init.ly
@@ -1,18 +1,15 @@
\version "2.19.29"
"\\=" =
-#(define-event-function (id event) (number-or-string? ly:event?)
+#(define-event-function (id event) (key? ly:event?)
(_i "This sets the @code{spanner-id} property of the following
-@var{event} to the given @var{id} (numbers will be converted to a
-string). This can be used to tell LilyPond how to connect overlapping
+@var{event} to the given @var{id} (non-negative integer or symbol).
+This can be used to tell LilyPond how to connect overlapping
or parallel slurs or phrasing slurs within a single @code{Voice}.
@lilypond[quote,verbatim]
\\fixed c' { c\\=1( d\\=2( e\\=1) f\\=2) }
@end lilypond\n")
- (set! (ly:music-property event 'spanner-id)
- (if (number? id)
- (number->string id)
- id))
+ (set! (ly:music-property event 'spanner-id) id)
event)
startGroup = #(make-span-event 'NoteGroupingEvent START)
diff --git a/out/ChangeLog b/out/ChangeLog
index 39e8943c23..90a2fe5b71 100644
--- a/out/ChangeLog
+++ b/out/ChangeLog
@@ -1 +1 @@
-See http://git.savannah.gnu.org/gitweb/?p=lilypond.git;a=log;h=refs/tags/release/2.19.45-1
+See http://git.savannah.gnu.org/gitweb/?p=lilypond.git;a=log;h=refs/tags/release/2.19.47-1
diff --git a/out/RELEASE-COMMIT b/out/RELEASE-COMMIT
index 59c21c17d4..0a3bba8376 100644
--- a/out/RELEASE-COMMIT
+++ b/out/RELEASE-COMMIT
@@ -1,32 +1,7 @@
-commit de765c2d8f941423e0e33ced19b1436e7643277a
+commit 753d6200e9ae51f0a98186478beff2d00d63a62b
+Merge: fc5b145 2e0077b
Author: Phil Holmes
-Date: Fri Jul 8 13:58:06 2016 +0100
+Date: Tue Aug 30 11:23:53 2016 +0100
- Release: bump Welcome versions.
+ Update release/unstable with recent changes
-diff --git a/ly/Welcome-to-LilyPond-MacOS.ly b/ly/Welcome-to-LilyPond-MacOS.ly
-index 417b993..fe8e3b0 100644
---- a/ly/Welcome-to-LilyPond-MacOS.ly
-+++ b/ly/Welcome-to-LilyPond-MacOS.ly
-@@ -23,7 +23,7 @@ That's it. For more information, visit http://lilypond.org .
-
- %}
-
--\version "2.19.44" % necessary for upgrading to future LilyPond versions.
-+\version "2.19.45" % necessary for upgrading to future LilyPond versions.
-
- \header{
- title = "A scale in LilyPond"
-diff --git a/ly/Welcome_to_LilyPond.ly b/ly/Welcome_to_LilyPond.ly
-index 6e3e604..cb4128f 100644
---- a/ly/Welcome_to_LilyPond.ly
-+++ b/ly/Welcome_to_LilyPond.ly
-@@ -32,7 +32,7 @@ Good luck with LilyPond! Happy engraving.
-
- %}
-
--\version "2.19.44" % necessary for upgrading to future LilyPond versions.
-+\version "2.19.45" % necessary for upgrading to future LilyPond versions.
-
- \header{
- title = "A scale in LilyPond"
diff --git a/po/ca.po b/po/ca.po
index 89819f371d..871624a989 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -25,7 +25,7 @@ msgstr ""
"Project-Id-Version: lilypond-2.19.26\n"
"Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs\n"
"POT-Creation-Date: 2015-08-27 10:48+0100\n"
-"PO-Revision-Date: 2015-11-11 22:27+0100\n"
+"PO-Revision-Date: 2016-07-04 11:27+0200\n"
"Last-Translator: Walter Garcia-Fontes \n"
"Language-Team: Catalan \n"
"Language: ca\n"
@@ -1670,7 +1670,7 @@ msgstr "Altres llengües"
#: website_post.py:133
#, python-format
msgid "About automatic language selection."
-msgstr "Sobre selecció automà tica de llengua."
+msgstr "Quant a la selecció automà tica de llengua."
#: getopt-long.cc:153
#, c-format
diff --git a/po/lilypond.pot b/po/lilypond.pot
index ae5cfd4108..965a48bf92 100644
--- a/po/lilypond.pot
+++ b/po/lilypond.pot
@@ -6,10 +6,10 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: lilypond 2.19.45\n"
+"Project-Id-Version: lilypond 2.19.47\n"
"Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu."
"lilypond.bugs\n"
-"POT-Creation-Date: 2016-07-08 13:56+0100\n"
+"POT-Creation-Date: 2016-08-13 13:37+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -917,7 +917,7 @@ msgstr ""
msgid "Encountered unprocessed marker %s\n"
msgstr ""
-#: abc2ly.py:1389 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1046
+#: abc2ly.py:1389 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1052
#, python-format
msgid "%s [OPTION]... FILE"
msgstr ""
@@ -930,16 +930,16 @@ msgid ""
msgstr ""
#: abc2ly.py:1398 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231
-#: midi2ly.py:1097 musicxml2ly.py:2766 main.cc:184
+#: midi2ly.py:1103 musicxml2ly.py:2766 main.cc:184
msgid "show version number and exit"
msgstr ""
#: abc2ly.py:1401 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140
-#: midi2ly.py:1064 musicxml2ly.py:2747 main.cc:163
+#: midi2ly.py:1070 musicxml2ly.py:2747 main.cc:163
msgid "show this help and exit"
msgstr ""
-#: abc2ly.py:1404 etf2ly.py:1209 midi2ly.py:1073
+#: abc2ly.py:1404 etf2ly.py:1209 midi2ly.py:1079
msgid "write output to FILE"
msgstr ""
@@ -960,7 +960,7 @@ msgstr ""
#. 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:1416 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258
-#: midi2ly.py:1109 musicxml2ly.py:2909 main.cc:318
+#: midi2ly.py:1115 musicxml2ly.py:2909 main.cc:318
#, c-format, python-format
msgid "Report bugs via %s"
msgstr ""
@@ -1042,7 +1042,7 @@ msgstr ""
msgid "make a numbered backup [default: filename.ext~]"
msgstr ""
-#: convert-ly.py:152 etf2ly.py:1212 lilypond-book.py:234 midi2ly.py:1098
+#: convert-ly.py:152 etf2ly.py:1212 lilypond-book.py:234 midi2ly.py:1104
#: main.cc:186
msgid "show warranty and copyright"
msgstr ""
@@ -1101,7 +1101,7 @@ msgid ""
"file.\n"
msgstr ""
-#: etf2ly.py:1210 midi2ly.py:1069 midi2ly.py:1074 musicxml2ly.py:2859
+#: etf2ly.py:1210 midi2ly.py:1075 midi2ly.py:1080 musicxml2ly.py:2859
#: main.cc:169 main.cc:181
msgid "FILE"
msgstr ""
@@ -1208,7 +1208,7 @@ msgstr ""
msgid "write snippet output files with the same base name as their source file"
msgstr ""
-#: lilypond-book.py:223 midi2ly.py:1092 musicxml2ly.py:2772
+#: lilypond-book.py:223 midi2ly.py:1098 musicxml2ly.py:2772
msgid "be verbose"
msgstr ""
@@ -1310,7 +1310,7 @@ msgstr ""
msgid "warning: "
msgstr ""
-#: midi2ly.py:92 midi2ly.py:1126
+#: midi2ly.py:92 midi2ly.py:1132
msgid "error: "
msgstr ""
@@ -1318,85 +1318,85 @@ msgstr ""
msgid "Exiting... "
msgstr ""
-#: midi2ly.py:834
+#: midi2ly.py:840
msgid "found more than 5 voices on a staff, expect bad output"
msgstr ""
-#: midi2ly.py:1034
+#: midi2ly.py:1040
#, python-format
msgid "%s output to `%s'..."
msgstr ""
-#: midi2ly.py:1047
+#: midi2ly.py:1053
#, python-format
msgid "Convert %s to LilyPond input.\n"
msgstr ""
-#: midi2ly.py:1052
+#: midi2ly.py:1058
msgid "print absolute pitches"
msgstr ""
-#: midi2ly.py:1054 midi2ly.py:1082
+#: midi2ly.py:1060 midi2ly.py:1088
msgid "DUR"
msgstr ""
-#: midi2ly.py:1055
+#: midi2ly.py:1061
msgid "quantise note durations on DUR"
msgstr ""
-#: midi2ly.py:1058
+#: midi2ly.py:1064
msgid "debug printing"
msgstr ""
-#: midi2ly.py:1061
+#: midi2ly.py:1067
msgid "print explicit durations"
msgstr ""
-#: midi2ly.py:1066
+#: midi2ly.py:1072
msgid "prepend FILE to output"
msgstr ""
-#: midi2ly.py:1070
+#: midi2ly.py:1076
msgid "set key: ALT=+sharps|-flats; MINOR=1"
msgstr ""
-#: midi2ly.py:1071
+#: midi2ly.py:1077
msgid "ALT[:MINOR]"
msgstr ""
-#: midi2ly.py:1076
+#: midi2ly.py:1082
msgid "preview of first 4 bars"
msgstr ""
-#: midi2ly.py:1080
+#: midi2ly.py:1086
msgid "suppress progress messages and warnings about excess voices"
msgstr ""
-#: midi2ly.py:1081
+#: midi2ly.py:1087
msgid "quantise note starts on DUR"
msgstr ""
-#: midi2ly.py:1085
+#: midi2ly.py:1091
msgid "use s instead of r for rests"
msgstr ""
-#: midi2ly.py:1087
+#: midi2ly.py:1093
msgid "DUR*NUM/DEN"
msgstr ""
-#: midi2ly.py:1090
+#: midi2ly.py:1096
msgid "allow tuplet durations DUR*NUM/DEN"
msgstr ""
-#: midi2ly.py:1100
+#: midi2ly.py:1106
msgid "treat every text as a lyric"
msgstr ""
-#: midi2ly.py:1103
+#: midi2ly.py:1109
msgid "Examples"
msgstr ""
-#: midi2ly.py:1127
+#: midi2ly.py:1133
msgid "no files specified on command line."
msgstr ""
@@ -1770,6 +1770,33 @@ msgstr ""
msgid "no heads for arpeggio found?"
msgstr ""
+#: audio-item.cc:139
+#, c-format
+msgid "end moment (%s) < start moment (%s)"
+msgstr ""
+
+#: audio-item.cc:153
+#, c-format
+msgid "invalid start volume: %f"
+msgstr ""
+
+#: audio-item.cc:159
+#, c-format
+msgid "invalid target volume: %f"
+msgstr ""
+
+#: audio-item.cc:174
+#, c-format
+msgid ""
+"asked to compute volume at %f for dynamic span of duration %f starting at %s"
+msgstr ""
+
+#: audio-item.cc:182
+#, c-format
+msgid ""
+"asked to compute volume at +%f for dynamic span of duration %f starting at %s"
+msgstr ""
+
#: axis-group-engraver.cc:154
msgid "Axis_group_engraver: vertical group already has a parent"
msgstr ""
@@ -2080,7 +2107,7 @@ msgstr ""
msgid "%d: %s"
msgstr ""
-#: grob.cc:486
+#: grob.cc:487
#, c-format
msgid "ignored infinite %s-offset"
msgstr ""
@@ -2517,17 +2544,17 @@ msgstr ""
msgid "unexpected case fall-through"
msgstr ""
-#: midi-control-function-performer.cc:107 staff-performer.cc:159
+#: midi-cc-announcer.cc:99
#, c-format
msgid "ignoring out-of-range value change for MIDI property `%s'"
msgstr ""
-#: midi-item.cc:93
+#: midi-item.cc:91
#, c-format
msgid "no such MIDI instrument: `%s'"
msgstr ""
-#: midi-item.cc:179
+#: midi-item.cc:177
msgid "Time signature with more than 255 beats. Truncating"
msgstr ""
@@ -3075,11 +3102,11 @@ msgstr ""
msgid "expected to read %d characters, got %d"
msgstr ""
-#: staff-performer.cc:307
+#: staff-performer.cc:273
msgid "MIDI channel wrapped around"
msgstr ""
-#: staff-performer.cc:308
+#: staff-performer.cc:274
msgid "remapping modulo 16"
msgstr ""
@@ -3228,119 +3255,119 @@ msgstr ""
msgid "giving up"
msgstr ""
-#: parser.yy:483 parser.yy:650 parser.yy:989 parser.yy:1070 parser.yy:1306
+#: parser.yy:482 parser.yy:649 parser.yy:988 parser.yy:1069 parser.yy:1305
msgid "bad expression type"
msgstr ""
-#: parser.yy:902 parser.yy:1514 parser.yy:1583
+#: parser.yy:901 parser.yy:1508 parser.yy:1570
msgid "not a context mod"
msgstr ""
-#: parser.yy:983 parser.yy:1062 parser.yy:1214
+#: parser.yy:982 parser.yy:1061 parser.yy:1213
msgid "need \\paper for paper block"
msgstr ""
-#: parser.yy:1096
+#: parser.yy:1095
msgid "Missing music in \\score"
msgstr ""
-#: parser.yy:1133
+#: parser.yy:1132
msgid "\\paper cannot be used in \\score, use \\layout instead"
msgstr ""
-#: parser.yy:1184
+#: parser.yy:1183
msgid "Spurious expression in \\score"
msgstr ""
-#: parser.yy:1388
+#: parser.yy:1387
msgid "music expected"
msgstr ""
-#: parser.yy:1398 parser.yy:1432
+#: parser.yy:1397 parser.yy:1431
msgid "unexpected post-event"
msgstr ""
-#: parser.yy:1440
+#: parser.yy:1439
msgid "Ignoring non-music expression"
msgstr ""
-#: parser.yy:1763 parser.yy:1782
+#: parser.yy:1749 parser.yy:1768
msgid "not a key"
msgstr ""
-#: parser.yy:2642 parser.yy:2760 parser.yy:2773 parser.yy:2782
+#: parser.yy:2628 parser.yy:2746 parser.yy:2759 parser.yy:2768
msgid "bad grob property path"
msgstr ""
-#: parser.yy:2740
+#: parser.yy:2726
msgid "only \\consists and \\remove take non-string argument."
msgstr ""
-#: parser.yy:2801
+#: parser.yy:2787
msgid "bad context property path"
msgstr ""
-#: parser.yy:2886
+#: parser.yy:2872
msgid "markup expected"
msgstr ""
-#: parser.yy:2898
+#: parser.yy:2884
msgid "simple string expected"
msgstr ""
-#: parser.yy:2915
+#: parser.yy:2901
msgid "symbol expected"
msgstr ""
-#: parser.yy:3059
+#: parser.yy:3041
msgid "not a rhythmic event"
msgstr ""
-#: parser.yy:3109
+#: parser.yy:3091
msgid "post-event expected"
msgstr ""
-#: parser.yy:3118 parser.yy:3123
+#: parser.yy:3100 parser.yy:3105
msgid "have to be in Lyric mode for lyrics"
msgstr ""
-#: parser.yy:3199
+#: parser.yy:3181
msgid "expecting string or post-event as script definition"
msgstr ""
-#: parser.yy:3303
+#: parser.yy:3285
msgid "not an articulation"
msgstr ""
-#: parser.yy:3369 parser.yy:3421
+#: parser.yy:3351 parser.yy:3403
msgid "not a duration"
msgstr ""
-#: parser.yy:3442
+#: parser.yy:3424
msgid "bass number expected"
msgstr ""
-#: parser.yy:3534
+#: parser.yy:3516
msgid "have to be in Note mode for notes"
msgstr ""
-#: parser.yy:3573
+#: parser.yy:3555
msgid "have to be in Chord mode for chords"
msgstr ""
-#: parser.yy:3616
+#: parser.yy:3598
msgid "markup outside of text script or \\lyricmode"
msgstr ""
-#: parser.yy:3621
+#: parser.yy:3603
msgid "unrecognized string, not in text script or \\lyricmode"
msgstr ""
-#: parser.yy:3773 parser.yy:3782
+#: parser.yy:3755 parser.yy:3764
msgid "not an unsigned integer"
msgstr ""
-#: parser.yy:3869
+#: parser.yy:3851
msgid "not a markup"
msgstr ""
@@ -3641,12 +3668,12 @@ msgstr ""
msgid "Writing ~a..."
msgstr ""
-#: framework-ps.scm:259
+#: framework-ps.scm:260
#, scheme-format
msgid "CFF font `~a' already embedded, skipping."
msgstr ""
-#: framework-ps.scm:262
+#: framework-ps.scm:263
#, scheme-format
msgid ""
"Different CFF fonts which have the same name `~a' has been detected. The "
@@ -3655,51 +3682,55 @@ msgstr ""
#: framework-ps.scm:267
#, scheme-format
-msgid "Embedding CFF font `~a'"
+msgid "Embedding CFF font `~a'."
+msgstr ""
+
+#: framework-ps.scm:272
+msgid "Initializing embedded CFF font list."
msgstr ""
-#: framework-ps.scm:317
+#: framework-ps.scm:325
#, scheme-format
msgid ""
"Font ~a cannot be loaded via Ghostscript because its font-index (~a) is not "
"zero."
msgstr ""
-#: framework-ps.scm:323
+#: framework-ps.scm:331
#, scheme-format
msgid ""
-"Font ~a cannot be loaded via Ghostscript because it is an OpenType/CFF (OTC) "
-"font."
+"Font ~a cannot be loaded via Ghostscript because it is an OpenType/CFF "
+"Collection (OTC) font."
msgstr ""
-#: framework-ps.scm:329
+#: framework-ps.scm:337
#, scheme-format
msgid ""
"Font ~a cannot be used via Ghostscript because it is a TrueType font that "
"does not have glyph names."
msgstr ""
-#: framework-ps.scm:343
+#: framework-ps.scm:351
#, scheme-format
msgid "cannot embed ~S=~S"
msgstr ""
-#: framework-ps.scm:386
+#: framework-ps.scm:394
#, scheme-format
msgid "cannot extract file matching ~a from ~a"
msgstr ""
-#: framework-ps.scm:403
+#: framework-ps.scm:411
#, scheme-format
msgid "do not know how to embed ~S=~S"
msgstr ""
-#: framework-ps.scm:428
+#: framework-ps.scm:436
#, scheme-format
msgid "do not know how to embed font ~s ~s ~s"
msgstr ""
-#: framework-ps.scm:810
+#: framework-ps.scm:820
msgid ""
"\n"
"The PostScript backend does not support the\n"
@@ -4008,12 +4039,12 @@ msgstr ""
msgid "quoted music `~a' is empty"
msgstr ""
-#: ps-to-png.scm:72 ps-to-png.scm:75
+#: ps-to-png.scm:74 ps-to-png.scm:77
#, scheme-format
msgid "Copying `~a' to `~a'..."
msgstr ""
-#: ps-to-png.scm:77 ps-to-png.scm:79
+#: ps-to-png.scm:79 ps-to-png.scm:81
#, scheme-format
msgid "Deleting `~a'..."
msgstr ""
diff --git a/python/convertrules.py b/python/convertrules.py
index 3e43a28133..f64312a839 100644
--- a/python/convertrules.py
+++ b/python/convertrules.py
@@ -3888,6 +3888,21 @@ def conv (str):
repl, str)
return str
+@rule ((2, 19, 46), r"""\context ... \modification -> \context ... \with \modification
+\consists "Output_property_engraver" ->""")
+def conv (str):
+ word=r'(?:#?"[^"]*"|\b' + wordsyntax + r'\b)'
+ mods = string.join (re.findall ("\n(" + wordsyntax + r")\s*=\s*\\with(?:\s|\\|\{)", str)
+ + ['RemoveEmptyStaves','RemoveAllEmptyStaves'], "|")
+ str = re.sub (r"(\\(?:drums|figures|chords|lyrics|addlyrics|"
+ + r"(?:new|context)\s*" + word
+ + r"(?:\s*=\s*" + word + r")?)\s*)(\\(?:" + mods + "))",
+ r"\1\\with \2", str)
+
+ str = re.sub (r'\\(consists|remove)\s+"?Output_property_engraver"?\s*',
+ '', 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,
diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm
index cb9103a6fc..7ca44b6f3d 100644
--- a/scm/define-grob-properties.scm
+++ b/scm/define-grob-properties.scm
@@ -992,7 +992,7 @@ override:
\\override MultiMeasureRest
#'spacing-pair = #'(staff-bar . staff-bar)
@end example")
- (spanner-id ,string? "An identifier to distinguish concurrent spanners.")
+ (spanner-id ,key? "An identifier to distinguish concurrent spanners.")
(springs-and-rods ,boolean? "Dummy variable for triggering
spacing routines.")
(stacking-dir ,ly:dir? "Stack objects in which direction?")
diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm
index f525edd69a..6ca25b586e 100644
--- a/scm/define-grobs.scm
+++ b/scm/define-grobs.scm
@@ -1787,7 +1787,6 @@
(height-limit . 2.0)
(minimum-length . 1.5)
(ratio . 0.333)
- (spanner-id . "")
(springs-and-rods . ,ly:spanner::set-spacing-rods)
(stencil . ,ly:slur::print)
(thickness . 1.1)
@@ -1957,7 +1956,6 @@
(line-thickness . 0.8)
(minimum-length . 1.5)
(ratio . 0.25)
- (spanner-id . "")
(springs-and-rods . ,ly:spanner::set-spacing-rods)
(stencil . ,ly:slur::print)
(thickness . 1.2)
diff --git a/scm/define-music-properties.scm b/scm/define-music-properties.scm
index 4df3f93340..f8c567d1fa 100644
--- a/scm/define-music-properties.scm
+++ b/scm/define-music-properties.scm
@@ -183,7 +183,7 @@ If zero, signals a beat containing varying durations.")
Options are @code{'text} and @code{'hairpin}.")
(span-text ,markup? "The displayed text for dynamic text
spanners (e.g., cresc.)")
- (spanner-id ,string? "Identifier to distinguish concurrent spanners.")
+ (spanner-id ,key? "Identifier to distinguish concurrent spanners.")
(start-callback ,procedure? "Function to compute the negative length
of starting grace notes. This property can only be defined as initializer
in @file{scm/@/define-music-types.scm}.")
diff --git a/scm/define-music-types.scm b/scm/define-music-types.scm
index e0190eda55..348bcd0e87 100644
--- a/scm/define-music-types.scm
+++ b/scm/define-music-types.scm
@@ -438,7 +438,6 @@ goes down).")
. ((description . "Start or end phrasing slur.
Syntax: @var{note}@code{\\(} and @var{note}@code{\\)}")
- (spanner-id . "")
(types . (post-event span-event event phrasing-slur-event))
))
@@ -570,7 +569,6 @@ Syntax: @code{\\skip} @var{duration}")
. ((description . "Start or end slur.
Syntax: @var{note}@code{(} and @var{note}@code{)}")
- (spanner-id . "")
(types . (post-event span-event event slur-event))
))
diff --git a/scm/framework-ps.scm b/scm/framework-ps.scm
index 8221e5eab3..a404119678 100644
--- a/scm/framework-ps.scm
+++ b/scm/framework-ps.scm
@@ -248,27 +248,32 @@
(define check-conflict-and-embed-cff
(let ((font-list '()))
(lambda (name file-name font-index)
- (let* ((name-symbol (string->symbol name))
- (args-filename-offset
- (cons file-name (ly:get-cff-offset file-name font-index)))
- (found-filename-offset (assq name-symbol font-list)))
- (if found-filename-offset
- (begin
- (if (equal? args-filename-offset (cdr found-filename-offset))
- (ly:debug
- (_ "CFF font `~a' already embedded, skipping.")
- name)
- (ly:warning
- (_ "Different CFF fonts which have the same name `~a' has been detected. The font cannot be embedded.")
- name))
- "")
- (begin
- (ly:debug
- (_ "Embedding CFF font `~a'")
- name)
- (set! font-list
- (acons name-symbol args-filename-offset font-list))
- (ps-embed-cff (ly:otf->cff file-name font-index) name 0)))))))
+ (if name
+ (let* ((name-symbol (string->symbol name))
+ (args-filename-offset
+ (cons file-name (ly:get-cff-offset file-name font-index)))
+ (found-filename-offset (assq name-symbol font-list)))
+ (if found-filename-offset
+ (begin
+ (if (equal? args-filename-offset (cdr found-filename-offset))
+ (ly:debug
+ (_ "CFF font `~a' already embedded, skipping.")
+ name)
+ (ly:warning
+ (_ "Different CFF fonts which have the same name `~a' has been detected. The font cannot be embedded.")
+ name))
+ "")
+ (begin
+ (ly:debug (_ "Embedding CFF font `~a'.") name)
+ (set! font-list
+ (acons name-symbol args-filename-offset font-list))
+ (ps-embed-cff (ly:otf->cff file-name font-index) name 0))))
+ (begin
+ (ly:debug (_ "Initializing embedded CFF font list."))
+ (set! font-list '()))))))
+
+(define (initialize-font-embedding)
+ (check-conflict-and-embed-cff #f #f #f))
(define (write-preamble paper load-fonts? port)
(define (internal-font? font-name-filename)
@@ -283,16 +288,19 @@
(define (load-font-via-GS font-name-filename)
(define (is-collection-font? file-name)
- (let ((port (open-file file-name "rb")))
- (if (eq? (read-char port) #\t)
- (if (eq? (read-char port) #\t)
- (if (eq? (read-char port) #\c)
- (if (eq? (read-char port) #\f)
- #t
- #f)
- #f)
- #f)
- #f)))
+ (let* ((port (open-file file-name "rb"))
+ (retval
+ (if (eq? (read-char port) #\t)
+ (if (eq? (read-char port) #\t)
+ (if (eq? (read-char port) #\c)
+ (if (eq? (read-char port) #\f)
+ #t
+ #f)
+ #f)
+ #f)
+ #f)))
+ (close-port port)
+ retval))
(define (ps-load-file file-name)
(if (string? file-name)
@@ -320,7 +328,7 @@
((and (string? bare-file-name)
(eq? (ly:get-font-format bare-file-name font-index) 'CFF)
(is-collection-font? bare-file-name))
- (ly:warning (_ "Font ~a cannot be loaded via Ghostscript because it is an OpenType/CFF (OTC) font.")
+ (ly:warning (_ "Font ~a cannot be loaded via Ghostscript because it is an OpenType/CFF Collection (OTC) font.")
name)
(load-font font-name-filename))
((and (string? bare-file-name)
@@ -575,6 +583,7 @@ mark {ly~a_stream} /CLOSE pdfmark
(page-number (1- (ly:output-def-lookup paper 'first-page-number)))
(page-count (length page-stencils))
(port (ly:outputter-port outputter)))
+ (initialize-font-embedding)
(if (ly:get-option 'clip-systems)
(clip-system-EPSes basename book))
(if (ly:get-option 'dump-signatures)
@@ -655,6 +664,7 @@ mark {ly~a_stream} /CLOSE pdfmark
(rounded-bbox (to-rounded-bp-box bbox))
(port (ly:outputter-port outputter))
(header (eps-header paper rounded-bbox load-fonts)))
+ (initialize-font-embedding)
(display header port)
(write-preamble paper load-fonts port)
(display "/mark_page_link { pop pop pop pop pop } bind def\n" port)
diff --git a/scm/modal-transforms.scm b/scm/modal-transforms.scm
index 98e9ac3021..f9e26ed360 100644
--- a/scm/modal-transforms.scm
+++ b/scm/modal-transforms.scm
@@ -185,32 +185,110 @@ Typically used to construct a scale for input to
(define-public (retrograde-music music)
"Returns @var{music} in retrograde (reversed) order."
- ;; Copied from LSR #105 and renamed.
;; Included here to allow this module to provide a complete set of
;; common formal operations on motives, i.e transposition,
;; inversion and retrograding.
- (let* ((elements (ly:music-property music 'elements))
- (arts (ly:music-property music 'articulations))
- (reversed (reverse elements))
- (element (ly:music-property music 'element))
- (span-dir (ly:music-property music 'span-direction)))
-
- (ly:music-set-property! music 'elements reversed)
-
- (for-each retrograde-music arts)
-
- (if (ly:music? element)
- (ly:music-set-property!
- music 'element
- (retrograde-music element)))
-
- (if (ly:dir? span-dir)
- (ly:music-set-property! music 'span-direction (- span-dir)))
-
- (for-each retrograde-music reversed)
-
- music))
+ (define (reverse-span! m)
+ ;; invert direction of two-sided spanners
+ (let ((spd (ly:music-property m 'span-direction)))
+ (if (ly:dir? spd)
+ (begin
+ (set! (ly:music-property m 'span-direction) (- spd))
+ (case (ly:music-property m 'name)
+ ((CrescendoEvent)
+ (make-music 'DecrescendoEvent m))
+ ((DecrescendoEvent)
+ (make-music 'CrescendoEvent m))
+ (else m)))
+ m)))
+
+ ;; carryover is a possible list of tie events, the loop returns any
+ ;; such trailing list from the given expression
+ (define (loop m carryover)
+ (define (filter-ties! m carryover field)
+ (let ((vals (ly:music-property m field)))
+ (if (pair? vals)
+ (call-with-values
+ (lambda ()
+ (partition! (music-type-predicate
+ '(tie-event glissando-event)) vals))
+ (lambda (ties no-ties)
+ (set! (ly:music-property m field)
+ (append! (map! reverse-span! no-ties) carryover))
+ ties))
+ (begin
+ (if (pair? carryover)
+ (set! (ly:music-property m field) carryover))
+ '()))))
+
+ ;; The reversal will let some prefatory material stay in front of
+ ;; the following element. Most prominently single
+ ;; overrides/reverts/sets/unsets and applyContext. This does not
+ ;; change the position of a clef (which will generally be useless
+ ;; after retrograding) but it does not jumble the clef change
+ ;; command internals. Also, stuff like \once\override stays at
+ ;; the affected element.
+
+ (define (prefatory? m)
+ (or ((music-type-predicate
+ '(apply-context apply-output-event layout-instruction-event)) m)
+ (and
+ (music-is-of-type? m 'music-wrapper-music)
+ (prefatory? (ly:music-property m 'element)))))
+
+ (define (musiclistreverse lst)
+ (let loop ((lst lst) (res '()) (zeros '()))
+ (cond ((null? lst) (reverse! zeros res))
+ ((prefatory? (car lst))
+ (loop (cdr lst) res (cons (car lst) zeros)))
+ (else
+ (loop (cdr lst) (reverse! zeros (cons (car lst) res)) '())))))
+
+ (cond ((music-is-of-type? m 'event-chord)
+ (let* ((chord-ties
+ (append!
+ (filter-ties! m carryover 'elements)
+ ;; articulations on an event-chord do not occur
+ ;; "naturally" but are supported when user-generated
+ ;; elsewhere, so we treat them properly
+ (filter-ties! m '() 'articulations)))
+ ;; in-chord ties are converted to per-chord ties.
+ ;; This is less than optimal but pretty much the
+ ;; best we can hope to achieve with this approach.
+ (element-ties
+ (append-map!
+ (lambda (m) (filter-ties! m '() 'articulations))
+ (ly:music-property m 'elements))))
+ (append! chord-ties element-ties)))
+
+ ((music-is-of-type? m 'rhythmic-event)
+ (filter-ties! m carryover 'articulations))
+
+ ;; The following is hardly correct but tieing inside of
+ ;; <<...>> is really beyond our pay grade.
+ ((music-is-of-type? m 'simultaneous-music)
+ (append-map! (lambda (m) (loop m (ly:music-deep-copy carryover)))
+ (ly:music-property m 'elements)))
+ (else
+ (let ((elt (ly:music-property m 'element))
+ (elts (ly:music-property m 'elements)))
+ (let ((res
+ (fold loop
+ (if (ly:music? elt) (loop elt carryover) carryover)
+ elts)))
+ (if (ly:music? elt)
+ (set! (ly:music-property m 'element)
+ (reverse-span! elt)))
+ (if (pair? elts)
+ (set! (ly:music-property m 'elements)
+ (map! reverse-span! (musiclistreverse elts))))
+ (append! res (filter-ties! m '() 'articulations)))))))
+ (let ((dangling (loop music '())))
+ (for-each
+ (lambda (t) (ly:music-warning t (_ "Dangling tie in \\retrograde")))
+ dangling))
+ music)
(define-public (pitch-invert around to music)
"If @var{music} is a single pitch, inverts it about @var{around}
diff --git a/scm/ps-to-png.scm b/scm/ps-to-png.scm
index f5d40d0c5c..f20ca61b41 100644
--- a/scm/ps-to-png.scm
+++ b/scm/ps-to-png.scm
@@ -69,6 +69,8 @@
(search-pnmtopng)
tmp2-name)))
+ (close-port port-tmp1)
+ (close-port port-tmp2)
(ly:debug (_ "Copying `~a' to `~a'...") file tmp1-name)
(copy-binary-file file tmp1-name)
(ly:system-with-shell cmd)
diff --git a/scripts/midi2ly.py b/scripts/midi2ly.py
index 5358fc4698..3a29f9aaa1 100644
--- a/scripts/midi2ly.py
+++ b/scripts/midi2ly.py
@@ -267,11 +267,13 @@ class Note:
elif commas < 0:
s = s + "," * -commas
- if ((dump_dur
- and self.duration.compare (reference_note.duration))
- or global_options.explicit_durations):
+ if (dump_dur
+ and (self.duration.compare (reference_note.duration)
+ or global_options.explicit_durations)):
s = s + self.duration.dump ()
+ # Chords need to handle their reference duration themselves
+
reference_note = self
# TODO: move space
@@ -653,13 +655,17 @@ def dump_chord (ch):
s = s + dump (notes[0])
elif len (notes) > 1:
global reference_note
+ reference_dur = reference_note.duration
s = s + '<'
s = s + notes[0].dump (dump_dur=False)
r = reference_note
for i in notes[1:]:
s = s + i.dump (dump_dur=False)
s = s + '>'
- s = s + notes[0].duration.dump () + ' '
+ if (r.duration.compare (reference_dur)
+ or global_options.explicit_durations):
+ s = s + r.duration.dump ()
+ s = s + ' '
reference_note = r
return s
diff --git a/tex/texinfo.tex b/tex/texinfo.tex
index d7e6b1f6b8..79bc925655 100644
--- a/tex/texinfo.tex
+++ b/tex/texinfo.tex
@@ -3,7 +3,7 @@
% Load plain if necessary, i.e., if running under initex.
\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
%
-\def\texinfoversion{2016-05-26.20}
+\def\texinfoversion{2016-07-20.14}
%
% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
@@ -1192,6 +1192,7 @@ where each line of input produces a line of output.}
\ifx\pdfescapestring\thisisundefined
% No primitive available; should we give a warning or log?
% Many times it won't matter.
+ \xdef#1{#1}%
\else
% The expandable \pdfescapestring primitive escapes parentheses,
% backslashes, and other special chars.
@@ -1311,8 +1312,10 @@ output) for that.)}
% We have to set dummies so commands such as @code, and characters
% such as \, aren't expanded when present in a section title.
\indexnofonts
- \turnoffactive
\makevalueexpandable
+ \turnoffactive
+ % Use ASCII approximations in destination names.
+ \passthroughcharsfalse
\def\pdfdestname{#1}%
\txiescapepdf\pdfdestname
\safewhatsit{\pdfdest name{\pdfdestname} xyz}%
@@ -1357,8 +1360,21 @@ output) for that.)}
\fi
%
% Also escape PDF chars in the display string.
- \edef\pdfoutlinetext{#1}%
- \txiescapepdf\pdfoutlinetext
+ \bgroup
+ \ifx \declaredencoding \latone
+ % The PDF format can use an extended form of Latin-1 in bookmark
+ % strings. See Appendix D of the PDF Reference, Sixth Edition, for
+ % the "PDFDocEncoding".
+ \passthroughcharstrue
+ \fi
+ \ifx \declaredencoding \utfeight
+ % TODO: the PDF format can use UTF-16 in bookmark strings, but the
+ % code for this isn't done yet.
+ \fi
+ \globaldefs=1
+ \edef\pdfoutlinetext{#1}%
+ \txiescapepdf\pdfoutlinetext
+ \egroup
%
\pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
}
@@ -1525,11 +1541,21 @@ output) for that.)}
%
% XeTeX version check
%
- \ifnum\strcmp{\the\XeTeXversion\XeTeXrevision}{0.99995}>-1
+ \ifnum\strcmp{\the\XeTeXversion\XeTeXrevision}{0.99996}>-1
+ % TeX Live 2016 contains XeTeX 0.99996 and xdvipdfmx 20160307.
+ % It can be used `dvipdfmx:config' special (from TeX Live SVN r40941).
+ % For avoiding PDF destination name replacement, we use the special
+ % instead of xdvipdfmx commandline option `-C 0x0010'.
+ \special{dvipdfmx:config C 0x0010}
% XeTeX 0.99995+ contains xdvipdfmx 20160307+.
% It can handle Unicode destination name for PDF.
\txiuseunicodedestnametrue
\else
+ % XeTeX < 0.99996 (TeX Live < 2016) cannot be used
+ % `dvipdfmx:config' special.
+ % So for avoiding PDF destination name replacement,
+ % xdvipdfmx commandline option `-C 0x0010' is necessary.
+ %
% XeTeX < 0.99995 can not handle Unicode destination name for PDF
% because xdvipdfmx 20150315 has UTF-16 convert issue.
% It fixed by xdvipdfmx 20160106 (TeX Live SVN r39753).
@@ -1540,7 +1566,7 @@ output) for that.)}
%
% Emulate the primitive of pdfTeX
\def\pdfdest name#1 xyz{%
- \special{pdf:dest (name#1) [@thispage /XYZ @xpos @ypos]}%
+ \special{pdf:dest (name#1) [@thispage /XYZ @xpos @ypos null]}%
}
\def\pdfmkdest#1{{%
% We have to set dummies so commands such as @code, and characters
@@ -3870,7 +3896,7 @@ end
\message{tables,}
-% Tables -- @table, @ftable, @vtable, @item(x).
+% Tables -- @table, @ftable, @ktable, @vtable, @item(x).
% default indentation of table text
\newdimen\tableindent \tableindent=.8in
@@ -3882,7 +3908,7 @@ end
% used internally for \itemindent minus \itemmargin
\newdimen\itemmax
-% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
+% Note @table, @ftable, @ktable and @vtable define @item, @itemx, etc., with
% these defs.
% They also define \itemindex
% to index the item name in whatever manner is desired (perhaps none).
@@ -3950,7 +3976,7 @@ end
\def\item{\errmessage{@item while not in a list environment}}
\def\itemx{\errmessage{@itemx while not in a list environment}}
-% @table, @ftable, @vtable.
+% @table, @ftable, @ktable, @vtable.
\envdef\table{%
\let\itemindex\gobble
\tablecheck{table}%
@@ -3959,6 +3985,10 @@ end
\def\itemindex ##1{\doind {fn}{\code{##1}}}%
\tablecheck{ftable}%
}
+\envdef\ktable{%
+ \def\itemindex ##1{\doind {ky}{\code{##1}}}%
+ \tablecheck{ktable}%
+}
\envdef\vtable{%
\def\itemindex ##1{\doind {vr}{\code{##1}}}%
\tablecheck{vtable}%
@@ -4002,6 +4032,7 @@ end
}
\def\Etable{\endgraf\afterenvbreak}
\let\Eftable\Etable
+\let\Ektable\Etable
\let\Evtable\Etable
\let\Eitemize\Etable
\let\Eenumerate\Etable
@@ -4609,11 +4640,23 @@ end
% Like \expandablevalue, but completely expandable (the \message in the
% definition above operates at the execution level of TeX). Used when
% writing to auxiliary files, due to the expansion that \write does.
+% If flag is undefined, pass through an unexpanded @value command: maybe it
+% will be set by the time it is read back in.
%
% NB flag names containing - or _ may not work here.
\def\dummyvalue#1{%
\expandafter\ifx\csname SET#1\endcsname\relax
- [No value for ``#1'']%
+ \noexpand\value{#1}%
+ \else
+ \csname SET#1\endcsname
+ \fi
+}
+
+% Used for @value's in index entries to form the sort key: expand the @value
+% if possible, otherwise sort late.
+\def\indexnofontsvalue#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ ZZZZZZZ
\else
\csname SET#1\endcsname
\fi
@@ -4760,7 +4803,7 @@ end
% Define \doindex, the driver for all index macros.
% Argument #1 is generated by the calling \fooindex macro,
-% and it the two-letter name of the index.
+% and it is the two-letter name of the index.
\def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx}
\def\doindexxxx #1{\doind{\indexname}{#1}}
@@ -4769,6 +4812,7 @@ end
\def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx}
\def\docodeindexxxx #1{\doind{\indexname}{\code{#1}}}
+
% Used when writing an index entry out to an index file to prevent
% expansion of Texinfo commands that can appear in an index entry.
%
@@ -4787,9 +4831,11 @@ end
\def\}{{\tt\char125}}%
%
% Do the redefinitions.
- \commondummies
+ \definedummies
}
+% Used for the aux and toc files, where @ is the escape character.
+%
% For the aux and toc files, @ is the escape character. So we want to
% redefine everything using @ as the escape character (instead of
% \realbackslash, still used for index files). When everything uses @,
@@ -4802,30 +4848,35 @@ end
\let\} = \rbraceatcmd
%
% Do the redefinitions.
- \commondummies
+ \definedummies
\otherbackslash
}
-% Called from \indexdummies and \atdummies.
+% \definedummyword defines \#1 as \string\#1\space, thus effectively
+% preventing its expansion. This is used only for control words,
+% not control letters, because the \space would be incorrect for
+% control characters, but is needed to separate the control word
+% from whatever follows.
%
-\def\commondummies{%
- % \definedummyword defines \#1 as \string\#1\space, thus effectively
- % preventing its expansion. This is used only for control words,
- % not control letters, because the \space would be incorrect for
- % control characters, but is needed to separate the control word
- % from whatever follows.
- %
- % For control letters, we have \definedummyletter, which omits the
- % space.
- %
- % These can be used both for control words that take an argument and
- % those that do not. If it is followed by {arg} in the input, then
- % that will dutifully get written to the index (or wherever).
- %
- \def\definedummyword ##1{\def##1{\string##1\space}}%
- \def\definedummyletter##1{\def##1{\string##1}}%
- \let\definedummyaccent\definedummyletter
+% These can be used both for control words that take an argument and
+% those that do not. If it is followed by {arg} in the input, then
+% that will dutifully get written to the index (or wherever).
+%
+% For control letters, we have \definedummyletter, which omits the
+% space.
+%
+\def\definedummyword #1{\def#1{\string#1\space}}%
+\def\definedummyletter#1{\def#1{\string#1}}%
+\let\definedummyaccent\definedummyletter
+
+% Called from \indexdummies and \atdummies, to effectively prevent
+% the expansion of commands.
+%
+\def\definedummies{%
%
+ \let\commondummyword\definedummyword
+ \let\commondummyletter\definedummyletter
+ \let\commondummyaccent\definedummyaccent
\commondummiesnofonts
%
\definedummyletter\_%
@@ -4910,77 +4961,77 @@ end
\normalturnoffactive
}
-% \commondummiesnofonts: common to \commondummies and \indexnofonts.
-% Define \definedumyletter, \definedummyaccent and \definedummyword before
-% using.
+% \commondummiesnofonts: common to \definedummies and \indexnofonts.
+% Define \commondummyletter, \commondummyaccent and \commondummyword before
+% using. Used for accents, font commands, and various control letters.
%
\def\commondummiesnofonts{%
% Control letters and accents.
- \definedummyletter\!%
- \definedummyaccent\"%
- \definedummyaccent\'%
- \definedummyletter\*%
- \definedummyaccent\,%
- \definedummyletter\.%
- \definedummyletter\/%
- \definedummyletter\:%
- \definedummyaccent\=%
- \definedummyletter\?%
- \definedummyaccent\^%
- \definedummyaccent\`%
- \definedummyaccent\~%
- \definedummyword\u
- \definedummyword\v
- \definedummyword\H
- \definedummyword\dotaccent
- \definedummyword\ogonek
- \definedummyword\ringaccent
- \definedummyword\tieaccent
- \definedummyword\ubaraccent
- \definedummyword\udotaccent
- \definedummyword\dotless
+ \commondummyletter\!%
+ \commondummyaccent\"%
+ \commondummyaccent\'%
+ \commondummyletter\*%
+ \commondummyaccent\,%
+ \commondummyletter\.%
+ \commondummyletter\/%
+ \commondummyletter\:%
+ \commondummyaccent\=%
+ \commondummyletter\?%
+ \commondummyaccent\^%
+ \commondummyaccent\`%
+ \commondummyaccent\~%
+ \commondummyword\u
+ \commondummyword\v
+ \commondummyword\H
+ \commondummyword\dotaccent
+ \commondummyword\ogonek
+ \commondummyword\ringaccent
+ \commondummyword\tieaccent
+ \commondummyword\ubaraccent
+ \commondummyword\udotaccent
+ \commondummyword\dotless
%
% Texinfo font commands.
- \definedummyword\b
- \definedummyword\i
- \definedummyword\r
- \definedummyword\sansserif
- \definedummyword\sc
- \definedummyword\slanted
- \definedummyword\t
+ \commondummyword\b
+ \commondummyword\i
+ \commondummyword\r
+ \commondummyword\sansserif
+ \commondummyword\sc
+ \commondummyword\slanted
+ \commondummyword\t
%
% Commands that take arguments.
- \definedummyword\abbr
- \definedummyword\acronym
- \definedummyword\anchor
- \definedummyword\cite
- \definedummyword\code
- \definedummyword\command
- \definedummyword\dfn
- \definedummyword\dmn
- \definedummyword\email
- \definedummyword\emph
- \definedummyword\env
- \definedummyword\file
- \definedummyword\image
- \definedummyword\indicateurl
- \definedummyword\inforef
- \definedummyword\kbd
- \definedummyword\key
- \definedummyword\math
- \definedummyword\option
- \definedummyword\pxref
- \definedummyword\ref
- \definedummyword\samp
- \definedummyword\strong
- \definedummyword\tie
- \definedummyword\U
- \definedummyword\uref
- \definedummyword\url
- \definedummyword\var
- \definedummyword\verb
- \definedummyword\w
- \definedummyword\xref
+ \commondummyword\abbr
+ \commondummyword\acronym
+ \commondummyword\anchor
+ \commondummyword\cite
+ \commondummyword\code
+ \commondummyword\command
+ \commondummyword\dfn
+ \commondummyword\dmn
+ \commondummyword\email
+ \commondummyword\emph
+ \commondummyword\env
+ \commondummyword\file
+ \commondummyword\image
+ \commondummyword\indicateurl
+ \commondummyword\inforef
+ \commondummyword\kbd
+ \commondummyword\key
+ \commondummyword\math
+ \commondummyword\option
+ \commondummyword\pxref
+ \commondummyword\ref
+ \commondummyword\samp
+ \commondummyword\strong
+ \commondummyword\tie
+ \commondummyword\U
+ \commondummyword\uref
+ \commondummyword\url
+ \commondummyword\var
+ \commondummyword\verb
+ \commondummyword\w
+ \commondummyword\xref
}
% For testing: output @{ and @} in index sort strings as \{ and \}.
@@ -5036,11 +5087,11 @@ end
%
\def\indexnofonts{%
% Accent commands should become @asis.
- \def\definedummyaccent##1{\let##1\asis}%
+ \def\commondummyaccent##1{\let##1\asis}%
% We can just ignore other control letters.
- \def\definedummyletter##1{\let##1\empty}%
+ \def\commondummyletter##1{\let##1\empty}%
% All control words become @asis by default; overrides below.
- \let\definedummyword\definedummyaccent
+ \let\commondummyword\commondummyaccent
\commondummiesnofonts
%
% Don't no-op \tt, since it isn't a user-level command
@@ -5125,8 +5176,11 @@ end
% goes to end-of-line is not handled.
%
\macrolist
+ \let\value\indexnofontsvalue
}
+
+
\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
@@ -5925,18 +5979,32 @@ end
\global\advance\dimen@ by 1pt
\repeat
}%
- \multiply\dimen@ii by 4
- \divide\dimen@ii by 5
- \ifdim\ht3<\dimen@ii
- % Column heights are too different, so don't make their bottoms
- % flush with each other. The glue at the end of the second column
- % allows a second column to stretch, reducing the difference in
- % height between the two.
- \setbox0=\vbox to\dimen@{\unvbox1\vfill}%
- \setbox2=\vbox to\dimen@{\unvbox3\vskip 0pt plus 0.3\ht0}%
+ \ifdim2\ht1>\vsize
+ % The left column has come out longer than the page itself. (Note
+ % that we have doubled \vsize for the double columns, so
+ % the actual height of the page is 0.5\vsize). Just split the last
+ % of the double column material roughly in half.
+ \setbox2=\box0
+ \setbox0 = \vsplit2 to \dimen@ii
+ \setbox0=\vbox to\dimen@ii{\unvbox0}%
+ \setbox2=\vbox to\dimen@ii{\unvbox2}%
\else
- \setbox0=\vbox to\dimen@{\unvbox1}%
- \setbox2=\vbox to\dimen@{\unvbox3}%
+ \multiply\dimen@ii by 5
+ \divide\dimen@ii by 4
+ \global\setbox3 = \copy0
+ \global\setbox1 = \vsplit3 to \dimen@ii
+ \global\setbox\balancedcolumns=\vbox{\pagesofar}%
+ \ifdim\ht3<\dimen@ii
+ % Column heights are too different, so don't make their bottoms
+ % flush with each other. The glue at the end of the second column
+ % allows a second column to stretch, reducing the difference in
+ % height between the two.
+ \setbox0=\vbox to\dimen@{\unvbox1\vfill}%
+ \setbox2=\vbox to\dimen@{\unvbox3\vskip 0pt plus 0.3\ht0}%
+ \else
+ \setbox0=\vbox to\dimen@{\unvbox1}%
+ \setbox2=\vbox to\dimen@{\unvbox3}%
+ \fi
\fi
\fi
%
@@ -7985,7 +8053,7 @@ end
\newif\ifrecursive % Is it recursive?
% List of all defined macros in the form
-% \definedummyword\macro1\definedummyword\macro2...
+% \commondummyword\macro1\commondummyword\macro2...
% Currently is also contains all @aliases; the list can be split
% if there is a need.
\def\macrolist{}
@@ -7993,7 +8061,7 @@ end
% Add the macro to \macrolist
\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
\def\addtomacrolistxxx#1{%
- \toks0 = \expandafter{\macrolist\definedummyword#1}%
+ \toks0 = \expandafter{\macrolist\commondummyword#1}%
\xdef\macrolist{\the\toks0}%
}
@@ -8134,7 +8202,7 @@ end
% Remove the macro name from \macrolist:
\begingroup
\expandafter\let\csname#1\endcsname \relax
- \let\definedummyword\unmacrodo
+ \let\commondummyword\unmacrodo
\xdef\macrolist{\macrolist}%
\endgroup
\else
@@ -8149,7 +8217,7 @@ end
\ifx #1\relax
% remove this
\else
- \noexpand\definedummyword \noexpand#1%
+ \noexpand\commondummyword \noexpand#1%
\fi
}
@@ -8424,8 +8492,7 @@ end
% its parameters, looking like "\xeatspaces{\hash 1}".
% \paramno is the number of parameters
% \paramlist is a TeX parameter text, e.g. "#1,#2,#3,"
-% There are eight cases: recursive and nonrecursive macros of zero, one,
-% up to nine, and many arguments.
+% There are four cases: macros of zero, one, up to nine, and many arguments.
% \xdef is used so that macro definitions will survive the file
% they're defined in: @include reads the file inside a group.
%
@@ -8440,91 +8507,48 @@ end
\else
\let\xeatspaces\relax % suppress expansion
\fi
- \ifrecursive %%%%%%%%%%%%%% Recursive %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \ifcase\paramno
- % 0
- \expandafter\xdef\csname\the\macname\endcsname{%
- \noexpand\scanmacro{\macrobody}}%
- \or % 1
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\scanmacro{\macrobody}}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname @@@\endcsname}%
+ \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
+ \egroup
+ \noexpand\scanmacro{\macrobody}%
+ }%
+ \else % at most 9
+ \ifnum\paramno<10\relax
+ % @MACNAME sets the context for reading the macro argument
+ % @MACNAME@@ gets the argument, processes backslashes and appends a
+ % comma.
+ % @MACNAME@@@ removes braces surrounding the argument list.
+ % @MACNAME@@@@ scans the macro body with arguments substituted.
\expandafter\xdef\csname\the\macname\endcsname{%
- \bgroup
- \noexpand\braceorline
- \expandafter\noexpand\csname\the\macname @@@\endcsname}%
+ \bgroup
+ \noexpand\expandafter % This \expandafter skip any spaces after the
+ \noexpand\macroargctxt % macro before we change the catcode of space.
+ \noexpand\expandafter
+ \expandafter\noexpand\csname\the\macname @@\endcsname}%
+ \expandafter\xdef\csname\the\macname @@\endcsname##1{%
+ \noexpand\passargtomacro
+ \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}%
\expandafter\xdef\csname\the\macname @@@\endcsname##1{%
- \egroup
- \noexpand\scanmacro{\macrobody}%
- }%
- \else
- \ifnum\paramno<10\relax % at most 9
- % See non-recursive section below for comments
- \expandafter\xdef\csname\the\macname\endcsname{%
- \bgroup
- \noexpand\expandafter
- \noexpand\macroargctxt
- \noexpand\expandafter
- \expandafter\noexpand\csname\the\macname @@\endcsname}%
- \expandafter\xdef\csname\the\macname @@\endcsname##1{%
- \noexpand\passargtomacro
- \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}%
- \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
- \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}%
- \expandafter\expandafter
- \expandafter\xdef
- \expandafter\expandafter
- \csname\the\macname @@@@\endcsname\paramlist{%
- \egroup\noexpand\scanmacro{\macrobody}}%
- \else % 10 or more
- \expandafter\xdef\csname\the\macname\endcsname{%
- \noexpand\getargvals@{\the\macname}{\argl}%
- }%
- \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody
- \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble
- \fi
- \fi
- \else %%%%%%%%%%%%%%%%%%%%%% Non-recursive %%%%%%%%%%%%%%%%%%%%%%%%%%
- \ifcase\paramno
- % 0
+ \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname @@@@\endcsname\paramlist{%
+ \egroup\noexpand\scanmacro{\macrobody}}%
+ \else % 10 or more:
\expandafter\xdef\csname\the\macname\endcsname{%
- \noexpand\scanmacro{\macrobody}}%
- \or % 1
- \expandafter\xdef\csname\the\macname\endcsname{%
- \bgroup
- \noexpand\braceorline
- \expandafter\noexpand\csname\the\macname @@@\endcsname}%
- \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
- \egroup
- \noexpand\scanmacro{\macrobody}%
- }%
- \else % at most 9
- \ifnum\paramno<10\relax
- % @MACNAME sets the context for reading the macro argument
- % @MACNAME@@ gets the argument, processes backslashes and appends a
- % comma.
- % @MACNAME@@@ removes braces surrounding the argument list.
- % @MACNAME@@@@ scans the macro body with arguments substituted.
- \expandafter\xdef\csname\the\macname\endcsname{%
- \bgroup
- \noexpand\expandafter % This \expandafter skip any spaces after the
- \noexpand\macroargctxt % macro before we change the catcode of space.
- \noexpand\expandafter
- \expandafter\noexpand\csname\the\macname @@\endcsname}%
- \expandafter\xdef\csname\the\macname @@\endcsname##1{%
- \noexpand\passargtomacro
- \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}%
- \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
- \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}%
- \expandafter\expandafter
- \expandafter\xdef
- \expandafter\expandafter
- \csname\the\macname @@@@\endcsname\paramlist{%
- \egroup\noexpand\scanmacro{\macrobody}}%
- \else % 10 or more:
- \expandafter\xdef\csname\the\macname\endcsname{%
- \noexpand\getargvals@{\the\macname}{\argl}%
- }%
- \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody
- \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse
- \fi
+ \noexpand\getargvals@{\the\macname}{\argl}%
+ }%
+ \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody
+ \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble
\fi
\fi}
@@ -8871,6 +8895,9 @@ end
% In this case, the replaced destination names of
% remote PDF cannot be known. In order to avoid replacement,
% you can use commandline option `-C 0x0010' for xdvipdfmx.
+ % If you use XeTeX 0.99996+ (TeX Live 2016+),
+ % the commandline option is not neccesary
+ % because we can use `dvipdfmx:config' special.
\special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A
<< /S /GoToR /F (\the\filename.pdf) /D (name\pdfxrefdest) >> >>}%
\else
@@ -10227,7 +10254,7 @@ directory should work if nowhere else does.}
\countUTFx = "80
\countUTFy = "C2
\def\UTFviiiTmp{%
- \gdef~{
+ \gdef~{%
\ifpassthroughchars $\fi}}%
\UTFviiiLoop
@@ -10278,6 +10305,15 @@ directory should work if nowhere else does.}
\fi
}
+% These macros are used here to construct the name of a control
+% sequence to be defined.
+\def\UTFviiiTwoOctetsName#1#2{%
+ \csname u8:#1\string #2\endcsname}%
+\def\UTFviiiThreeOctetsName#1#2#3{%
+ \csname u8:#1\string #2\string #3\endcsname}%
+\def\UTFviiiFourOctetsName#1#2#3#4{%
+ \csname u8:#1\string #2\string #3\string #4\endcsname}%
+
% For UTF-8 byte sequence (TeX, e-TeX and pdfTeX)
% Definition macro to replace the Unicode character
% Definition macro that is used by @U command
@@ -10294,17 +10330,18 @@ directory should work if nowhere else does.}
\countUTFz = "#1\relax
\begingroup
\parseXMLCharref
+
+ % Give \u8:... its definition. The sequence of seven \expandafter's
+ % expands after the \gdef three times, e.g.
%
- % Access definitions of characters given UTF-8 sequences
- \def\UTFviiiTwoOctets##1##2{%
- \csname u8:##1\string ##2\endcsname}%
- \def\UTFviiiThreeOctets##1##2##3{%
- \csname u8:##1\string ##2\string ##3\endcsname}%
- \def\UTFviiiFourOctets##1##2##3##4{%
- \csname u8:##1\string ##2\string ##3\string ##4\endcsname}%
- \expandafter\expandafter\expandafter\expandafter
- \expandafter\expandafter\expandafter
- \gdef\UTFviiiTmp{#2}%
+ % 1. \UTFviiTwoOctetsName B1 B2
+ % 2. \csname u8:B1 \string B2 \endcsname
+ % 3. \u8: B1 B2 (a single control sequence token)
+ %
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter\gdef \UTFviiiTmp{#2}%
%
\expandafter\ifx\csname uni:#1\endcsname \relax \else
\message{Internal error, already defined: #1}%
@@ -10314,37 +10351,53 @@ directory should work if nowhere else does.}
\expandafter\globallet\csname uni:#1\endcsname \UTFviiiTmp
\endgroup}
%
- % Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp.
+ % Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp
+ % to the corresponding UTF-8 sequence.
\gdef\parseXMLCharref{%
\ifnum\countUTFz < "A0\relax
\errhelp = \EMsimple
\errmessage{Cannot define Unicode char value < 00A0}%
\else\ifnum\countUTFz < "800\relax
\parseUTFviiiA,%
- \parseUTFviiiB C\UTFviiiTwoOctets.,%
+ \parseUTFviiiB C\UTFviiiTwoOctetsName.,%
\else\ifnum\countUTFz < "10000\relax
\parseUTFviiiA;%
\parseUTFviiiA,%
- \parseUTFviiiB E\UTFviiiThreeOctets.{,;}%
+ \parseUTFviiiB E\UTFviiiThreeOctetsName.{,;}%
\else
\parseUTFviiiA;%
\parseUTFviiiA,%
\parseUTFviiiA!%
- \parseUTFviiiB F\UTFviiiFourOctets.{!,;}%
+ \parseUTFviiiB F\UTFviiiFourOctetsName.{!,;}%
\fi\fi\fi
}
+ % Extract a byte from the end of the UTF-8 representation of \countUTFx.
+ % It must be a non-initial byte in the sequence.
+ % Change \uccode of #1 for it to be used in \parseUTFviiiB as one
+ % of the bytes.
\gdef\parseUTFviiiA#1{%
\countUTFx = \countUTFz
\divide\countUTFz by 64
- \countUTFy = \countUTFz
+ \countUTFy = \countUTFz % Save to be the future value of \countUTFz.
\multiply\countUTFz by 64
+
+ % \countUTFz is now \countUTFx with the last 5 bits cleared. Subtract
+ % in order to get the last five bits.
\advance\countUTFx by -\countUTFz
+
+ % Convert this to the byte in the UTF-8 sequence.
\advance\countUTFx by 128
\uccode `#1\countUTFx
\countUTFz = \countUTFy}
- % Used to set \UTFviiiTmp to a UTF-8 byte sequence
+ % Used to put a UTF-8 byte sequence into \UTFviiiTmp
+ % #1 is the increment for \countUTFz to yield a the first byte of the UTF-8
+ % sequence.
+ % #2 is one of the \UTFviii*OctetsName macros.
+ % #3 is always a full stop (.)
+ % #4 is a template for the other bytes in the sequence. The values for these
+ % bytes is substituted in here with \uppercase using the \uccode's.
\gdef\parseUTFviiiB#1#2#3#4{%
\advance\countUTFz by "#10\relax
\uccode `#3\countUTFz