@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
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)
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)
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.
@example
\\version "@w{@versionStable{}}"
@{
- c' e' g' e'
+@ @ c' e' g' e'
@}
@end example
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)
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)
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.
@example
\\version "@w{@versionStable{}}"
@{
- c' e' g' e'
+@ @ c' e' g' e'
@}
@end example
@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{#@{
@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
\override #'(box-padding . 0.6) \box @{ #text @}#@}))
@end lisp
-or, equivalently
+or, equivalently
@lisp
#(define-markup-command (double-box layout props text) (markup?)
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
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
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.
@example
\\version "@w{@versionStable{}}"
@{
- c' e' g' e'
+@ @ c' e' g' e'
@}
@end example
@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
@example
\\version "@w{@versionStable{}}"
@{
- c' e' g' e'
+@ @ c' e' g' e'
@}
@end example
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)
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)
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.
@example
\\version "@w{@versionStable{}}"
@{
- c' e' g' e'
+@ @ c' e' g' e'
@}
@end example
デスクトップ上の LilyPond アイコンをクリックして、見本のファイルを開きます。
-@sourceimage{Learning_Win7_Welcome_File_Whole,,,}
+@sourceimage{LilyPad,,,}
見本ファイルの上端に表示されるメニューから
@w{@code{ファイル > 名前を付けて保存}} を選択します。@c
なぜならファイルに有効な LilyPond ファイル名を付けるまで、@c
上書き保存は機能しないからです。
-@sourceimage{Learning_Win7_Save_Menu,,,}
+@sourceimage{FileSave,,,}
ファイル名を決めます。例えば @file{test.ly} とします。
-@sourceimage{Learning_Win7_Save_File_With_Name,,,}
+@sourceimage{SaveAs,,,}
@subsubheading ステップ 2a. コンパイルする (ドラッグ&ドロップを使用します)
ファイルを 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. コンパイルする (ダブルクリックする)
@file{test.ly} をコンパイルしている間、コマンド ウィンドウが一瞬だけ開いて閉じます。@c
この処理の間に 3 つのファイルが作成されます。
-@sourceimage{Learning_Win7_All_Files_Created,,,}
-
PDF ファイルは @file{test.ly} ファイルの譜刻結果を保持しています。
-@sourceimage{Learning_Win7_Pdf_Output,,,}
+@sourceimage{PDFRead,,,}
@subsubheading その他のコマンド
新しくファイルを作成するには、以前に作成したファイルのウィンドウから
@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 ファイルをコンパイルする度に上書きされます。
@example
\\version "@w{@versionStable{}}"
@{
- c' e' g' e'
+@ @ c' e' g' e'
@}
@end example
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)
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)
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.
@example
\\version "@w{@versionStable{}}"
@{
- c' e' g' e'
+@ @ c' e' g' e'
@}
@end example
@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
* 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}
contact <a
href="mailto:janek.lilypond@gmail.com">Janek Warchoł</a>.
</tweet>
+ <tweet>
+ Adam Spiers has build a web site which uses LilyPond to dynamically
+ generate images of chords and scales called <a
+ href="http://scalematcher.adamspiers.org/">Scale matcher</a>.
+ </tweet>
+ <tweet>
+ Ben Lemon has created some LilyPond tutorials on YouTube. Read
+ about them on his <a
+ href="http://benlemon.me/blog/music/lilypond/operation-lilypond/">blog</a>.
+ </tweet>
</tweets>
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
--- /dev/null
+\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 }
+>>
--- /dev/null
+\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 |}
+ >>
+}
+++ /dev/null
-\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 |
- }
->>
-\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 }
>>
}
* 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),
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)
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)
{
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)
{
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 ())
/* 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);
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");
}
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.");
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.
{
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));
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
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
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--)
dispatch (ev->self_scm ());
}
+// add_listener will always assign a new priority for each call
void
Dispatcher::add_listener (Listener l, SCM ev_class)
{
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
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.
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));
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));
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);
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
? 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);
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:
;
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)
;
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) {
$$ = $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 {
}
;
+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
protected:
DECLARE_ACKNOWLEDGER (note_head);
DECLARE_ACKNOWLEDGER (dots);
+ DECLARE_ACKNOWLEDGER (stem);
+ DECLARE_ACKNOWLEDGER (flag);
DECLARE_ACKNOWLEDGER (trill_spanner);
void stop_translation_timestep ();
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 ());
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,
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
Grob_array *arr = get_grob_array (me, sym);
arr->add (p);
arr->set_ordered (false);
- arr->remove_duplicates ();
}
static vector<Grob *> empty_array;
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");
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
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)
{
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
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)
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*/ }
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;
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;
}
}
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_)
{
last_end = x;
continue;
}
-
+ // first_intersection() removes buildings from s2 if b hides them
Real end = first_intersection (b, s2, x);
if (s2->empty ())
{
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);
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;
}
*/
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++)
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);
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
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))
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
(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 =
(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
-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
%
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;
if d_ = dir_down:
currentpicture := currentpicture xscaled -1
- yscaled -1;
+ yscaled -1
+ shifted (-0.5 stemthickness_rounded, 0);
fi;
enddef;
#, 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"
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 ""
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 ""
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 ""
(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.")
(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)
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
'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))
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
(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
(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))))))
(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}."
(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))
(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)
(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))
(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))