]> git.donarmstrong.com Git - lilypond.git/commitdiff
Merge branch 'master' into translation
authorJean-Charles Malahieude <lilyfan@orange.fr>
Sat, 31 Aug 2013 15:43:48 +0000 (17:43 +0200)
committerJean-Charles Malahieude <lilyfan@orange.fr>
Sat, 31 Aug 2013 15:43:48 +0000 (17:43 +0200)
64 files changed:
Documentation/changes.tely
Documentation/de/included/generating-output.itexi
Documentation/es/included/generating-output.itexi
Documentation/extending/programming-interface.itely
Documentation/fr/included/generating-output.itexi
Documentation/included/generating-output.itexi
Documentation/it/included/generating-output.itexi
Documentation/ja/included/generating-output.itexi
Documentation/nl/included/generating-output.itexi
Documentation/pictures/BadLog.png [new file with mode: 0755]
Documentation/pictures/BadLog2.png [new file with mode: 0755]
Documentation/pictures/DragDrop.png [new file with mode: 0755]
Documentation/pictures/EditFile.png [new file with mode: 0755]
Documentation/pictures/FileSave.png [new file with mode: 0755]
Documentation/pictures/GenPDF.png [new file with mode: 0755]
Documentation/pictures/Learning_Win7_All_Files_Created.png [deleted file]
Documentation/pictures/Learning_Win7_Log_File.png [deleted file]
Documentation/pictures/Learning_Win7_New_Menu.png [deleted file]
Documentation/pictures/Learning_Win7_Open_Context_Menu.png [deleted file]
Documentation/pictures/Learning_Win7_Open_Dragndrop.png [deleted file]
Documentation/pictures/Learning_Win7_Open_Menu.png [deleted file]
Documentation/pictures/Learning_Win7_Pdf_Output.png [deleted file]
Documentation/pictures/Learning_Win7_Save_File_With_Name.png [deleted file]
Documentation/pictures/Learning_Win7_Save_Menu.png [deleted file]
Documentation/pictures/Learning_Win7_Welcome_File_Whole.png [deleted file]
Documentation/pictures/LilyPad.png [new file with mode: 0755]
Documentation/pictures/PDFRead.png [new file with mode: 0755]
Documentation/pictures/SaveAs.png [new file with mode: 0755]
Documentation/web/news-front.itexi
Documentation/web/news.itexi
Documentation/web/server/tweets.xml
VERSION
input/regression/add-grace-property.ly [new file with mode: 0644]
input/regression/arpeggio-span-one-staff-collision.ly [new file with mode: 0644]
input/regression/dynamics-avoid-cross-staff-stem-2.ly [deleted file]
input/regression/slur-cross-staff-beam.ly
lily/accidental.cc
lily/arpeggio.cc
lily/axis-group-interface.cc
lily/dispatcher.cc
lily/include/arpeggio.hh
lily/include/axis-group-interface.hh
lily/include/lily-parser.hh
lily/ledger-line-spanner.cc
lily/line-spanner.cc
lily/parser.yy
lily/pitched-trill-engraver.cc
lily/pointer-group-interface.cc
lily/quote-iterator.cc
lily/script-column.cc
lily/side-position-interface.cc
lily/skyline.cc
lily/span-arpeggio-engraver.cc
lily/stencil-integral.cc
ly/engraver-init.ly
ly/music-functions-init.ly
make/website.make
mf/parmesan-flags.mf
po/lilypond.pot
scm/define-grob-properties.scm
scm/define-grobs.scm
scm/define-music-display-methods.scm
scm/ly-syntax-constructors.scm
scm/music-functions.scm

index 2111c8d3a207b028381621f8762a230e652eb847..f2266666d0c793686afba12d6aec076e92a71fb4 100644 (file)
@@ -61,6 +61,26 @@ which scares away people.
 
 @end ignore
 
+@item
+Decimal numbers can now be written directly in music,
+without a hash sign.  Together with the previous change
+in the way object properties are specified, the code to
+change the length of stems has changed from this:
+@example
+\override Stem #'length = #5.6
+e' f' g' a'
+@end example
+to this:
+@example
+\override Stem.length = 5.6
+e' f' g' a'
+@end example
+
+One has to write a digit on both sides of the dot -- values like
+@code{4.} or @code{-.3} are not allowed.
+
+Decimal fractions are also not accepted in @code{\chordmode}.
+
 @item
 A number of shorthands like @code{(}, @code{)}, @code{|},
 @code{[}, @code{]}, @code{~}, @code{\(}, @code{\)} and others can
index 34e33733d5358340a74d29e5b54401558aacc2d2..c3b51cc8afe71276667cd322e11f75f7725b2d70 100644 (file)
@@ -100,18 +100,18 @@ eine Datei zu kompilieren.}
 Wenn sie auf das LilyPond-Symbol auf dem Desktop doppelklicken,
 öffnet sich ein einfacher Texteditor mit einer Beispieldatei.
 
-@sourceimage{Learning_Win7_Welcome_File_Whole,,,}
+@sourceimage{LilyPad,,,}
 
 Aus dem Menü über der Beispieldatei wählen Sie @w{@code{File > Save as}}.
 Benutzen Sie nicht @w{@code{File > Save}} für die Beispieldatei,
 weil die Datei nicht funktioniert, bis Sie sie mit einem eigenen
 Namen gespeichert haben.
 
-@sourceimage{Learning_Win7_Save_Menu,,,}
+@sourceimage{FileSave,,,}
 
 Wählen Sie einen Namen für Ihre Datei, etwa @file{test.ly}.
 
-@sourceimage{Learning_Win7_Save_File_With_Name,,,}
+@sourceimage{SaveAs,,,}
 
 
 @subsubheading Schritt 2a: Kompilieren (mit drag-and-drop)
@@ -121,12 +121,12 @@ entweder:
 
 Die Datei auf das LilyPond-Symbol ziehen.
 
-@sourceimage{Learning_Win7_Open_Dragndrop,,,}
+@sourceimage{DragDrop,,,}
 
 Oder Sie klicken mit der rechten Maustaste auf die Datei und wählen
 Sie aus dem Menü @w{@code{Open with > LilyPond}}.
 
-@sourceimage{Learning_Win7_Open_Context_Menu,,,}
+@sourceimage{GenPDF,,,}
 
 
 @subsubheading Schritt 2b: Kompilieren (mit Doppelklick)
@@ -140,31 +140,25 @@ Während der Kompilation von @file{test.ly} öffnet sich ein
 Kommandofenster sehr schnell und schließt sich wieder.  Drei
 zusätzliche Dateien werden in diesem Schritt erstellt.
 
-@sourceimage{Learning_Win7_All_Files_Created,,,}
-
 Das PDF enthält den Notensatz aus der Datei @file{test.ly}.
 
-@sourceimage{Learning_Win7_Pdf_Output,,,}
+@sourceimage{PDFRead,,,}
 
 
 @subsubheading Andere Befehle
 
 Um eine neue Datei zu erstellen, wählen Sie @w{@code{File > New}}
-aus irgendeiner schon erstellten Datei.
-
-@sourceimage{Learning_Win7_New_Menu,,,}
-
-@noindent
-oder @w{@code{File > Open}}, um eine Datei zu öffnen und zu
-bearbeiten, die Sie schon vorher gespeichert hatten.
+aus irgendeiner schon erstellten Datei oder @w{@code{File > Open}},
+um eine Datei zu öffnen und zu bearbeiten, die Sie schon vorher
+gespeichert hatten.
 
-@sourceimage{Learning_Win7_Open_Menu,,,}
+@sourceimage{EditFile,,,}
 
 Sie müssen jede neue Änderung erst speichern, bevor Sie die Datei
 kompilieren.  Wenn kein PDF erstellt wird, öffnen Sie die Log-Datei
 und schauen Sie nach Fehlern.
 
-@sourceimage{Learning_Win7_Log_File,,,}
+@sourceimage{BadLog,,,}
 
 Die Log-Datei wird jedes Mal überschrieben, wenn Sie Ihre
 LilyPond-Datei kompilieren.
@@ -201,7 +195,7 @@ geben Sie folgenden Text ein:
 @example
 \\version "@w{@versionStable{}}"
 @{
-  c' e' g' e'
+@ @ c' e' g' e'
 @}
 @end example
 
index 61e0e8b5e39a37ef1aff55ca01f600a75983e369..beb49ec9bfeb6eb4d98e3e82cbfdd38903686a09 100644 (file)
@@ -100,18 +100,18 @@ durante la compilación de un archivo.}
 Haga doble clic sobre el icono de LilyPond del escritorio
 y se abrirá un archivo de ejemplo.
 
-@sourceimage{Learning_Win7_Welcome_File_Whole,,,}
+@sourceimage{LilyPad,,,}
 
 Del menú de la ventana que contiene el archivo de ejemplo, elija
 @w{@code{Archivo > Guardar como}}. No use @w{@code{Archivo > Guardar}}
 para este archivo de ejemplo porque no funcionará hasta que le aplique
 un nombre de LilyPond válido.
 
-@sourceimage{Learning_Win7_Save_Menu,,,}
+@sourceimage{FileSave,,,}
 
 Escoja un nombre para el archivo, por ejemplo @file{prueba.ly}.
 
-@sourceimage{Learning_Win7_Save_File_With_Name,,,}
+@sourceimage{SaveAs,,,}
 
 
 @subsubheading Paso 2-A. Compílelo (arrastrando y soltando)
@@ -122,12 +122,12 @@ estas dos cosas:
 Arrastre el archivo y suéltelo directamente encima del icono de
 LilyPond.
 
-@sourceimage{Learning_Win7_Open_Dragndrop,,,}
+@sourceimage{DragDrop,,,}
 
 Pulse con el botón derecho sobre el archivo y elija @w{@code{Abrir con
 > LilyPond}} del menú contextual emergente.
 
-@sourceimage{Learning_Win7_Open_Context_Menu,,,}
+@sourceimage{GenPDF,,,}
 
 
 @subsubheading Paso 2-B. Compílelo (con doble clic)
@@ -139,35 +139,27 @@ O simplemente haga doble clic sobre el archivo @file{prueba.ly}.
 
 Durante la compilación del archivo @file{prueba.ly}, se abrirá muy
 brevemente una ventana de la consola y luego se cerrará.  Durante este
-proceso se habrán creado tres archivos adicionales:
+proceso se habrán creado tres archivos adicionales.  El archivo PDF
+contiene el documento @file{prueba.ly} convertido en una partitura musical.
 
-@sourceimage{Learning_Win7_All_Files_Created,,,}
-
-El archivo PDF contiene el documento @file{prueba.ly} convertido en
-una partitura musical.
-
-@sourceimage{Learning_Win7_Pdf_Output,,,}
+@sourceimage{PDFRead,,,}
 
 
 @subsubheading Otras instrucciones
 
 Para crear un archivo nuevo, comience eligiendo @w{@code{Archivo > Nuevo}}
-desde dentro de algún archivo creado previamente.
-
-@sourceimage{Learning_Win7_New_Menu,,,}
-
-@noindent
-o bien, elija @w{@code{Archivo > Abrir}} para abrir y editar cualquier
+desde dentro de algún archivo creado previamente o bien, elija
+@w{@code{Archivo > Abrir}} para abrir y editar cualquier
 archivo que haya guardado antes.
 
-@sourceimage{Learning_Win7_Open_Menu,,,}
+@sourceimage{EditFile,,,}
 
 Debe guardar cualquier edición que haya realizado sobre el archivo
 antes de compilarlo, y si no se ha creado un PDF, deberá comprobar el
 archivo @command{log} de registro que se ha creado durante el intento
 de compilación, en busca de algún error.
 
-@sourceimage{Learning_Win7_Log_File,,,}
+@sourceimage{BadLog,,,}
 
 Este archivo de registro se sobreescribe cada vez que compilamos un
 archivo de LilyPond.
@@ -203,7 +195,7 @@ Haga un archivo de texto con el nombre
 @example
 \\version "@w{@versionStable{}}"
 @{
-  c' e' g' e'
+@ @ c' e' g' e'
 @}
 @end example
 
index 3b5e147664bb8fa341d111448d58700493f62fb5..aafb4fc5d31759989784dc26733b4d29042803ec 100644 (file)
@@ -609,21 +609,49 @@ Markups are implemented as special Scheme functions which produce a
 @subsection Markup construction in Scheme
 
 @cindex defining markup commands
+@funindex \displayScheme
+
+Markup expressions are internally represented in Scheme using the
+@code{markup} macro:
 
-The @code{markup} macro builds markup expressions in Scheme while
-providing a LilyPond-like syntax.  For example,
 @example
-(markup #:column (#:line (#:bold #:italic "hello" #:raise 0.4 "world")
-                  #:larger #:line ("foo" "bar" "baz")))
+(markup @var{expr})
+@end example
+
+To see a markup expression in its Scheme form, use the
+@code{\displayScheme} command:
+
+@example
+\displayScheme
+\markup @{
+  \column @{
+    \line @{ \bold \italic "hello" \raise #0.4 "world" @}
+    \larger \line @{ foo bar baz @}
+  @}
+@}
 @end example
 
 @noindent
-is equivalent to:
+Compiling the code above will send the following to the display
+console:
+
 @example
-#@{ \markup \column @{ \line @{ \bold \italic "hello" \raise #0.4 "world" @}
-                  \larger \line @{ foo bar baz @} @} #@}
+(markup
+  #:line
+  (#:column
+   (#:line
+    (#:bold (#:italic "hello") #:raise 0.4 "world")
+    #:larger
+    (#:line
+     (#:simple "foo" #:simple "bar" #:simple "baz")))))
 @end example
 
+To prevent the markup from printing on the page, use
+@w{@samp{\void \displayScheme @var{markup}}}.  Also, as with the
+@code{\displayMusic} command, the output of @code{\displayScheme}
+can be saved to an external file.  See
+@ref{Displaying music expressions}.
+
 @noindent
 This example demonstrates the main translation rules between regular
 LilyPond markup syntax and Scheme markup syntax.  Using @code{#@{
@@ -640,7 +668,7 @@ Scheme-only solution.
 @item @code{\markup-command} @tab @code{#:markup-command}
 @item @code{\variable} @tab @code{variable}
 @item @code{\center-column @{ @dots{} @}} @tab
-        @code{#:center-column ( @dots{} )} 
+        @code{#:center-column ( @dots{} )}
 @item @code{string} @tab @code{"string"}
 @item @code{#scheme-arg} @tab @code{scheme-arg}
 @end multitable
@@ -850,7 +878,7 @@ padding.
             \override #'(box-padding . 0.6) \box @{ #text @}#@}))
 @end lisp
 
-or, equivalently 
+or, equivalently
 
 @lisp
 #(define-markup-command (double-box layout props text) (markup?)
index 794154170d11b1d4c20723a0391d1d2c86e97c0d..46884122a5945e0ccb2ff21780e0b3b0c8392d6a 100644 (file)
@@ -96,18 +96,18 @@ en cas de compilation infructueuse.}
 Double-cliquez sur l'icone LilyPond qui se trouve sur le bureau.
 S'ouvre alors un fichier d'exemple.
 
-@sourceimage{Learning_Win7_Welcome_File_Whole,,,}
+@sourceimage{LilyPad,,,}
 
 Dans le menu, sélectionnez @w{@code{Fichier > Enregistrer sous}}.  Ne
 prenez pas l'option @w{@code{Fichier > Enregistrer}} pour ce fichier
 exemple@tie{}: LilyPond attend un nom de fichier valide.
 
 
-@sourceimage{Learning_Win7_Save_Menu,,,}
+@sourceimage{FileSave,,,}
 
 Affectez un nom à votre fichier, comme par exemple @file{test.ly}.
 
-@sourceimage{Learning_Win7_Save_File_With_Name,,,}
+@sourceimage{SaveAs,,,}
 
 
 @subsubheading Étape 2a. Compilation par glisser-déposer
@@ -115,12 +115,12 @@ Affectez un nom à votre fichier, comme par exemple @file{test.ly}.
 Selon votre préférence, vous pouvez compiler votre fichier
 en le faisant glisser puis en le déposant sur l'icone LilyPond
 
-@sourceimage{Learning_Win7_Open_Dragndrop,,,}
+@sourceimage{DragDrop,,,}
 
 ou en ouvrant le menu contextuel par un clic-droit, puis en prenant
 l'option @w{@code{Ouvrir avec > LilyPond}}.
 
-@sourceimage{Learning_Win7_Open_Context_Menu,,,}
+@sourceimage{GenPDF,,,}
 
 
 @subsubheading Étape 2b. Compilation par double-clic
@@ -132,33 +132,26 @@ Vous pouvez aussi faire un double-clic sur le fichier @file{test.ly}.
 
 Au cours de la compilation du fichier @file{test.ly}, une fenêtre
 d'interpréteur de commande s'ouvre et se referme.  Trois fichiers
-complémentaires seront générés pendant ce temps là.
+complémentaires seront générés pendant ce temps là.  Le fichier PDF
+contient la gravure de votre fichier @file{test.ly}.
 
-@sourceimage{Learning_Win7_All_Files_Created,,,}
-
-Le fichier PDF contient la gravure de votre fichier @file{test.ly}.
-
-@sourceimage{Learning_Win7_Pdf_Output,,,}
+@sourceimage{PDFRead,,,}
 
 
 @subsubheading Autres commandes
 
 Pour créer un nouveau fichier, sélectionnez @w{@code{Fichier > Nouveau}}
-à parti de n'importe quel fichier déjà existant
-
-@sourceimage{Learning_Win7_New_Menu,,,}
-
-@noindent
-ou bien @w{@code{Fichier > Ouvrir}} pour reprendre un fichier sauvegardé.
+à parti de n'importe quel fichier déjà existant ou bien
+@w{@code{Fichier > Ouvrir}} pour reprendre un fichier sauvegardé.
 
-@sourceimage{Learning_Win7_Open_Menu,,,}
+@sourceimage{EditFile,,,}
 
 Pensez à toujours enregistrer votre travail avant de compiler votre
 fichier.  Si LilyPond ne crée pas de PDF, consultez le fichier de
 journalisation -- généré au fil du processus de compilation -- et
 vérifiez qu'il ne comporte pas d'erreur.
 
-@sourceimage{Learning_Win7_Log_File,,,}
+@sourceimage{BadLog,,,}
 
 Ce fichier journal est remplacé à chaque compilation de votre fichier
 LilyPond.
@@ -191,7 +184,7 @@ Créez un fichier texte du nom de @file{test.ly} et saisissez@tie{}:
 @example
 \\version "@w{@versionStable{}}"
 @{
-  c' e' g' e'
+@ @ c' e' g' e'
 @}
 @end example
 
index de9fd0c87694ebc2a9c18ee12a21fe53dd7245ca..9fd3c62c7f342c1a54f0547a7ddce57c457f48ba 100644 (file)
@@ -86,83 +86,76 @@ those programs if you have any problems compiling a file.}
 
 @subsubheading Step 1. Create your @file{.ly} file
 
-Double-click the LilyPond icon on your desktop, an example file will open.
+Double-click the LilyPond icon on your desktop and an example file will open.
 
-@sourceimage{Learning_Win7_Welcome_File_Whole,,,}
+@sourceimage{LilyPad,,,}
 
 From the menus that appear along the top of the example file,
 select @w{@code{File > Save as}}.  Do not use the @w{@code{File > Save}}
 for the example file as this will not work until you have given it a
 valid LilyPond file name.
 
-@sourceimage{Learning_Win7_Save_Menu,,,}
+@sourceimage{FileSave,,,}
 
 Choose a name for your file, for example @file{test.ly}.
 
-@sourceimage{Learning_Win7_Save_File_With_Name,,,}
+@sourceimage{SaveAs,,,}
 
 
-@subsubheading Step 2a. Compile (with drag-and-drop)
+@subsubheading Step 2. Compile
 
-Depending on what you prefer, to compile your file either:
+To turn your LilyPond file into a music score, you need to compile it. This
+can be done a number of ways -- using drag and drop, with right-click,
+double-clicking or using the command line (a DOS box).  We'll look at the
+first three to start with.
 
-Drag-and-drop the file directly onto the LilyPond icon.
+1. Drag-and-drop the file directly onto the LilyPond icon on the desktop.
 
-@sourceimage{Learning_Win7_Open_Dragndrop,,,}
+@sourceimage{DragDrop,,,}
 
-Right-click on the file and from the pop-up context menu choose
-@w{@code{Open with > LilyPond}}.
+Not much will seem to happen, but after a short while, you should
+see two new files on your desktop -- @file{test.log} and
+@file{test.pdf}.
 
-@sourceimage{Learning_Win7_Open_Context_Menu,,,}
+2. Right-click on the file and from the pop-up context menu and
+choose @w{@code{Generate PDF}}.
 
+@sourceimage{GenPDF,,,}
 
-@subsubheading Step 2b. Compile (with double-clicking)
-
-Or simply double-click the @file{test.ly}.
+3. Or simply double-click the @file{test.ly}.
 
 
 @subsubheading Step 3. View output
 
-During the compilation of the @file{test.ly} file, a command window
-will, very briefly open and then close.  Three additional files will
-have been created during this process.
-
-@sourceimage{Learning_Win7_All_Files_Created,,,}
+@file{test.pdf} contains the engraved @file{test.ly}
+file. Double-click it and it should open in your PDF viewer:
 
-The PDF file contains the engraved @file{test.ly} file.
-
-@sourceimage{Learning_Win7_Pdf_Output,,,}
+@sourceimage{PDFRead,,,}
 
 
 @subsubheading Other commands
 
 To create a new file, begin by selecting @w{@code{File > New}} from
-within any previously created file.
+within any previously created file or @w{@code{File > Open}} to open and
+edit any files you have saved before.  You can also edit a file by
+right-clicking it and selecting @w{@code{Edit source}}.
 
-@sourceimage{Learning_Win7_New_Menu,,,}
+@sourceimage{EditFile,,,}
 
-@noindent
-or @w{@code{File > Open}} to open and edit any files you have saved
-before.
+You must save any edits you make before you try to compile your
+file.  If the PDF file is not created or the output is not what you
+expected, check the log file that will have been created during the
+compilation attempt for any errors.
 
-@sourceimage{Learning_Win7_Open_Menu,,,}
-
-You must save any new edits you make before you compile it and if the
-PDF file is not created, check the log file that will have been created
-during the compilation attempt, for any errors.
-
-@sourceimage{Learning_Win7_Log_File,,,}
+@sourceimage{BadLog,,,}
 
 This log file is overwritten each time you compile your LilyPond file.
 
-The PS file is used internally by LilyPond to create the PDF file and
-can be ignored.  It also gets overwritten each time you compile your
-file.
-
-If you are viewing your file in a PDF viewer, then you must close the
-PDF if you wish to make a new compilation as it may fail to create
-the new PDF while it is still being viewed.
+If you are viewing your file in a PDF viewer, then you must close the PDF
+if you wish to try a new compilation as it may fail to create the new PDF
+while it is still being viewed.
 
+@sourceimage{BadLog2,,,}
 
 @end macro
 
@@ -184,7 +177,7 @@ Create a text file called @file{test.ly} and enter:
 @example
 \\version "@w{@versionStable{}}"
 @{
-  c' e' g' e'
+@ @ c' e' g' e'
 @}
 @end example
 
index 226642f581fe96417cb6720d05e8de5ecb3819c0..f4233a65f2e07a7a6cc95b0624ce0f0b6eb38f3d 100644 (file)
@@ -95,18 +95,18 @@ la documentazione di quei programmi.}
 
 Clicca due volte sull'icona di LilyPond sulla scrivania, si aprirà un file di esempio.
 
-@sourceimage{Learning_Win7_Welcome_File_Whole,,,}
+@sourceimage{LilyPad,,,}
 
 Dai menu che appaiono in cima al file di esempio seleziona
 @w{@code{File > Save as}}.  Non usare @w{@code{File > Save}}
 per il file di esempio perché non funzionerà finché non gli darai
 un nome di file valido per LilyPond.
 
-@sourceimage{Learning_Win7_Save_Menu,,,}
+@sourceimage{FileSave,,,}
 
 Scegli un nome per il tuo file, ad esempio @file{test.ly}.
 
-@sourceimage{Learning_Win7_Save_File_With_Name,,,}
+@sourceimage{SaveAs,,,}
 
 
 @subsubheading Passo 2a. Compila (con drag-and-drop)
@@ -115,12 +115,12 @@ A seconda di quel che preferisci, per compilare il file puoi:
 
 Trascinare e rilasciare (drag-and-drop) il file direttamente sull'icona di LilyPond.
 
-@sourceimage{Learning_Win7_Open_Dragndrop,,,}
+@sourceimage{DragDrop,,,}
 
 Cliccare col tasto destro sul file e dal menu contestuale a comparsa scegliere
 @w{@code{Open with > LilyPond}}.
 
-@sourceimage{Learning_Win7_Open_Context_Menu,,,}
+@sourceimage{GenPDF,,,}
 
 
 @subsubheading Passo 2b. Compilare (con doppio clic)
@@ -132,33 +132,25 @@ O semplicemente clicca due volte su @file{test.ly}.
 
 Durante la compilazione del file @file{test.ly}, una finestra dei comandi
 si aprirà per breve tempo e poi si chiuderà.  Nel corso di questo processo
-verranno creati tre ulteriori file.
+verranno creati tre ulteriori file. Il file PDF contiene il file
+@file{test.ly} compilato.
 
-@sourceimage{Learning_Win7_All_Files_Created,,,}
-
-Il file PDF contiene il file @file{test.ly} compilato.
-
-@sourceimage{Learning_Win7_Pdf_Output,,,}
+@sourceimage{PDFRead,,,}
 
 
 @subsubheading Altri comandi
 
 Per creare un nuovo file, per prima cosa seleziona @w{@code{File > New}} se
-hai aperto un file creato in precedenza.
-
-@sourceimage{Learning_Win7_New_Menu,,,}
-
-@noindent
-oppure @w{@code{File > Open}} per aprire e modificare i file che hai
-salvato prima.
+hai aperto un file creato in precedenza oppure @w{@code{File > Open}}
+per aprire e modificare i file che hai salvato prima.
 
-@sourceimage{Learning_Win7_Open_Menu,,,}
+@sourceimage{EditFile,,,}
 
 Devi salvare qualsiasi nuovo modifica prima di compilare.  Se il file
 PDF non viene creato, controlla se ci sono degli errori nel file di log che
 sarà stato creato durante il tentativo di compilazione.
 
-@sourceimage{Learning_Win7_Log_File,,,}
+@sourceimage{BadLog,,,}
 
 Questo file di log viene sovrascritto ogni volta che compili il file LilyPond.
 
@@ -189,7 +181,7 @@ Crea un file di testo chiamato @file{test.ly} e scrivi:
 @example
 \\version "@w{@versionStable{}}"
 @{
-  c' e' g' e'
+@ @ c' e' g' e'
 @}
 @end example
 
index dde1cd42b23f5b96cd5b5ea7658595e4689ecf42..c7534bfc10ce3e44329cdf6ef5ea6567011ccf12 100644 (file)
@@ -89,7 +89,7 @@ Mac OS に付属されているデフォルトの Preview PDF ビューアを使
 
 デスクトップ上の LilyPond アイコンをクリックして、見本のファイルを開きます。
 
-@sourceimage{Learning_Win7_Welcome_File_Whole,,,}
+@sourceimage{LilyPad,,,}
 
 見本ファイルの上端に表示されるメニューから
 @w{@code{ファイル > 名前を付けて保存}} を選択します。@c
@@ -97,11 +97,11 @@ Mac OS に付属されているデフォルトの Preview PDF ビューアを使
 なぜならファイルに有効な LilyPond ファイル名を付けるまで、@c
 上書き保存は機能しないからです。
 
-@sourceimage{Learning_Win7_Save_Menu,,,}
+@sourceimage{FileSave,,,}
 
 ファイル名を決めます。例えば @file{test.ly} とします。
 
-@sourceimage{Learning_Win7_Save_File_With_Name,,,}
+@sourceimage{SaveAs,,,}
 
 
 @subsubheading ステップ 2a. コンパイルする (ドラッグ&ドロップを使用します)
@@ -110,13 +110,13 @@ Mac OS に付属されているデフォルトの Preview PDF ビューアを使
 
 ファイルを LilyPond アイコンに直接ドラッグ&ドロップします。
 
-@sourceimage{Learning_Win7_Open_Dragndrop,,,}
+@sourceimage{DragDrop,,,}
 
 ファイルを右クリックして、ポップアップ メニューから
 @w{@code{プログラムから開く > LilyPond}} を選択します。
 Right-click on the file and from the pop-up context menu choose
 
-@sourceimage{Learning_Win7_Open_Context_Menu,,,}
+@sourceimage{GenPDF,,,}
 
 
 @subsubheading ステップ 2b. コンパイルする (ダブルクリックする)
@@ -129,11 +129,9 @@ Right-click on the file and from the pop-up context menu choose
 @file{test.ly} をコンパイルしている間、コマンド ウィンドウが一瞬だけ開いて閉じます。@c
 この処理の間に 3 つのファイルが作成されます。
 
-@sourceimage{Learning_Win7_All_Files_Created,,,}
-
 PDF ファイルは @file{test.ly} ファイルの譜刻結果を保持しています。
 
-@sourceimage{Learning_Win7_Pdf_Output,,,}
+@sourceimage{PDFRead,,,}
 
 
 @subsubheading その他のコマンド
@@ -141,19 +139,16 @@ PDF ファイルは @file{test.ly} ファイルの譜刻結果を保持してい
 新しくファイルを作成するには、以前に作成したファイルのウィンドウから
 @w{@code{ファイル > 新規作成}} を選択します。
 
-@sourceimage{Learning_Win7_New_Menu,,,}
-
-@noindent
 あるいは @w{@code{ファイル > 開く}} を選択し、以前に保存したファイルを@c
 開いて編集します。
 
-@sourceimage{Learning_Win7_Open_Menu,,,}
+@sourceimage{EditFile,,,}
 
 コンパイルを行う前にあなたが新たに行った編集を保存する必要があります。@c
 PDF ファイルが作成されない場合は、コンパイルの過程で作成されるログ ファイルで@c
 エラーをチェックしてください。
 
-@sourceimage{Learning_Win7_Log_File,,,}
+@sourceimage{BadLog,,,}
 
 このログ ファイルは、LilyPond ファイルをコンパイルする度に上書きされます。
 
@@ -184,7 +179,7 @@ PDF ファイルを PDF ビュー他で閲覧している場合、
 @example
 \\version "@w{@versionStable{}}"
 @{
-  c' e' g' e'
+@ @ c' e' g' e'
 @}
 @end example
 
index 8a1782d17bbfac5ee051a8245a073d74c78143b2..06b5fd1d832b757ee3819476da70d5ae0050438c 100644 (file)
@@ -112,18 +112,18 @@ van een bestand.}
 Dubbelklik het LilyPond ikoon op je Bureaublad, een
 voorbeeldbestand wordt geopend.
 
-@sourceimage{Learning_Win7_Welcome_File_Whole,,,}
+@sourceimage{LilyPad,,,}
 
 Kies uit de menu's bovenaan het voorbeeldbestand
 @w{@code{Bestand > Opslaan als}}.  De optie @w{@code{Bestand
 > Opslaan}} kun je voor dit voorbeeldbestand niet gebruiken
 als je het nog geen geldige LilyPond-naam hebt gegeven.
 
-@sourceimage{Learning_Win7_Save_Menu,,,}
+@sourceimage{FileSave,,,}
 
 Kies een naam voor je bestand, bijvoorbeeld @file{test.ly}.
 
-@sourceimage{Learning_Win7_Save_File_With_Name,,,}
+@sourceimage{SaveAs,,,}
 
 
 @subsubheading Stap 2a. Compileer (door slepen en neerzetten - drag and drop)
@@ -134,12 +134,12 @@ bestand door ofwel:
 te slepen en neer te zetten bovenop het LilyPond ikoon,
 ofwel
 
-@sourceimage{Learning_Win7_Open_Dragndrop,,,}
+@sourceimage{DragDrop,,,}
 
 met de tweede muisknop op het bestand te klikken en uit het
 popup-contextmenu @w{@code{Open met > LilyPond}} te kiezen.
 
-@sourceimage{Learning_Win7_Open_Context_Menu,,,}
+@sourceimage{GenPDF,,,}
 
 @c FIXME: why present/advise the best/simplest for last?
 @subsubheading Stap 2b. Compileer (door te dubbelklikken)
@@ -154,32 +154,23 @@ een commandovenster geopend dat zich na korte tijd weer
 sluit.  Tijdens dit proces worden drie extra bestanden
 aangemaakt.
 
-@sourceimage{Learning_Win7_All_Files_Created,,,}
-
 Het PDF-bestand bevat het gegraveerde @file{test.ly} bestand.
 
-@sourceimage{Learning_Win7_Pdf_Output,,,}
+@sourceimage{GenPDF,,,}
 
 
 @subsubheading Andere commando's
 
 Om een nieuw bestand te maken, kies @w{@code{Bestand > Nieuw}} vanuit
-een eerder gemaakt bestand.
-
-@sourceimage{Learning_Win7_New_Menu,,,}
-
-@noindent
-of gebruik @w{@code{Bestand > Openen}} om een eerder gemaakt
-bestand te openen en te bewerken.
-
-@sourceimage{Learning_Win7_Open_Menu,,,}
+een eerder gemaakt bestand of gebruik @w{@code{Bestand > Openen}}
+om een eerder gemaakt bestand te openen en te bewerken.
 
 Als je een bestand bewerkt hebt, moet je het eerst opslaan
 voordat je het compileert en als het PDF-bestand niet wordt
 aangemaakt, controleer dan het venster met de voortgangslog
 op foutmeldingen.
 
-@sourceimage{Learning_Win7_Log_File,,,}
+@sourceimage{BadLog,,,}
 
 Dit logbestand wordt elke keer overschreven als je je
 LilyPond-bestand compileert.
@@ -216,7 +207,7 @@ Maak een tekstbestand met de naam @file{test.ly} en vul het met:
 @example
 \\version "@w{@versionStable{}}"
 @{
-  c' e' g' e'
+@ @ c' e' g' e'
 @}
 @end example
 
diff --git a/Documentation/pictures/BadLog.png b/Documentation/pictures/BadLog.png
new file mode 100755 (executable)
index 0000000..ce95e98
Binary files /dev/null and b/Documentation/pictures/BadLog.png differ
diff --git a/Documentation/pictures/BadLog2.png b/Documentation/pictures/BadLog2.png
new file mode 100755 (executable)
index 0000000..2be3b29
Binary files /dev/null and b/Documentation/pictures/BadLog2.png differ
diff --git a/Documentation/pictures/DragDrop.png b/Documentation/pictures/DragDrop.png
new file mode 100755 (executable)
index 0000000..e67b947
Binary files /dev/null and b/Documentation/pictures/DragDrop.png differ
diff --git a/Documentation/pictures/EditFile.png b/Documentation/pictures/EditFile.png
new file mode 100755 (executable)
index 0000000..747ecad
Binary files /dev/null and b/Documentation/pictures/EditFile.png differ
diff --git a/Documentation/pictures/FileSave.png b/Documentation/pictures/FileSave.png
new file mode 100755 (executable)
index 0000000..8d91121
Binary files /dev/null and b/Documentation/pictures/FileSave.png differ
diff --git a/Documentation/pictures/GenPDF.png b/Documentation/pictures/GenPDF.png
new file mode 100755 (executable)
index 0000000..8030910
Binary files /dev/null and b/Documentation/pictures/GenPDF.png differ
diff --git a/Documentation/pictures/Learning_Win7_All_Files_Created.png b/Documentation/pictures/Learning_Win7_All_Files_Created.png
deleted file mode 100644 (file)
index 5d60855..0000000
Binary files a/Documentation/pictures/Learning_Win7_All_Files_Created.png and /dev/null differ
diff --git a/Documentation/pictures/Learning_Win7_Log_File.png b/Documentation/pictures/Learning_Win7_Log_File.png
deleted file mode 100644 (file)
index 4a68339..0000000
Binary files a/Documentation/pictures/Learning_Win7_Log_File.png and /dev/null differ
diff --git a/Documentation/pictures/Learning_Win7_New_Menu.png b/Documentation/pictures/Learning_Win7_New_Menu.png
deleted file mode 100644 (file)
index eebabd4..0000000
Binary files a/Documentation/pictures/Learning_Win7_New_Menu.png and /dev/null differ
diff --git a/Documentation/pictures/Learning_Win7_Open_Context_Menu.png b/Documentation/pictures/Learning_Win7_Open_Context_Menu.png
deleted file mode 100644 (file)
index 8e7d420..0000000
Binary files a/Documentation/pictures/Learning_Win7_Open_Context_Menu.png and /dev/null differ
diff --git a/Documentation/pictures/Learning_Win7_Open_Dragndrop.png b/Documentation/pictures/Learning_Win7_Open_Dragndrop.png
deleted file mode 100644 (file)
index 2df9b17..0000000
Binary files a/Documentation/pictures/Learning_Win7_Open_Dragndrop.png and /dev/null differ
diff --git a/Documentation/pictures/Learning_Win7_Open_Menu.png b/Documentation/pictures/Learning_Win7_Open_Menu.png
deleted file mode 100644 (file)
index 68cdcb4..0000000
Binary files a/Documentation/pictures/Learning_Win7_Open_Menu.png and /dev/null differ
diff --git a/Documentation/pictures/Learning_Win7_Pdf_Output.png b/Documentation/pictures/Learning_Win7_Pdf_Output.png
deleted file mode 100644 (file)
index 57190f3..0000000
Binary files a/Documentation/pictures/Learning_Win7_Pdf_Output.png and /dev/null differ
diff --git a/Documentation/pictures/Learning_Win7_Save_File_With_Name.png b/Documentation/pictures/Learning_Win7_Save_File_With_Name.png
deleted file mode 100644 (file)
index ba605da..0000000
Binary files a/Documentation/pictures/Learning_Win7_Save_File_With_Name.png and /dev/null differ
diff --git a/Documentation/pictures/Learning_Win7_Save_Menu.png b/Documentation/pictures/Learning_Win7_Save_Menu.png
deleted file mode 100644 (file)
index f9b3dd7..0000000
Binary files a/Documentation/pictures/Learning_Win7_Save_Menu.png and /dev/null differ
diff --git a/Documentation/pictures/Learning_Win7_Welcome_File_Whole.png b/Documentation/pictures/Learning_Win7_Welcome_File_Whole.png
deleted file mode 100644 (file)
index ac3cc79..0000000
Binary files a/Documentation/pictures/Learning_Win7_Welcome_File_Whole.png and /dev/null differ
diff --git a/Documentation/pictures/LilyPad.png b/Documentation/pictures/LilyPad.png
new file mode 100755 (executable)
index 0000000..5a9e976
Binary files /dev/null and b/Documentation/pictures/LilyPad.png differ
diff --git a/Documentation/pictures/PDFRead.png b/Documentation/pictures/PDFRead.png
new file mode 100755 (executable)
index 0000000..aaa1175
Binary files /dev/null and b/Documentation/pictures/PDFRead.png differ
diff --git a/Documentation/pictures/SaveAs.png b/Documentation/pictures/SaveAs.png
new file mode 100755 (executable)
index 0000000..ead5d0d
Binary files /dev/null and b/Documentation/pictures/SaveAs.png differ
index 49e188709bfa360ae3173eb3e886d0d93fc5f2ee..7f5f43c296ac948d14f98f3956270be48b9b370c 100644 (file)
@@ -9,9 +9,9 @@
 @c used for news about the upcoming release; see CG 10.2
 
 @newsItem
-@subsubheading LilyPond 2.17.24 released!  @emph{August 11, 2013}
+@subsubheading LilyPond 2.17.25 released!  @emph{August 25, 2013}
 
-We are happy to announce the release of LilyPond 2.17.24.  This
+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
index 922e4045e9cd1aae2b83060b1b2df7a0d9a80ef6..a156d904249e5e67f8bd6c9722658eb7f2cd7a82 100644 (file)
@@ -26,6 +26,17 @@ NOTE:
   * don't duplicate entries from news-front.itexi
 @end ignore
 
+@newsItem
+@subsubheading LilyPond 2.17.24 released!  @emph{August 11, 2013}
+
+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.
+
+@newsEnd
+
 @newsItem
 @subsubheading LilyPond 2.17.23 released!  @emph{July 28, 2013}
 
index cc24a0b39a27cd28741eba60f238339e35a1b2a5..71609b7c38c8f599883d83c242806b8ffc7535a0 100644 (file)
@@ -6,4 +6,14 @@
     contact &lt;a
     href="mailto:janek.lilypond@gmail.com"&gt;Janek Warcho&#322;&lt;/a&gt;.
   </tweet>
+  <tweet>
+    Adam Spiers has build a web site which uses LilyPond to dynamically
+    generate images of chords and scales called &lt;a
+    href="http://scalematcher.adamspiers.org/"&gt;Scale matcher&lt;/a&gt;.
+  </tweet>
+  <tweet>
+    Ben Lemon has created some LilyPond tutorials on YouTube.  Read
+    about them on his &lt;a
+    href="http://benlemon.me/blog/music/lilypond/operation-lilypond/"&gt;blog&lt;/a&gt;.
+  </tweet>
 </tweets>
diff --git a/VERSION b/VERSION
index 889542039b7e9bbebe774b14c3f2d776f95bf468..6d441f9290f39493f1ca1798980643f17b62c0af 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1,7 +1,7 @@
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=2
 MINOR_VERSION=17
-PATCH_LEVEL=25
+PATCH_LEVEL=26
 MY_PATCH_LEVEL=
 VERSION_STABLE=2.16.2
-VERSION_DEVEL=2.17.24
+VERSION_DEVEL=2.17.25
diff --git a/input/regression/add-grace-property.ly b/input/regression/add-grace-property.ly
new file mode 100644 (file)
index 0000000..6594046
--- /dev/null
@@ -0,0 +1,25 @@
+\version "2.17.25"
+
+\header {
+  texidoc = "@code{\\add-grace-property} can be used at various
+context levels in order to override grace properties.  Overrides in
+different parallel contexts are independent."
+}
+
+<<
+ \new Staff = "1" \with { instrumentName =
+                         \markup \center-column { Voice mensural } }
+   \new Voice \with { $(add-grace-property 'Voice 'NoteHead 'style 'mensural)
+                     $(add-grace-property 'Score 'NoteHead 'style 'cross) }
+   { \grace d'8 c'1 \bar "|." }
+
+ \new Staff = "2" \with { instrumentName =
+                         \markup \center-column { Voice diamond } }
+   \new Voice \with { $(add-grace-property 'Voice 'NoteHead 'style 'diamond)   }
+   { \grace d'8 c'1 }
+
+ \new Staff = "3" \with { instrumentName =
+                         \markup \center-column { Score cross } }
+   \new Voice
+   { \grace d'8 c'1 }
+>>
diff --git a/input/regression/arpeggio-span-one-staff-collision.ly b/input/regression/arpeggio-span-one-staff-collision.ly
new file mode 100644 (file)
index 0000000..d5ba546
--- /dev/null
@@ -0,0 +1,23 @@
+\version "2.17.26"
+
+\header {
+  texidoc = "Span arpeggios that are not cross-staff do not have
+horizontal spacing problems.
+"
+}
+
+
+\new Staff
+\with
+{
+  \consists "Span_arpeggio_engraver"
+}
+\relative c''
+{
+  \set Staff.connectArpeggios = ##t
+  <<
+    {r2. <ges aes c ges'>4\arpeggio |}
+    \\
+    {\repeat unfold 12 aes,16 <ees aes c>4\arpeggio |}
+  >>
+}
diff --git a/input/regression/dynamics-avoid-cross-staff-stem-2.ly b/input/regression/dynamics-avoid-cross-staff-stem-2.ly
deleted file mode 100644 (file)
index e549646..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-\version "2.17.2"
-
-\header {
-  texidoc = "Dynamics do not horizontally shift when attached to
-an axis-group extremal cross staff grob that's extremal side
-(UP or DOWN) is the same as its direction.
-"
-}
-
-\new PianoStaff <<
-  \new Staff = "up" {
-    s1 |
-  }
-  \new Staff = "down" {
-    \clef bass
-    \stemDown
-    % keep staff alive
-    <c,, c,>8 [ <c,, c,>8_\f
-    \change Staff = "up"
-    g' g' ]
-    r2 |
-  }
->>
index 12c9c1f7a92683ec2e2df2270a361ff14bac9ff0..834696a5be94c28859b946f548f8fb49d98f48c2 100644 (file)
@@ -1,13 +1,15 @@
-\version "2.16.0"
+\version "2.17.25"
 
 \header {
-  texidoc = "Slurs that depend on a cross-staff beam are not calculated until after line-breaking."
+  texidoc = "Slurs that depend on a cross-staff beam are not calculated until
+after line-breaking, and after inside-going articulations have been placed."
 }
 
 \paper { ragged-right=##t }
 \score {
     \new PianoStaff <<
-    \context Staff = rh \relative c'' { c8([ d) \change Staff = lh c,] }
-    \context Staff = lh { s4. }
+    \context Staff = rh \relative c'' { c8([ d) \change Staff = lh c,] r
+    \stemDown f'8 \change Staff = rh f_( \change Staff = lh f_\marcato f)}
+    \context Staff = lh { s1 }
     >>
 }
index 0cf270f52aa60124a31fdb836fda1704fb71ec53..ce05dfff722f6ed9d7847714415000babf2538cb 100644 (file)
@@ -83,14 +83,14 @@ Accidental_interface::horizontal_skylines (SCM smob)
    * We use the more basic get_stencil.
    */
   Stencil *my_stencil = unsmob_stencil (get_stencil (me));
+  if (!my_stencil)
+    return Skyline_pair ().smobbed_copy ();
+
   Skyline_pair *sky =
     Skyline_pair::unsmob
       (Stencil::skylines_from_stencil
         (my_stencil->smobbed_copy (), 0.0, Y_AXIS));
 
-  if (!sky)
-    return Skyline_pair ().smobbed_copy ();
-
   SCM alist = me->get_property ("glyph-name-alist");
   SCM alt = me->get_property ("alteration");
   string glyph_name = robust_scm2string (ly_assoc_get (alt, alist, SCM_BOOL_F),
index fa53ff261126b788d2a04a336fb0930d889e4053..018d9cd22df116282bbaff4ef63d62355ebeb195 100644 (file)
@@ -56,6 +56,29 @@ Arpeggio::get_common_y (Grob *me)
   return common;
 }
 
+MAKE_SCHEME_CALLBACK (Arpeggio, calc_cross_staff, 1);
+SCM
+Arpeggio::calc_cross_staff (SCM grob)
+{
+  Grob *me = unsmob_grob (grob);
+
+  extract_grob_set (me, "stems", stems);
+  Grob *vag = 0;
+
+  for (vsize i = 0; i < stems.size (); i++)
+    {
+      if (!i)
+        vag = Grob::get_vertical_axis_group (stems[i]);
+      else
+        {
+          if (vag != Grob::get_vertical_axis_group (stems[i]))
+            return SCM_BOOL_T;
+        }
+    }
+
+  return SCM_BOOL_F;
+}
+
 MAKE_SCHEME_CALLBACK (Arpeggio, calc_positions, 1);
 SCM
 Arpeggio::calc_positions (SCM grob)
index 0d786c3a2959aa201470f761c27ee3cd6a98645d..7579ed8c1a3a93cebf9977df14b0d0dc237638a2 100644 (file)
@@ -51,19 +51,6 @@ Axis_group_interface::get_default_outside_staff_padding ()
   return default_outside_staff_padding_;
 }
 
-MAKE_SCHEME_CALLBACK (Axis_group_interface, cross_staff, 1);
-SCM
-Axis_group_interface::cross_staff (SCM smob)
-{
-  Grob *me = unsmob_grob (smob);
-  extract_grob_set (me, "elements", elts);
-  for (vsize i = 0; i < elts.size (); i++)
-    if (to_boolean (elts[i]->get_property ("cross-staff")))
-      return SCM_BOOL_T;
-
-  return SCM_BOOL_F;
-}
-
 void
 Axis_group_interface::add_element (Grob *me, Grob *e)
 {
@@ -112,8 +99,7 @@ Axis_group_interface::relative_maybe_bound_group_extent (vector<Grob *> const &e
   for (vsize i = 0; i < elts.size (); i++)
     {
       Grob *se = elts[i];
-      if (has_interface (se)
-          || !to_boolean (se->get_property ("cross-staff")))
+      if (!to_boolean (se->get_property ("cross-staff")))
         {
           Interval dims = (bound && has_interface (se)
                            ? generic_bound_extent (se, common, a)
@@ -254,8 +240,7 @@ Axis_group_interface::adjacent_pure_heights (SCM smob)
     {
       Grob *g = elts[i];
 
-      if (to_boolean (g->get_property ("cross-staff"))
-          && !has_interface (g))
+      if (to_boolean (g->get_property ("cross-staff")))
         continue;
 
       if (!g->is_live ())
@@ -456,7 +441,9 @@ Axis_group_interface::generic_group_extent (Grob *me, Axis a)
   /* trigger the callback to do skyline-spacing on the children */
   if (a == Y_AXIS)
     for (vsize i = 0; i < elts.size (); i++)
-      (void) elts[i]->get_property ("vertical-skylines");
+      if (!(Stem::has_interface (elts[i])
+            && to_boolean (elts[i]->get_property ("cross-staff"))))
+        (void) elts[i]->get_property ("vertical-skylines");
 
   Grob *common = common_refpoint_of_array (elts, me, a);
 
@@ -487,6 +474,13 @@ SCM
 Axis_group_interface::calc_pure_relevant_grobs (SCM smob)
 {
   Grob *me = unsmob_grob (smob);
+  /* TODO: Filter out elements that belong to a different Axis_group,
+     such as the tie in
+     << \new Staff=A { c'1~ \change Staff=B c'}
+        \new Staff=B { \clef bass R1 R } >>
+    because thier location relative to this Axis_group is not known before
+    page layout.  For now, we need to trap this case in calc_pure_y_common.
+  */
   return internal_calc_pure_relevant_grobs (me, "elements");
 }
 
@@ -529,6 +523,12 @@ Axis_group_interface::calc_pure_y_common (SCM smob)
 
   extract_grob_set (me, "pure-relevant-grobs", elts);
   Grob *common = common_refpoint_of_array (elts, me, Y_AXIS);
+  if (common != me && Align_interface::has_interface (common))
+    {
+      me->programming_error("My pure_y_common is a VerticalAlignment,"
+                            " which might contain several staves.");
+      common = me;
+    }
   if (!common)
     {
       me->programming_error ("No common parent found in calc_pure_y_common.");
@@ -882,7 +882,12 @@ Axis_group_interface::skyline_spacing (Grob *me)
   Grob *x_common = common_refpoint_of_array (elements, me, X_AXIS);
   Grob *y_common = common_refpoint_of_array (elements, me, Y_AXIS);
 
-  assert (y_common == me);
+  if (y_common != me)
+    {
+      me->programming_error("Some of my vertical-skyline-elements"
+                            " are outside my VerticalAxisGroup.");
+      y_common = me;
+    }
 
   // A rider is a grob that is not outside-staff, but has an outside-staff
   // ancestor.  In that case, the rider gets moved along with its ancestor.
@@ -896,7 +901,7 @@ Axis_group_interface::skyline_spacing (Grob *me)
     {
       Grob *elt = elements[i];
       Grob *ancestor = outside_staff_ancestor (elt);
-      if (!ancestor)
+      if (!(to_boolean (elt->get_property ("cross-staff")) || ancestor))
         add_interior_skylines (elt, x_common, y_common, &inside_staff_skylines);
       if (ancestor)
         riders.insert (pair<Grob *, Grob *> (ancestor, elt));
index 0d899f94ba7ea27cfcc0b610ee4bd14d0eecb52f..eb612d35c4aa223c4bb12f8c3e08091c419bd9f7 100644 (file)
@@ -71,6 +71,12 @@ Event dispatching:
   This is done by keeping a priority queue of listener lists,
   and iteratively send the event to the lowest-priority listener.
 - An event is never sent twice to listeners with equal priority.
+  The only case where listeners with equal priority may exist is when
+  two dispatchers are connected for more than one event type.  In that
+  case, the respective listeners all have the same priority, making
+  sure that any event is only dispatched at most once for that
+  combination of dispatchers, even if it matches more than one event
+  type.
 */
 IMPLEMENT_LISTENER (Dispatcher, dispatch);
 void
@@ -96,7 +102,7 @@ Dispatcher::dispatch (SCM sev)
     listener list, and the lowest priority element is repeatedly
     extracted and called.
 
-    The priority queue is implemented as a bubble-sorted C
+    The priority queue is implemented as an insertion-sorted C
     array. Using the stack instead of native Scheme datastructures
     avoids overheads for memory allocation. The queue is usually small
     (around 2 elements), so the quadratic sorting time is not a
@@ -115,7 +121,7 @@ Dispatcher::dispatch (SCM sev)
         num_classes--;
       else
         {
-          // bubblesort.
+          // insertion sort.
           int prio = scm_to_int (scm_caar (list));
           int j;
           for (j = i; j > 0 && lists[j - 1].prio > prio; j--)
@@ -203,6 +209,7 @@ Dispatcher::broadcast (Stream_event *ev)
   dispatch (ev->self_scm ());
 }
 
+// add_listener will always assign a new priority for each call
 void
 Dispatcher::add_listener (Listener l, SCM ev_class)
 {
@@ -213,6 +220,14 @@ inline void
 Dispatcher::internal_add_listener (Listener l, SCM ev_class, int priority)
 {
   SCM list = scm_hashq_ref (listeners_, ev_class, SCM_EOL);
+  // if ev_class is not yet listened to, we go through our list of
+  // source dispatchers and register ourselves there with the priority
+  // we have reserved for this dispatcher.  The priority system
+  // usually distributes events in the order events are registered.
+  // The reuse of a previous priority when registering another event
+  // for a dispatcher/dispatcher connection bypasses the normal
+  // ordering, but it is the mechanism by which duplicate broadcasts
+  // of the same event from one dispatcher to another are avoided.
   if (!scm_is_pair (list))
     {
       /* Tell all dispatchers that we listen to, that we want to hear ev_class
@@ -276,6 +291,10 @@ Dispatcher::remove_listener (Listener l, SCM ev_class)
 void
 Dispatcher::register_as_listener (Dispatcher *disp)
 {
+  // We are creating and remembering the priority _we_ have with the
+  // foreign dispatcher.  All events are dispatched with the same
+  // priority.  The result is that, for example, a single event class
+  // will only trigger an event listener once.
   int priority = ++disp->priority_count_;
 
   // Don't register twice to the same dispatcher.
index a03beaa7a815e1f776744f827829a55675b8d270..1347219812cef80a9cf5bdb7235d6e28909eec67 100644 (file)
@@ -29,6 +29,7 @@ public:
   static Grob *get_common_y (Grob *);
   DECLARE_SCHEME_CALLBACK (print, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_positions, (SCM));
+  DECLARE_SCHEME_CALLBACK (calc_cross_staff, (SCM));
   DECLARE_SCHEME_CALLBACK (brew_chord_bracket, (SCM));
   DECLARE_SCHEME_CALLBACK (brew_chord_slur, (SCM));
   DECLARE_SCHEME_CALLBACK (width, (SCM));
index 1ba26af829459cebb6ce4c632a4792a1bf421953..b33a555c7cd81b65bded19d111b770fc6ea8323c 100644 (file)
@@ -34,7 +34,6 @@ class Axis_group_interface
   static Real get_default_outside_staff_padding ();
   static Interval generic_bound_extent (Grob *me, Grob *common, Axis a);
   static Interval pure_group_height (Grob *me, int start, int end);
-  DECLARE_SCHEME_CALLBACK (cross_staff, (SCM smob));
   DECLARE_SCHEME_CALLBACK (width, (SCM smob));
   DECLARE_SCHEME_CALLBACK (calc_x_common, (SCM smob));
   DECLARE_SCHEME_CALLBACK (calc_y_common, (SCM smob));
index 03556ab01eda873a94f5aad7ce7f7c231f3281f9..5009e693e34af90dd52b49b92b00d5d5af32e546 100644 (file)
@@ -77,14 +77,6 @@ public:
 
 DECLARE_UNSMOB (Lily_parser, lily_parser);
 
-SCM ly_parse_file (SCM);
-SCM ly_parse_string (SCM);
-// SCM ly_parser_add_book_and_score (SCM, SCM);
-SCM ly_parser_print_book (SCM, SCM);
-SCM ly_parser_print_score (SCM, SCM);
-SCM ly_parser_bookify (SCM, SCM);
-SCM ly_parser_scorify (SCM, SCM);
-
 Output_def *get_layout (Lily_parser *parser);
 Output_def *get_midi (Lily_parser *parser);
 Output_def *get_paper (Lily_parser *parser);
index d36f908b2c81d78aae69d3b1b8136500350b961d..de88ba402f6518fa44f068b3c431ce975fc25f69 100644 (file)
@@ -326,14 +326,15 @@ Ledger_line_spanner::print (SCM smob)
 ADD_INTERFACE (Ledger_line_spanner,
                "This spanner draws the ledger lines of a staff.  This is a"
                " separate grob because it has to process all potential"
-               " collisions between all note heads.",
+               " collisions between all note heads.  The thickness of ledger"
+               " lines is controlled by the @code{ledger-line-thickness}"
+               " property of the @ref{StaffSymbol} grob.",
 
                /* properties */
                "gap "
                "length-fraction "
                "minimum-length-fraction "
                "note-heads "
-               "thickness "
               );
 
 struct Ledgered_interface
index 936a95600842c922ffe04584142e08de059e8ffb..6c5e627442ce460650c66f5c20456248f98c4e57 100644 (file)
@@ -114,7 +114,7 @@ Line_spanner::calc_bound_info (SCM smob, Direction dir)
                       ? Axis_group_interface::generic_bound_extent (bound_grob, commonx, X_AXIS)
                       : robust_relative_extent (bound_grob, commonx, X_AXIS)).linear_combination (attach);
 
-      Grob *acc = Note_column::accidentals (bound_grob->get_parent (X_AXIS));
+      Grob *acc = unsmob_grob (bound_grob->get_object ("accidental-grob"));
       if (acc && to_boolean (ly_assoc_get (ly_symbol2scm ("end-on-accidental"), details, SCM_BOOL_F)))
         x_coord = robust_relative_extent (acc, commonx, X_AXIS).linear_combination (attach);
 
index 89123a5e5bee635ada7d01d29fffb13efbbbe4b8..48dc5680b3bc5cae6b1d16fa962a50b68e2e8d96 100644 (file)
@@ -627,7 +627,16 @@ context_def_spec_block:
 
 context_mod_arg:
        embedded_scm
-       | composite_music
+       |
+       {
+               SCM nn = parser->lexer_->lookup_identifier ("pitchnames");
+               parser->lexer_->push_note_state (nn);
+       }
+       composite_music
+       {
+               parser->lexer_->pop_state ();
+               $$ = $2;
+       }
        ;
 
 context_mod_embedded:
@@ -1877,14 +1886,14 @@ complex_music:
        ;
 
 complex_music_prefix:
-       CONTEXT simple_string optional_id optional_context_mod {
+       CONTEXT symbol optional_id optional_context_mod {
                 Context_mod *ctxmod = unsmob_context_mod ($4);
                 SCM mods = SCM_EOL;
                 if (ctxmod)
                         mods = ctxmod->get_mods ();
                $$ = START_MAKE_SYNTAX ("context-specification", $2, $3, mods, SCM_BOOL_F);
        }
-       | NEWCONTEXT simple_string optional_id optional_context_mod {
+       | NEWCONTEXT symbol optional_id optional_context_mod {
                 Context_mod *ctxmod = unsmob_context_mod ($4);
                 SCM mods = SCM_EOL;
                 if (ctxmod)
@@ -2024,13 +2033,11 @@ property_path:
        ;
 
 property_operation:
-       STRING '=' scalar {
-               $$ = scm_list_3 (ly_symbol2scm ("assign"),
-                       scm_string_to_symbol ($1), $3);
+       symbol '=' scalar {
+               $$ = scm_list_3 (ly_symbol2scm ("assign"), $1, $3);
        }
-       | UNSET simple_string {
-               $$ = scm_list_2 (ly_symbol2scm ("unset"),
-                       scm_string_to_symbol ($2));
+       | UNSET symbol {
+               $$ = scm_list_2 (ly_symbol2scm ("unset"), $2);
        }
        | OVERRIDE property_path '=' scalar {
                if (scm_ilength ($2) < 2) {
@@ -2280,17 +2287,6 @@ string:
                $$ = $1;
        }
        | full_markup
-       | string '+' string {
-               if (!scm_is_string ($1)) {
-                       parser->parser_error (@1, (_ ("simple string expected")));
-                       $1 = scm_string (SCM_EOL);
-               }
-               if (!scm_is_string ($3)) {
-                       parser->parser_error (@3, (_ ("simple string expected")));
-                       $3 = scm_string (SCM_EOL);
-               }
-               $$ = scm_string_append (scm_list_2 ($1, $3));
-       }
        ;
 
 simple_string: STRING {
@@ -2307,6 +2303,26 @@ simple_string: STRING {
        }
        ;
 
+symbol:
+       STRING {
+               $$ = scm_string_to_symbol ($1);
+       }
+       | embedded_scm_bare
+       {
+               // This is a bit of overkill but makes the same
+               // routine responsible for all symbol interpretations.
+               $$ = try_string_variants (ly_lily_module_constant ("symbol?"),
+                                         $1);
+               if (SCM_UNBNDP ($$))
+               {
+                       parser->parser_error (@1, (_ ("symbol expected")));
+                       // Generate a unique symbol in case it is used
+                       // for an assignment or similar
+                       $$ = scm_make_symbol (ly_string2scm ("undefined"));
+               }
+       }
+       ;
+
 scalar:
        embedded_scm_arg
        | SCM_IDENTIFIER
index ef49b217d14ff2f2dad2fc79afa604c25a9a675f..c2a02e71d9e213a2db91bb409955a5f7e5277bec 100644 (file)
@@ -38,6 +38,8 @@ public:
 protected:
   DECLARE_ACKNOWLEDGER (note_head);
   DECLARE_ACKNOWLEDGER (dots);
+  DECLARE_ACKNOWLEDGER (stem);
+  DECLARE_ACKNOWLEDGER (flag);
   DECLARE_ACKNOWLEDGER (trill_spanner);
   void stop_translation_timestep ();
 
@@ -64,6 +66,16 @@ Pitched_trill_engraver::acknowledge_dots (Grob_info info)
   heads_.push_back (info.grob ());
 }
 void
+Pitched_trill_engraver::acknowledge_stem (Grob_info info)
+{
+  heads_.push_back (info.grob ());
+}
+void
+Pitched_trill_engraver::acknowledge_flag (Grob_info info)
+{
+  heads_.push_back (info.grob ());
+}
+void
 Pitched_trill_engraver::acknowledge_note_head (Grob_info info)
 {
   heads_.push_back (info.grob ());
@@ -159,6 +171,8 @@ Pitched_trill_engraver::stop_translation_timestep ()
 
 ADD_ACKNOWLEDGER (Pitched_trill_engraver, note_head);
 ADD_ACKNOWLEDGER (Pitched_trill_engraver, dots);
+ADD_ACKNOWLEDGER (Pitched_trill_engraver, stem);
+ADD_ACKNOWLEDGER (Pitched_trill_engraver, flag);
 ADD_ACKNOWLEDGER (Pitched_trill_engraver, trill_spanner);
 
 ADD_TRANSLATOR (Pitched_trill_engraver,
index 79888348f9ce48a7fe7e69445924434941f8a2e8..045563d457b9acd572a203788fb5dea3d4dab336 100644 (file)
@@ -68,19 +68,11 @@ Pointer_group_interface::find_grob (Grob *me, SCM sym, bool (*pred) (Grob *))
   return 0;
 }
 
-// If the grob array is unordered, we assume that duplicates should
-// be removed. This makes sense for things like side-position-elements,
-// which may be added recursively numerous times and thus will eat up
-// computation time when skylines are calculated.
-// If the array is ordered, then we don't remove duplicates.
-
 void
 Pointer_group_interface::add_grob (Grob *me, SCM sym, Grob *p)
 {
   Grob_array *arr = get_grob_array (me, sym);
   arr->add (p);
-  if (!arr->ordered ())
-    arr->remove_duplicates ();
 }
 
 void
@@ -89,7 +81,6 @@ Pointer_group_interface::add_unordered_grob (Grob *me, SCM sym, Grob *p)
   Grob_array *arr = get_grob_array (me, sym);
   arr->add (p);
   arr->set_ordered (false);
-  arr->remove_duplicates ();
 }
 
 static vector<Grob *> empty_array;
index 86d01304a878f28f8ffb1ad27658b3645b84a2b7..d35bb54b2c9d336cf668b60c0e42e0583e5a7f34 100644 (file)
@@ -128,15 +128,16 @@ Quote_iterator::construct_children ()
   SCM name = get_music ()->get_property ("quoted-context-type");
   SCM id = get_music ()->get_property ("quoted-context-id");
 
-  if (scm_is_string (id)
-      && scm_is_symbol (name))
+  if (scm_is_symbol (name))
     {
-      Context *cue_context = get_outlet ()->find_create_context (name,
-                                                                 ly_scm2string (id), SCM_EOL);
+      Context *cue_context =
+        get_outlet ()->find_create_context (name,
+                                            robust_scm2string (id, ""),
+                                            SCM_EOL);
       quote_outlet_.set_context (cue_context);
     }
   else
-    quote_outlet_.set_context (get_outlet ());
+    quote_outlet_.set_context (get_outlet ()->get_default_interpreter ());
 
   event_vector_ = get_music ()->get_property ("quoted-events");
 
index d0486ea4aa1efbe52d52a57f53048749da435dd0..0a014a38008bb3e57aafb92a3671aa90b0c8ac95 100644 (file)
@@ -156,7 +156,7 @@ Script_column::order_grobs (vector<Grob *> grobs)
                 use it as a support for the current grob
               */
               if (!scm_is_number (last_outside_staff))
-                Side_position_interface::recursive_add_support (g, last);
+                Side_position_interface::add_support (g, last);
               /*
                 if outside_staff_priority is missing or is equal to original
                 outside_staff_priority of previous grob, set new
index 8e23c2a03bb27734bfcd0b86afd9f42b43ca0025..e3830d3d2f7d5484f8e3291e58385808aa64f491 100644 (file)
@@ -54,15 +54,6 @@ Side_position_interface::add_support (Grob *me, Grob *e)
   Pointer_group_interface::add_unordered_grob (me, ly_symbol2scm ("side-support-elements"), e);
 }
 
-void
-Side_position_interface::recursive_add_support (Grob *me, Grob *e)
-{
-  Pointer_group_interface::add_unordered_grob (me, ly_symbol2scm ("side-support-elements"), e);
-  extract_grob_set (e, "side-support-elements", sse);
-  for (vsize i = 0; i < sse.size (); i++)
-    recursive_add_support (me, sse[i]);
-}
-
 set<Grob *>
 get_support_set (Grob *me)
 {
@@ -203,6 +194,7 @@ Side_position_interface::aligned_side (Grob *me, Axis a, bool pure, int start, i
 
   Grob *staff_symbol = Staff_symbol_referencer::get_staff_symbol (me);
   bool quantize_position = to_boolean (me->get_maybe_pure_property ("quantize-position", pure, start, end));
+  bool me_cross_staff = to_boolean (me->get_property ("cross-staff"));
 
   bool include_staff
     = staff_symbol
@@ -248,45 +240,37 @@ Side_position_interface::aligned_side (Grob *me, Axis a, bool pure, int start, i
   vector<Box> boxes;
   vector<Skyline_pair> skyps;
   set<Grob *>::iterator it;
-  Real max_raise = -dir * infinity_f;
-  bool aligns_to_cross_staff = false;
 
   for (it = support.begin (); it != support.end (); it++)
     {
       Grob *e = *it;
 
-      // In the case of a stem, we will find a note head as well
-      // ignoring the stem solves cyclic dependencies if the stem is
-      // attached to a cross-staff beam.
       bool cross_staff = to_boolean (e->get_property ("cross-staff"));
-
-      // avoid cyclic dependency for direction
       if (a == Y_AXIS
-          && pure
-          && Stem::has_interface (e)
-          && cross_staff
-          && !is_direction (e->get_property_data ("direction")))
-        continue;
-
-      // avoid unnecessary stem look up (if pointing away, it is not
-      // supporting anything)
+          && !me_cross_staff // 'me' promised not to adapt to staff-spacing
+          && cross_staff) // but 'e' might move based on staff-pacing
+        continue; // so 'me' may not move in response to 'e'
+
       if (a == Y_AXIS
-          && Stem::has_interface (e)
-          && dir == - get_grob_direction (e))
-        continue;
+          && Stem::has_interface (e))
+        {
+          // If called as 'pure' we may not force a stem to set its direction,
+          if (pure && !is_direction (e->get_property_data ("direction")))
+            continue;
+          // There is no need to consider stems pointing away.
+          if (dir == -get_grob_direction (e))
+            continue;
+        }
 
       if (e)
         {
-
-
            SCM sp = e->get_maybe_pure_property (a == X_AXIS
                                                 ? "horizontal-skylines"
                                                 : "vertical-skylines",
-                                                pure || cross_staff,
+                                                pure,
                                                 start,
                                                 end);
 
-           aligns_to_cross_staff |= cross_staff;
            if (Skyline_pair::unsmob (sp))
              {
                Real xc = pure && dynamic_cast<Spanner *> (e)
@@ -304,7 +288,6 @@ Side_position_interface::aligned_side (Grob *me, Axis a, bool pure, int start, i
                  copy[dir].set_minimum_height (copy[dir].max_height ());
                copy.shift (a == X_AXIS ? yc : xc);
                copy.raise (a == X_AXIS ? xc : yc);
-               max_raise = minmax (dir, max_raise, a == X_AXIS ? xc : yc);
                skyps.push_back (copy);
              }
            else { /* no warning*/ }
@@ -347,15 +330,6 @@ Side_position_interface::aligned_side (Grob *me, Axis a, bool pure, int start, i
       dim.set_minimum_height (0.0);
     }
 
-  // Many cross-staff grobs do not have good height estimations.
-  // We give the grob the best chance of not colliding by shifting
-  // it to the maximum height in the case of cross-staff alignment.
-  // This means, in other words, that the old way things were done
-  // (using boxes instead of skylines) is just reactivated for
-  // alignment to cross-staff grobs.
-  if (aligns_to_cross_staff)
-    dim.set_minimum_height (dim.max_height ());
-
   Real ss = Staff_symbol_referencer::staff_space (me);
   Real dist = dim.distance (my_dim, robust_scm2double (me->get_maybe_pure_property ("horizon-padding", pure, start, end), 0.0));
   Real total_off = !isinf (dist) ? dir * dist : 0.0;
index 8654f0d973d26af771c106c44d441908dcb9fb27..a4620158661686c997ae058498152ccab811398f 100644 (file)
@@ -125,6 +125,12 @@ Building::precompute (Real start, Real start_height, Real end_height, Real end)
       assert (start_height == end_height);
       y_intercept_ = start_height;
     }
+  else if (fabs(slope_) > 1e6)
+    // too steep to be stored in slope-intercept form, given round-off error
+    {
+      slope_ = 0.0;
+      y_intercept_ = max(start_height, end_height);
+    }
   else
     y_intercept_ = start_height - slope_ * start;
 }
@@ -169,7 +175,9 @@ Building::shift_to_intersect (Real x, Real y) const
 }
 
 static Real
-first_intersection (Building const &b, list<Building> *const s, Real start_x)
+first_intersection (Building const &b, list<Building> *s, Real start_x)
+/* Return the first x >= start_x where skyline s above Building b.
+ * Removes buildings from s that are concealed by b. */
 {
   while (!s->empty () && start_x < b.end_)
     {
@@ -299,7 +307,7 @@ Skyline::internal_merge_skyline (list<Building> *s1, list<Building> *s2,
           last_end = x;
           continue;
         }
-
+      // first_intersection() removes buildings from s2 if b hides them
       Real end = first_intersection (b, s2, x);
       if (s2->empty ())
         {
@@ -308,6 +316,8 @@ Skyline::internal_merge_skyline (list<Building> *s1, list<Building> *s2,
           break;
         }
 
+      // Should be (end > x), during ver2.19.  end == x happens fairly often,
+      // and we do not need to keep vertical segments within a skyline.
       if (end >= x)
         {
           b.leading_part (end);
@@ -318,6 +328,9 @@ Skyline::internal_merge_skyline (list<Building> *s1, list<Building> *s2,
 
       if (end >= s1->front ().end_)
         s1->pop_front ();
+      // Should add during ver2.19 (to avoid an endless loop
+      // when  merging identical skylines with a vertical segment)
+      // if (end >= s2->front().end_) s2->pop_front();
 
       x = end;
     }
index 049f4f2d65fbc13df23c9ace32b684c99537532c..f68f904d56746503c15e36f20ae5dd325f1d4d78 100644 (file)
@@ -78,10 +78,8 @@ Span_arpeggio_engraver::process_acknowledged ()
   */
   if (!span_arpeggio_ && arpeggios_.size () > 1
       && to_boolean (get_property ("connectArpeggios")))
-    {
-      span_arpeggio_ = make_item ("Arpeggio", SCM_EOL);
-      span_arpeggio_->set_property ("cross-staff", SCM_BOOL_T);
-    }
+    span_arpeggio_ = make_item ("Arpeggio", SCM_EOL);
+
   if (span_arpeggio_)
     {
       for (vsize i = 0; i < note_columns_.size (); i++)
index 654ecdd5ab268e8b79cb3af289074158db8c169a..dbd11f890eb0419e7e269d27edb6401c78da121d 100644 (file)
@@ -996,9 +996,9 @@ Grob::pure_simple_vertical_skylines_from_extents (SCM smob, SCM begscm, SCM ends
   Grob *me = unsmob_grob (smob);
   int beg = robust_scm2int (begscm, 0);
   int end = robust_scm2int (endscm, INT_MAX);
-  // We cannot measure the width of a spanner before line breaking,
-  // so we assume that the width is infinite.
-  return maybe_pure_internal_simple_skylines_from_extents (me, X_AXIS, true, beg, end, dynamic_cast<Spanner *> (me), false);
+  // We cannot measure the widths before line breaking,
+  // so we assume that the width is infinite: pass ignore_x=true
+  return maybe_pure_internal_simple_skylines_from_extents (me, X_AXIS, true, beg, end, true, false);
 }
 
 MAKE_SCHEME_CALLBACK (Grob, simple_vertical_skylines_from_extents, 1);
index 99647c75d03182f2ab159a44d4a86c9264d50149..0d1fe3d08056428cac0fb53b37fb442f6b743072 100644 (file)
@@ -704,26 +704,8 @@ automatically when an output definition (a @code{\\score} or
   figuredBassFormatter = #format-bass-figure
   metronomeMarkFormatter = #format-metronome-markup
 
-
   %% See also make-voice-props-set
-  graceSettings = #`(
-    (Voice Stem direction ,UP)
-    (Voice Stem font-size -3)
-    (Voice Flag font-size -3)
-    (Voice NoteHead font-size -3)
-    (Voice TabNoteHead font-size -4)
-    (Voice Dots font-size -3)
-    (Voice Stem length-fraction 0.8)
-    (Voice Stem no-stem-extend #t)
-    (Voice Beam beam-thickness 0.384)
-    (Voice Beam length-fraction 0.8)
-    (Voice Accidental font-size -4)
-    (Voice AccidentalCautionary font-size -4)
-    (Voice Slur direction ,DOWN)
-    (Voice Script font-size -3)
-    (Voice Fingering font-size -8)
-    (Voice StringNumber font-size -8)
-  )
+  graceSettings = #score-grace-settings
 
   keepAliveInterfaces = #'(
     bass-figure-interface
index 8af797115f6a730b08e4ee153c71ac939f031591..3f88b07252704184fd0cdbb991b06f516902eee1 100644 (file)
@@ -307,7 +307,7 @@ cueDuring =
 in a CueVoice oriented by @var{dir}.")
    (make-music 'QuoteMusic
               'element main-music
-              'quoted-context-type 'Voice
+              'quoted-context-type 'CueVoice
               'quoted-context-id "cue"
               'quoted-music-name what
               'quoted-voice-direction dir))
@@ -319,7 +319,7 @@ cueDuringWithClef =
 in a CueVoice oriented by @var{dir}.")
    (make-music 'QuoteMusic
               'element main-music
-              'quoted-context-type 'Voice
+              'quoted-context-type 'CueVoice
               'quoted-context-id "cue"
               'quoted-music-name what
               'quoted-music-clef clef
@@ -342,6 +342,13 @@ displayMusic =
    (display-scheme-music music)
    music)
 
+displayScheme =
+#(define-scheme-function (parser location expr) (scheme?)
+   (_i "Display the internal representation of @var{expr} to the console.")
+   (newline)
+   (display-scheme-music expr)
+   expr)
+
 
 
 endSpanners =
@@ -1357,7 +1364,7 @@ as a first or second voice.")
 
    (make-music 'QuoteMusic
               'element main-music
-              'quoted-context-type 'Voice
+              'quoted-context-type 'CueVoice
               'quoted-context-id "cue"
               'quoted-music-name what
               'quoted-voice-direction dir
index bf3b2ad865d747ef26375efc3f96e272fa7499a3..3e8df628d564f956f0be839224a947ae082b1c54 100644 (file)
@@ -68,11 +68,11 @@ EXTRACT_TEXI_FILENAMES=$(PYTHON) $(script-dir)/extract_texi_filenames.py $(quiet
                -I $(dir $<) \
                -I $(OUT) \
                -o $(OUT)
-CREATE_VERSION=python $(script-dir)/create-version-itexi.py
-CREATE_WEBLINKS=python $(script-dir)/create-weblinks-itexi.py
-MASS_LINK=python $(script-dir)/mass-link.py
-WEB_POST=python $(script-dir)/website_post.py
-WEB_BIBS=python $(script-dir)/bib2texi.py
+CREATE_VERSION=$(PYTHON) $(script-dir)/create-version-itexi.py
+CREATE_WEBLINKS=$(PYTHON) $(script-dir)/create-weblinks-itexi.py
+MASS_LINK=$(PYTHON) $(script-dir)/mass-link.py
+WEB_POST=$(PYTHON) $(script-dir)/website_post.py
+WEB_BIBS=$(PYTHON) $(script-dir)/bib2texi.py
 
 EXAMPLES=$(LILYPOND_WEB_MEDIA_GIT)/ly-examples
 PICTURES=$(LILYPOND_WEB_MEDIA_GIT)/pictures
index f7c903f874bbaf2a4c65a8eb8797d6fe3f1c7508..9c136745d64220bdb1462509a21565bb74eed36c 100644 (file)
@@ -40,56 +40,39 @@ dir_down := -1;
 %
 
 def draw_mensural_outermost_flare (expr staffline_adjustment, d_) =
-       define_pixels (linethickness, staff_space);
-
-       save ellipse, pat, T;
-       path ellipse, pat;
-       transform T;
-
-       T := identity xscaled 1.00 linethickness
-                     yscaled 0.22 staff_space
-                     rotated -35;
-       pickup pencircle transformed T;
-       ellipse := fullcircle transformed T;    
-
-       z11 = (+0.00 staff_space, -0.00 staff_space);
-       z12 = (+0.15 staff_space, -0.00 staff_space);
+    save flag_end, flag_right;
 
        if staffline_adjustment = between_staff_lines:
-               z13 = (+0.45 staff_space, -0.35 staff_space);
-               z14 = (+0.45 staff_space, -0.85 staff_space);
-               z15 = (+0.00 staff_space, -2.00 staff_space);
+               flag_end := 1.9;
+               flag_right := 0.6;
        elseif staffline_adjustment = on_staff_line:
-               z13 = (+0.20 staff_space, -0.05 staff_space);
-               z14 = (+0.20 staff_space, -1.15 staff_space);
-               z15 = (+0.00 staff_space, -1.40 staff_space);
+               flag_end := 1.4;
+               flag_right := 0.5;
        else: % staffline_adjustment = anywhere
-               z13 = (+0.33 staff_space, -0.20 staff_space);
-               z14 = (+0.33 staff_space, -1.00 staff_space);
-               z15 = (+0.00 staff_space, -1.70 staff_space);
+               flag_end := 1.7;
+               flag_right := 0.6;
        fi;
 
-       pat := z13{z13 - z12}
-              .. {z15 - z14}z14;
-
-       fill get_subpath (ellipse, z11 - z12, z12 - z11, z11)
-            -- get_subpoint (ellipse, z12 - z11, z12)
-            -- get_subpoint (ellipse, z13 - z12, z12)
-            -- get_subpoint (ellipse, direction 0 of pat, z13)
-                 {direction 0 of pat}
-            .. {direction 1 of pat}
-                 get_subpoint (ellipse, direction 1 of pat, z14)
-            -- get_subpath (ellipse, z15 - z14, z14 - z15, z15)
-            -- get_subpoint (ellipse, -direction 1 of pat, z14)
-                 {-direction 1 of pat}
-            .. {-direction 0 of pat}
-                 get_subpoint (ellipse, -direction 0 of pat, z13)
-            -- get_subpath (ellipse, z12 - z13, z11 - z12, z12)
-            -- cycle;
+       penpos1 (0.25 staff_space, 90);
+       penpos2 (0.2 staff_space, 0);
+       penpos3 (0.1 staff_space, -35);
+       z1r = (0, 0);
+       z2r = (flag_right * staff_space, -0.4 staff_space);
+       z3l = (0, -1.0 * flag_end * staff_space);
+       fill z1l
+            .. tension 2.0
+            .. z2l
+            .. tension 3.0
+            .. { dir -125 }z3l{ dir -125 }
+            .. { dir 55 }z3r{dir 55 }
+            .. tension 3.0
+            .. z2r
+            .. tension 2.0
+            .. z1r
+            -- cycle ;
+       draw_square_block ((-0.5 stemthickness_rounded, 0),
+                          (0, -0.25 staff_space));
 
-       if d_ = dir_up:
-               labels (11, 12, 13, 14, 15);
-       fi;
 enddef;
 
 
@@ -184,7 +167,8 @@ def draw_mensural_flag (expr staffline_adjustment, flares, d_) =
 
        if d_ = dir_down:
                currentpicture := currentpicture xscaled -1
-                                                yscaled -1;
+                                                yscaled -1
+                                                shifted (-0.5 stemthickness_rounded, 0);
        fi;
 enddef;
 
index b47f80bb2b0e8f9eae7b7fd075bffadac303fb68..e6cdebaef46d53634720a757a57492e3e1f6d472 100644 (file)
@@ -6,10 +6,10 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: lilypond 2.17.24\n"
+"Project-Id-Version: lilypond 2.17.25\n"
 "Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu."
 "lilypond.bugs\n"
-"POT-Creation-Date: 2013-08-11 16:20+0100\n"
+"POT-Creation-Date: 2013-08-25 15:40+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -1192,78 +1192,78 @@ msgstr ""
 msgid "create PDF files for use with PDFTeX"
 msgstr ""
 
-#: lilypond-book.py:455
+#: lilypond-book.py:460
 msgid "Writing snippets..."
 msgstr ""
 
-#: lilypond-book.py:460
+#: lilypond-book.py:465
 msgid "Processing..."
 msgstr ""
 
-#: lilypond-book.py:465
+#: lilypond-book.py:470
 msgid "All snippets are up to date..."
 msgstr ""
 
-#: lilypond-book.py:467
+#: lilypond-book.py:472
 msgid "Linking files..."
 msgstr ""
 
-#: lilypond-book.py:487
+#: lilypond-book.py:492
 #, python-format
 msgid "cannot determine format for: %s"
 msgstr ""
 
-#: lilypond-book.py:496
+#: lilypond-book.py:501
 #, python-format
 msgid "%s is up to date."
 msgstr ""
 
-#: lilypond-book.py:509
+#: lilypond-book.py:514
 #, python-format
 msgid "Writing `%s'..."
 msgstr ""
 
-#: lilypond-book.py:572
+#: lilypond-book.py:577
 msgid "Output would overwrite input file; use --output."
 msgstr ""
 
-#: lilypond-book.py:576
+#: lilypond-book.py:581
 #, python-format
 msgid "Reading %s..."
 msgstr ""
 
-#: lilypond-book.py:583
+#: lilypond-book.py:588
 msgid "Dissecting..."
 msgstr ""
 
-#: lilypond-book.py:594
+#: lilypond-book.py:599
 #, python-format
 msgid "Compiling %s..."
 msgstr ""
 
-#: lilypond-book.py:602
+#: lilypond-book.py:607
 #, python-format
 msgid "Processing include: %s"
 msgstr ""
 
-#: lilypond-book.py:613
+#: lilypond-book.py:618
 #, python-format
 msgid "Removing `%s'"
 msgstr ""
 
-#: lilypond-book.py:706
+#: lilypond-book.py:711
 #, python-format
 msgid "Setting LilyPond's loglevel to %s"
 msgstr ""
 
-#: lilypond-book.py:710
+#: lilypond-book.py:715
 #, python-format
 msgid ""
 "Setting LilyPond's loglevel to %s (from environment variable "
 "LILYPOND_LOGLEVEL)"
 msgstr ""
 
-#: lilypond-book.py:713
+#: lilypond-book.py:718
 msgid ""
 "Setting LilyPond's output to --verbose, implied by lilypond-book's setting"
 msgstr ""
@@ -3118,177 +3118,182 @@ msgstr ""
 msgid "Too much lookahead"
 msgstr ""
 
-#: parser.yy:466 parser.yy:755 parser.yy:822
+#: parser.yy:458 parser.yy:747 parser.yy:814
 msgid "bad expression type"
 msgstr ""
 
-#: parser.yy:651 parser.yy:1150
+#: parser.yy:643 parser.yy:1142
 msgid "not a context mod"
 msgstr ""
 
-#: parser.yy:857
+#: parser.yy:849
 msgid "score expected"
 msgstr ""
 
-#: parser.yy:873
+#: parser.yy:865
 msgid "\\paper cannot be used in \\score, use \\layout instead"
 msgstr ""
 
-#: parser.yy:897
+#: parser.yy:889
 msgid "need \\paper for paper block"
 msgstr ""
 
-#: parser.yy:1045 parser.yy:1067
+#: parser.yy:1037 parser.yy:1059
 msgid "unexpected post-event"
 msgstr ""
 
-#: parser.yy:1075
+#: parser.yy:1067
 msgid "Ignoring non-music expression"
 msgstr ""
 
-#: parser.yy:1086 parser.yy:2344
+#: parser.yy:1078 parser.yy:2325
 msgid "music expected"
 msgstr ""
 
-#: parser.yy:1354
+#: parser.yy:1346
 msgid "not a symbol"
 msgstr ""
 
-#: parser.yy:2045 parser.yy:2159 parser.yy:2172 parser.yy:2181
+#: parser.yy:2037 parser.yy:2151 parser.yy:2164 parser.yy:2173
 msgid "bad grob property path"
 msgstr ""
 
-#: parser.yy:2139
+#: parser.yy:2131
 msgid "only \\consists and \\remove take non-string argument."
 msgstr ""
 
-#: parser.yy:2200
+#: parser.yy:2192
 msgid "bad context property path"
 msgstr ""
 
-#: parser.yy:2293 parser.yy:2297 parser.yy:2312
+#: parser.yy:2293
 msgid "simple string expected"
 msgstr ""
 
-#: parser.yy:2453
+#: parser.yy:2434
 msgid "not a rhythmic event"
 msgstr ""
 
-#: parser.yy:2557
+#: parser.yy:2508
 msgid "post-event expected"
 msgstr ""
 
-#: parser.yy:2566 parser.yy:2571 parser.yy:3114
+#: parser.yy:2517 parser.yy:2522 parser.yy:3003
 msgid "have to be in Lyric mode for lyrics"
 msgstr ""
 
-#: parser.yy:2686
+#: parser.yy:2590
 msgid "expecting string as script definition"
 msgstr ""
 
-#: parser.yy:2781
+#: parser.yy:2685
 msgid "not an articulation"
 msgstr ""
 
-#: parser.yy:2853 parser.yy:2899
+#: parser.yy:2757 parser.yy:2803
 #, c-format
 msgid "not a duration: %d"
 msgstr ""
 
-#: parser.yy:2916
+#: parser.yy:2820
 msgid "bass number expected"
 msgstr ""
 
-#: parser.yy:3030
+#: parser.yy:2919
 msgid "have to be in Note mode for notes"
 msgstr ""
 
-#: parser.yy:3089
+#: parser.yy:2978
 msgid "have to be in Chord mode for chords"
 msgstr ""
 
-#: parser.yy:3315
+#: parser.yy:3204
 msgid "not a markup"
 msgstr ""
 
-#: lexer.ll:211
+#: lexer.ll:214
 msgid "stray UTF-8 BOM encountered"
 msgstr ""
 
-#: lexer.ll:214
+#: lexer.ll:217
 msgid "Skipping UTF-8 BOM"
 msgstr ""
 
-#: lexer.ll:266
+#: lexer.ll:269
 #, c-format
 msgid "Renaming input to: `%s'"
 msgstr ""
 
-#: lexer.ll:283
+#: lexer.ll:286
 msgid "quoted string expected after \\version"
 msgstr ""
 
-#: lexer.ll:287
+#: lexer.ll:290
 msgid "quoted string expected after \\sourcefilename"
 msgstr ""
 
-#: lexer.ll:291
+#: lexer.ll:294
 msgid "integer expected after \\sourcefileline"
 msgstr ""
 
-#: lexer.ll:318
+#: lexer.ll:321
 msgid "\\maininput not allowed outside init files"
 msgstr ""
 
-#: lexer.ll:342
+#: lexer.ll:345
 #, c-format
 msgid "wrong or undefined identifier: `%s'"
 msgstr ""
 
-#: lexer.ll:368
+#: lexer.ll:371
 msgid "string expected after \\include"
 msgstr ""
 
-#: lexer.ll:378
+#: lexer.ll:381
 msgid "end quote missing"
 msgstr ""
 
-#: lexer.ll:698
+#: lexer.ll:717
 msgid "EOF found inside a comment"
 msgstr ""
 
-#: lexer.ll:703
+#: lexer.ll:722
 msgid "EOF found inside string"
 msgstr ""
 
-#: lexer.ll:718
+#: lexer.ll:737
 msgid "Unfinished main input"
 msgstr ""
 
-#: lexer.ll:818
+#: lexer.ll:804
 #, c-format
 msgid "invalid character: `%s'"
 msgstr ""
 
-#: lexer.ll:945
+#: lexer.ll:931
 #, c-format
 msgid "unknown escaped string: `\\%s'"
 msgstr ""
 
-#: lexer.ll:1241
+#: lexer.ll:951
+#, c-format
+msgid "undefined character or shorthand: %s"
+msgstr ""
+
+#: lexer.ll:1247
 msgid "non-UTF-8 input"
 msgstr ""
 
-#: lexer.ll:1285
+#: lexer.ll:1291
 #, c-format
 msgid "file too old: %s (oldest supported: %s)"
 msgstr ""
 
-#: lexer.ll:1286
+#: lexer.ll:1292
 msgid "consider updating the input with the convert-ly script"
 msgstr ""
 
-#: lexer.ll:1292
+#: lexer.ll:1298
 #, c-format
 msgid "program too old: %s (file requires: %s)"
 msgstr ""
@@ -3640,7 +3645,7 @@ msgstr ""
 msgid "wrong type for argument ~a.  Expecting ~a, found ~s"
 msgstr ""
 
-#: ly-syntax-constructors.scm:207
+#: ly-syntax-constructors.scm:201
 #, scheme-format
 msgid "Invalid property operation ~a"
 msgstr ""
index f42f0e8edbe3dfc7e9742c0563e6b4b58b128275..b779edbb4f13b61a3670654a3ab127ffb018ce76 100644 (file)
@@ -1205,8 +1205,15 @@ chord changes.")
 
      (cause ,scheme? "Any kind of causation objects (i.e., music, or perhaps
 translator) that was the cause for this grob.")
-     (cross-staff ,boolean? "For a beam or a stem, this is true if we
-depend on inter-staff spacing.")
+     (cross-staff ,boolean? "True for grobs whose @code{Y-extent} depends on
+inter-staff spacing.  The extent is measured relative to the grobs's parent
+staff (more generally, its @code{VerticalAxisGroup}) so this boolean flags
+grobs that are not rigidly fixed to their parent staff.
+Beams that join notes from two staves are @code{cross-staff}.
+Grobs that are positioned around such beams are also @code{cross-staff}.
+Grobs that are grouping objects, however, like @code{VerticalAxisGroups}
+will not in general be marked @code{cross-staff} when some of the members
+of the group are @code{cross-staff}.")
 
      (delta-position ,number? "The vertical position difference.")
 
index e2b9e6acd71ae30503899413a3b3c923fd45b478..af5f4fe36b49147d29b590291009b82f10f8e0df 100644 (file)
 
     (Arpeggio
      . (
+       (cross-staff . ,ly:arpeggio::calc-cross-staff)
         (direction . ,LEFT)
         (padding . 0.5)
         (positions . ,ly:arpeggio::calc-positions)
      . (
         (axes . (,X ,Y))
         (bound-alignment-interfaces . (rhythmic-head-interface stem-interface))
-        (cross-staff . ,ly:axis-group-interface::cross-staff)
         (horizontal-skylines . ,ly:separation-item::calc-skylines)
         (skyline-vertical-padding . 0.15)
         (X-extent . ,ly:axis-group-interface::width)
     (SostenutoPedalLineSpanner
      . (
         (axes . (,Y))
-        (cross-staff . ,ly:side-position-interface::calc-cross-staff)
         (direction . ,DOWN)
         (minimum-space . 1.0)
         (outside-staff-priority . 1000)
     (SustainPedalLineSpanner
      . (
         (axes . (,Y))
-        (cross-staff . ,ly:side-position-interface::calc-cross-staff)
         (direction . ,DOWN)
         (minimum-space . 1.0)
         (outside-staff-priority . 1000)
         (side-axis . ,X)
         (stencil . ,parenthesize-elements)
         (stencils . ,parentheses-item::calc-parenthesis-stencils)
-        (X-offset . ,ly:side-position-interface::x-aligned-side)
+        ;; offset a bit to the right, further if needed to clear the main note
+        (X-offset . ,(lambda (grob)
+                       (ly:side-position-interface::x-aligned-side grob 2.5)))
         (Y-extent . ,grob::always-Y-extent-from-stencil)
         (meta . ((class . Item)
                  (interfaces . (axis-group-interface
     (UnaCordaPedalLineSpanner
      . (
         (axes . (,Y))
-        (cross-staff . ,ly:side-position-interface::calc-cross-staff)
         (direction . ,DOWN)
         (minimum-space . 1.0)
         (outside-staff-priority . 1000)
index bafa57200d313e11a084b59ee053daff4bd50932..fd759d52d154cae4c76e326fe09f7ea3303bcc77 100644 (file)
@@ -1054,7 +1054,7 @@ Otherwise, return #f."
                                quoted-voice-direction ?quoted-voice-direction
                                quoted-music-name ?quoted-music-name
                                quoted-context-id "cue"
-                               quoted-context-type 'Voice
+                               quoted-context-type 'CueVoice
                                element ?music))
                         (format #f "\\cueDuring #~s #~a ~a"
                                 ?quoted-music-name
index 01fc9bcef820c41cdc6c6add54c9b7459f5efb7c..8b6f4ffefbf01c2ff05fdedce13467e679872e1e 100644 (file)
@@ -152,8 +152,7 @@ into a @code{MultiMeasureTextEvent}."
               'origin location))
 
 (define-ly-syntax-simple (context-specification type id ops create-new mus)
-  (let* ((type-sym (if (symbol? type) type (string->symbol type)))
-         (csm (context-spec-music mus type-sym id)))
+  (let ((csm (context-spec-music mus type id)))
     (set! (ly:music-property csm 'property-operations) ops)
     (if create-new (set! (ly:music-property csm 'create-new) #t))
     csm))
index ff2bcb7ec72ea5b79e311f1566247af73b4940a5..d714deec8c886123abff1072a46916580d0ffd4c 100644 (file)
@@ -503,6 +503,28 @@ in @var{grob}."
     TupletBracket
     TrillSpanner))
 
+(define general-grace-settings
+  `((Voice Stem font-size -3)
+    (Voice Flag font-size -3)
+    (Voice NoteHead font-size -3)
+    (Voice TabNoteHead font-size -4)
+    (Voice Dots font-size -3)
+    (Voice Stem length-fraction 0.8)
+    (Voice Stem no-stem-extend #t)
+    (Voice Beam beam-thickness 0.384)
+    (Voice Beam length-fraction 0.8)
+    (Voice Accidental font-size -4)
+    (Voice AccidentalCautionary font-size -4)
+    (Voice Script font-size -3)
+    (Voice Fingering font-size -8)
+    (Voice StringNumber font-size -8)))
+
+(define-public score-grace-settings
+  (append
+    `((Voice Stem direction ,UP)
+      (Voice Slur direction ,DOWN))
+    general-grace-settings))
+
 (define-safe-public (make-voice-props-set n)
   (make-sequential-music
    (append
@@ -510,26 +532,9 @@ in @var{grob}."
                                              (if (odd? n) -1 1)))
          direction-polyphonic-grobs)
     (list
-     (make-property-set 'graceSettings
-                        ;; TODO: take this from voicedGraceSettings or similar.
-                        '((Voice Stem font-size -3)
-                          (Voice Flag font-size -3)
-                          (Voice NoteHead font-size -3)
-                          (Voice TabNoteHead font-size -4)
-                          (Voice Dots font-size -3)
-                          (Voice Stem length-fraction 0.8)
-                          (Voice Stem no-stem-extend #t)
-                          (Voice Beam beam-thickness 0.384)
-                          (Voice Beam length-fraction 0.8)
-                          (Voice Accidental font-size -4)
-                          (Voice AccidentalCautionary font-size -4)
-                          (Voice Script font-size -3)
-                          (Voice Fingering font-size -8)
-                          (Voice StringNumber font-size -8)))
-
+     (make-property-set 'graceSettings general-grace-settings)
      (make-grob-property-set 'NoteColumn 'horizontal-shift (quotient n 2))))))
 
-
 (define-safe-public (make-voice-props-override n)
   (make-sequential-music
    (append
@@ -537,23 +542,7 @@ in @var{grob}."
                                                   (if (odd? n) -1 1)))
          direction-polyphonic-grobs)
     (list
-     (make-property-set 'graceSettings
-                        ;; TODO: take this from voicedGraceSettings or similar.
-                        '((Voice Stem font-size -3)
-                          (Voice Flag font-size -3)
-                          (Voice NoteHead font-size -3)
-                          (Voice TabNoteHead font-size -4)
-                          (Voice Dots font-size -3)
-                          (Voice Stem length-fraction 0.8)
-                          (Voice Stem no-stem-extend #t)
-                          (Voice Beam beam-thickness 0.384)
-                          (Voice Beam length-fraction 0.8)
-                          (Voice Accidental font-size -4)
-                          (Voice AccidentalCautionary font-size -4)
-                          (Voice Script font-size -3)
-                          (Voice Fingering font-size -8)
-                          (Voice StringNumber font-size -8)))
-
+     (make-property-set 'graceSettings general-grace-settings)
      (make-grob-property-override 'NoteColumn 'horizontal-shift (quotient n 2))
      (make-grob-property-override 'MultiMeasureRest 'staff-position (if (odd? n) -4 4))))))
 
@@ -926,12 +915,12 @@ actually fully cloned."
 (define-public (add-grace-property context-name grob sym val)
   "Set @var{sym}=@var{val} for @var{grob} in @var{context-name}."
   (define (set-prop context)
-    (let* ((where (ly:context-property-where-defined context 'graceSettings))
+    (let* ((where (or (ly:context-find context context-name) context))
            (current (ly:context-property where 'graceSettings))
            (new-settings (append current
                                  (list (list context-name grob sym val)))))
       (ly:context-set-property! where 'graceSettings new-settings)))
-  (context-spec-music (make-apply-context set-prop) 'Voice))
+  (make-apply-context set-prop))
 
 (define-public (remove-grace-property context-name grob sym)
   "Remove all @var{sym} for @var{grob} in @var{context-name}."
@@ -940,7 +929,7 @@ actually fully cloned."
          (eq? (cadr property) grob)
          (eq? (caddr property) sym)))
   (define (delete-prop context)
-    (let* ((where (ly:context-property-where-defined context 'graceSettings))
+    (let* ((where (or (ly:context-find context context-name) context))
            (current (ly:context-property where 'graceSettings))
            (prop-settings (filter
                            (lambda(x) (sym-grob-context? x sym grob context-name))
@@ -950,8 +939,7 @@ actually fully cloned."
                   (set! new-settings (delete x new-settings)))
                 prop-settings)
       (ly:context-set-property! where 'graceSettings new-settings)))
-  (context-spec-music (make-apply-context delete-prop) 'Voice))
-
+  (make-apply-context delete-prop))
 
 
 (defmacro-public def-grace-function (start stop . docstring)
@@ -1095,6 +1083,8 @@ set to the @code{location} parameter."
              (clef (ly:music-property quote-music 'quoted-music-clef #f))
              (main-voice (case dir ((1) 1) ((-1) 0) (else #f)))
              (cue-voice (and main-voice (- 1 main-voice)))
+             (cue-type (ly:music-property quote-music 'quoted-context-type #f))
+             (cue-id (ly:music-property quote-music 'quoted-context-id))
              (main-music (ly:music-property quote-music 'element))
              (return-value quote-music))
 
@@ -1116,17 +1106,15 @@ set to the @code{location} parameter."
          (delq! #f
                 (list
                  (and clef (make-cue-clef-set clef))
-
-                 ;; Need to establish CueVoice context even in #CENTER case
-                 (context-spec-music
-                  (if cue-voice
-                      (make-voice-props-override cue-voice)
-                      (make-music 'Music))
-                  'CueVoice "cue")
+                 (and cue-type cue-voice
+                      (context-spec-music
+                       (make-voice-props-override cue-voice)
+                       cue-type cue-id))
                  quote-music
-                 (and cue-voice
+                 (and cue-type cue-voice
                       (context-spec-music
-                       (make-voice-props-revert) 'CueVoice "cue"))
+                       (make-voice-props-revert)
+                       cue-type cue-id))
                  (and clef (make-cue-clef-unset))))))
       quote-music))