X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Documentation%2Fde%2Fuser%2Ftweaks.itely;h=6c8af962f543e319602464f5a7136674c53e25d9;hb=1423508c355989fa26a8cfe5985b0d6e1ab0a538;hp=01604d3c583f1f17cae3c337df5cd7d0aa2b675e;hpb=f90c918f6b34808d39ef77d498259c0f7289ecf2;p=lilypond.git diff --git a/Documentation/de/user/tweaks.itely b/Documentation/de/user/tweaks.itely index 01604d3c58..6c8af962f5 100644 --- a/Documentation/de/user/tweaks.itely +++ b/Documentation/de/user/tweaks.itely @@ -1,13 +1,13 @@ -@c -*- coding: utf-8; mode: texinfo; -*- -@c This file is part of lilypond.tely +@c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- +@c This file is part of lilypond-learning.tely @ignore - Translation of GIT committish: 3121682025660b6c85fbf3f22bb9cd8396699ad1 + Translation of GIT committish: d96023d8792c8af202c7cb8508010c0d3648899d When revising a translation, copy the HEAD committish of the version that you are working on. See TRANSLATION for details. @end ignore -@c \version "2.11.51" +@c \version "2.12.0" @node Tweaking output @chapter Tweaking output @@ -18,636 +18,4055 @@ Notenfragment kann geändert werden. @menu -* Tweaking basics:: -* The Internals Reference manual:: -* Appearance of objects:: -* Placement of objects:: -* Collisions of objects:: -* Common tweaks:: -* Further tweaking:: +* Tweaking basics:: +* The Internals Reference manual:: +* Appearance of objects:: +* Placement of objects:: +* Collisions of objects:: +* Further tweaking:: @end menu @node Tweaking basics @section Tweaking basics -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml - @menu -* Introduction to tweaks:: -* Objects and interfaces:: -* Naming conventions of objects and properties:: -* Tweaking methods:: +* Introduction to tweaks:: +* Objects and interfaces:: +* Naming conventions of objects and properties:: +* Tweaking methods:: @end menu @node Introduction to tweaks @subsection Introduction to tweaks -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml +@qq{Optimierung} (engl. tweaking) ist ein LilyPond-Begriff für die +verschiedenen Methoden, die Aktionen zu beeinflussen, die während +der Kompilation einer Notationsdatei vorgenommen werden sowie auf +das Notenbild einzuwirken. Einige dieser Opitmierungen sind sehr +einfach, andere dagegen recht komplex. Aber insgesamt erlaubt das +System an Optimierungen so gut wie alle möglichen Erscheindungsformen +für die Notenausgabe. + +In diesem Abschnitt werden die grundlegenden Konzepte vorgestellt, +um die Optimierung zu verstehen. Später soll eine Anzahl von fertigen +Befehlen bereitgestellt werden, die einfach in die Quelldatei +kopiert werden können um den selben Effekt wie im Beispiel +zu erhalten. Gleichzeitig zeigen diese Beispiele, wie die Befehle +konstruiert werden, so dass Sie in der Lage sein werden, eigene +Befehle auf dieser Grundlage zu entwickeln. + +Bevor Sie mit diesem Kapitel beginnen, könnte Sie ein Blick in den +Abschnitt @ref{Contexts and engravers} interessieren, dann +Kontexte und Engraver sowie die Eigenschaften, die mit ihnen +verknüpft sind, sind die Voraussetzung, um die Funktionsweise +von Optimierungen verstehen zu können. + @node Objects and interfaces @subsection Objects and interfaces -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml +@cindex Objekte +@cindex Grobs +@cindex Spanners +@cindex Interfaces +@cindex Strecker +@cindex Schnittstellen +@cindex graphische Objekte (Grob) +@cindex Objekteigenschaften +@cindex Layout-Objekt +@cindex Objekt, Layout- +@cindex Eigenschaften von Objekten + +Optimierung bedeutet, die internen Operationen und Strukturen +des LilyPond-Programmes zu verändern, darum sollen hier +zunächst die wichtigesten Begriffe erklärt werden, die zur +Beschreibung dieser Operationen und Strukturen benutzt werden. + +Der Begriff @qq{Objekt} ist ein allgemeiner Begriff, mit dem +die Vielzahl an internen Strukturen bezeichnet wird, die LilyPond +während der Bearbeitung des Quelltextes erstellt. Wenn etwa +ein Befehl wie @code{\new Staff} auftritt, wird ein neues Objekt +vom Typ @code{Staff} erstellt. Dieses Objekt @code{Staff} enthält +dann alle Eigenschaften, die mit diesem speziellen Notensystem +verknüpft sind, wie beispielsweise seine Bezeichnung, Tonart und +spezifische Angaben über die Engraver, die innerhalb dieses Systems +eingesetzt werden. Für alle anderen Kontexte gibt es genauso +Objekte, die deren Eigenschaften beinhalten, beispielsweise für +@code{Voice}-Objekte, @code{Score}-Objekte, @code{Lyrics}-Objekte, +aber auch für Objekte, die Notationselemente wie die Taktlinien, +Notenköpfe, Bögen und Dynamikbezeichnung enthalten. Jedes +Objekt hat eine eigene Gruppe an Eigenschaftswerten. + +Bestimmte Objekttypen tragen besondere Bezeichnungen. Objekte, die +Notationselemente der gesetzten Ausgabe repräsentieren, also +Notenköpfe, Hälse, Bögen, Fingersatz, Schlüssel usw., werden +@qq{Layout-Objekte}, oft auch @qq{Graphische Objekte} genannt. +Daraus resultiert die künstliche Abkürzung @qq{Grob}. +Diese sind auch Objekte im allgemeinen Sinn und haben genauso +Eigenschaften, die mit ihnen verknüpft sind, wie etwa Größe, Position, +Farbe usw. + +Einige Layout-Objekte sind etwas spezieller. Phrasierungsbögen, +Crescendo-Klammern, Oktavierungszeichen und viele andere +Grobs sind nicht an einer Stelle plaziert -- sie haben vielmehr +einen Anfangspunkt, einen Endpunkt und eventuell noch andere +Eigenschaften, die ihre Form bestimmen. Objekte mit solch +einer erweiterten Gestalt werden als @qq{Strecker} (engl. Spanners) +bezeichnet. + +Es bleibt uns noch übrig zu erklären, was @qq{Schnittstellen} +(engl. interface) sind. Wenn auch viele Objekte sehr unterschiedlich +sind, haben sie doch oft gemeinsame Eigenschaften, die auf +die gleiche Weise verarbeitet werden. Alle Grobs beispielsweise +haben eine Farbe, eine Größe, eine Position usw. und alle +diese Eigenschaften werden von LilyPond auf die gleiche Weise +verarbeitet, während der Quelltext in Notensatz umgesetzt wird. +Um die internen Operationen zu vereinfachen, sind alle diese +gemeinsamen Prozesse und Eigenschaften in einem Objekt +mit der Bezeichnung @code{grob-interface} (Schnittstelle eines +graphischen Objektes) zusammengefasst. Es gibt viele andere +Gruppen gemeinsamer Eigenschaften, die jede eine Bezeichnung +besitzen, welche auf @code{-interface} endet. Insgesamt +gibt es über 100 dieser Schnittstellen. Wir werden später sehen, +was es damit auf sich hat. + +Dies waren die Hauptbegriffe, die in diesem Kapitel zur Anwendung +kommen sollen. + @node Naming conventions of objects and properties @subsection Naming conventions of objects and properties -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml +@cindex Benennungskonventionen für Objekte +@cindex Benennungskonventionen für Eigenschaften +@cindex Objekte, Benennungskonventionen +@cindex Eigenschaften, Benennungskonventionen +@cindex Regeln zur Benennung von Objekten/Eigenschaften + +Es wurden schon früher einige Regeln zur Benennung von +Objekten vorgestellt, siehe +@ref{Contexts and engravers}. Hier eine Referenzliste der +häufigsten Objekt- und Eigenschaftsbezeichnungen mit +den Regeln für ihre Bezeichnung und +illustrierenden echten Bezeichnungen. Es wurde @qq{A} +für einen beliebigen Großbuchstaben und @qq{aaa} für eine +beliebige Anzahl an Kleinbuchstaben eingesetzt. Andere +Zeichen werden explizit angegeben. + +@multitable @columnfractions .33 .33 .33 +@headitem Objekt-/Eigenschaftstyp + @tab Naming convention + @tab Beispiele +@item Kontexte + @tab Aaaa oder AaaaAaaaAaaa + @tab Staff, GrandStaff +@item Layout-Objekte + @tab Aaaa oder AaaaAaaaAaaa + @tab Slur, NoteHead +@item Engraver + @tab Aaaa_aaa_engraver + @tab Clef_engraver, Note_heads_engraver +@item Schnittstellen + @tab aaa-aaa-interface + @tab grob-interface, break-aligned-interface +@item Kontext-Eigenschaften + @tab aaa oder aaaAaaaAaaa + @tab alignAboveContext, skipBars +@item Layout-Objekt-Eigenschaften + @tab aaa oder aaa-aaa-aaa + @tab direction, beam-thickness +@end multitable + +Es wird bald ersichtlich werden, dass die Eigenschaften von +unterschiedlichen Objekttypen mit unterschiedlichen Befehlen +geändert werden. Deshalb ist es nützlich, aus der +Schreibweise zu erkennen, um was +für ein Objekt es sich handelt, um den entsprechenden +Befehl einsetzen zu können. + @node Tweaking methods @subsection Tweaking methods -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml - -@node The Internals Reference manual -@section The Internals Reference manual +@cindex override-Befehl +@funindex \override +@funindex override -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml +@strong{Der \override-Befehl} -@menu -* Properties of layout objects:: -* Properties found in interfaces:: -* Types of properties:: -@end menu +Wir haben uns schon mit den Befehlen @code{\set} +und @code{\with} bekannt gemacht, mit welchen +Eigenschaften von @strong{Kontexten} verändert +und @strong{Engraver} entfernt oder hinzugefügt +werden können. Siehe dazu +@ref{Modifying context properties} und @ref{Adding +and removing engravers}. Jetzt wollen wir uns weitere +wichtige Befehle anschauen. -@node Properties of layout objects -@subsection Properties of layout objects +Der Befehl, um die Eigenschaften von @strong{Layout-Objekten} +zu ändern, ist @code{\override}. Weil dieser Befehl interne +Eigenschaften tief in der Programmstruktur von LilyPond +verändern muss, ist seine Syntax nicht so einfach wie die der +bisherigen Befehle. Man muss genau wissen, welche Eigenschaft +welches Objektes in welchem Kontext geändert werder soll, +und welches der neu zu setzende Wert dann ist. Schauen wir +uns an, wie das vor sich geht. -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml +Die allgemeine Syntax dieses Befehles ist: -@node Properties found in interfaces -@subsection Properties found in interfaces +@example +\override @var{Kontext}.@var{LayoutObjekt} #'@var{layout-eigenschaft} = +#@var{Wert} +@end example -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml +@noindent +Damit wir die Eigenschaft mit der Bezeichnung @var{layout-property} +das Layout-Objektes mit der Bezeichnung@var{LayoutObject}, +welches ein Mitglied des @var{Kontext}-Kontextes ist, auf den +Wert @var{value}. + +Der @var{Kontext} kann (und wird auch normalerweise) ausgelassen +werden, wenn der benötigte Kontext eindeutig impliziert ist und einer +der untersten Kontexte ist, also etwa @code{Voice}, @code{ChordNames} +oder @code{Lyrics}. Auch in diesem Text wird der Kontext oft ausgelassen +werden. Später soll gezeigt werden, in welchen Fällen er ausdrücklich +definiert werden muss. + +Spätere Abschnitte behandeln umfassend Eigenschaften und ihre +Werte, aber um ihre Funktion und ihr Format zu demonstrieren, +werden wir hier nur einige einfache Eigenschaften und Werte einsetzen, +die einfach zu verstehen sind. + +Für den Moment könne Sie die @code{#'}-Zeichen ignorieren, die vor jeder +Layout-Eigenschaft, und die @code{#}-Zeichen, die vor jedem Wert +stehen. Sie müssen immer in genau dieser Form geschrieben werden. +Das ist der am häufigsten gebrauchte Befehl für die Optimierung, +und der größte Teil dieses Abschnittes wird dazu benutzt, seine Benutzung +zu erläutern. Hier ein einfaches Beispiel, um die Farbe des Notenkopfes +zu ändern: + +@cindex color-Eigenschaft, Beispiel +@cindex Farb-Eigenschaft, Beispiel +@cindex NoteHead, Beispiel für override +@cindex Notenkopf, Beispiel für Veränderung + +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +c d +\override NoteHead #'color = #red +e f g +\override NoteHead #'color = #green +a b c +@end lilypond -@node Types of properties -@subsection Types of properties -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml +@strong{Der \revert-Befehl} -@node Appearance of objects -@section Appearance of objects +@cindex revert-Befehl +@funindex \revert +@funindex revert -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml +Wenn eine Eigenschaft einmal überschrieben wurde, wird ihr +neuer Wert so lange bewahrt, bis er noch einmal überschrieben +wird oder ein @code{\revert}-Befehl vorkommt. Der +@code{\revert}-Befehl hat die folgende Syntax und setzt den +Wert der Eigenschaft zurück auf den Standardwert, nicht +jedoch auf den vorigen Wert, wenn mehrere +@code{\override}-Befehle benutzt wurden. -@menu -* Visibility and color of objects:: -* Size of objects:: -* Length and thickness of objects:: -@end menu +@example +\revert @var{Kontext}.@var{LayoutObjekt} #'@var{layout-eigenschaft} +@end example -@node Visibility and color of objects -@subsection Visibility and color of objects +Wiederum, genauso wie der @var{Kontext} bei dem @code{\override}-Befehl, +wird @var{Kontext} oft nicht benötigt. Er wird in vielen der folgenden +Beispiele ausgelassen. Im nächsten Beispiel wird die Farbe des Notenkopfes +wieder auf den Standardwert für die letzten zwei Noten gesetzt. + +@cindex color-Eigenschaft, Beispiel +@cindex Farb-Eigenschaft, Beispiel +@cindex NoteHead, Beispiel für override +@cindex Notenkopf, Beispiel für Veränderung + +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +c d +\override NoteHead #'color = #red +e f g +\override NoteHead #'color = #green +a +\revert NoteHead #'color +b c +@end lilypond -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml +@strong{\once-Präfix} + +@funindex \once +@funindex once + +Sowohl der @code{\override}-Befehl als auch der @code{\set}-Befehl können mit +dem Präfix @code{\once} (@emph{einmal}) versehen werden. Dadurch wird +der folgende @code{\override}- oder @code{\set}-Befehl nur für den aktuellen +Musik-Moment wirksam, bevor sich wieder der Standard einstellt. Am gleichen +Beispiel demonstriert, kann damit die Farbe eines einzelnen Notenkopfes +geändert werden: + +@cindex color-Eigenschaft, Beispiel +@cindex Farb-Eigenschaft, Beispiel +@cindex NoteHead, Beispiel für override +@cindex Notenkopf, Beispiel für Veränderung + +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +c d +\once \override NoteHead #'color = #red +e f g +\once \override NoteHead #'color = #green +a b c +@end lilypond -@node Size of objects -@subsection Size of objects -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml +@strong{Der \overrideProperty-Befehl} -@node Length and thickness of objects -@subsection Length and thickness of objects +@cindex overrideProperty-Befehl -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml +@funindex \overrideProperty +@funindex overrideProperty -@node Placement of objects -@section Placement of objects +Es gibt eine andere Form des @code{override}-Befehls, +@code{\overrideProperty} (überschreibe Eigenschaft), +welcher ab und zu benötigt wird. Es wird hier nur der +Vollständigkeit halber erwähnt, sein Einsatz wird demonstriert +in @ruser{Difficult tweaks}. +@c Maybe explain in a later iteration -td -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml -@menu -* Automatic behavior:: -* Within-staff objects:: -* Outside staff objects:: -@end menu +@strong{Der \tweak-Befehl} -@node Automatic behavior -@subsection Automatic behavior +@cindex tweak-Befehl +@funindex \tweak +@funindex tweak -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml +Der letzte Optimierungsbefehl in LilyPond ist @code{\tweak} +(engl. optimieren). Er wird eingesetzt um Eigenschaften +von Objekten zu verändern, die zum selben Musik-Moment +auftreten, wie etwa die Noten eines Akkordes. Ein +@code{\override} würde alle Noten des Akkords beeinflussen, +während mit @code{\tweak} nur das nächste Objekt der +Eingabe geändert wird. -@node Within-staff objects -@subsection Within-staff objects +Hier ein Beispiel. Angenommen, die Größe des mittleren +Notenkopfes (ein E) in einem C-Dur-Akkord soll geändert +werden. Schauen wir zuerst, was wir mit +@code{\once \override} erhalten: -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml +@cindex Schriftgröße, Beispiel +@cindex NoteHead, Beispiel für override +@cindex Notenkopf, Beispiel für Veränderung -@node Outside staff objects -@subsection Outside staff objects +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] + 4 + \once \override NoteHead #'font-size = #-3 + + +@end lilypond -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml +Wie man sehen kann, beeinflusst @code{override} @emph{alle} +Notenköpfe des Akkordes. Das liegt daran, dass alle die Noten +eines Akkordes zum selben Musik-Moment auftreten und +die Funktion von @code{\once} ist es, die Optimierung auf +an allen Objekten auszuführen, die zum selben Musik-Moment +auftreten wie der @code{\override}-Befehl. + +Der @code{\tweak}-Befehl funktioniert anders. Er bezieht sich +auf das direkt folgende Element in der Eingabe-Datei. Es wirkt +aber auch nur mit Objekten, die direkt von der Eingabe kreirt +werden, insbesondere Notenköpfe und Artikulationszeichen. +Objekte wie etwa Hälse oder Versetzungszeichen werden erst +später erstellt und lassen sich nicht auf diese Weise ändern. +Zusätzlich @emph{müssen} sich etwa Notenköpfe innerhalb +eines Akkordes befinden, d. h. sie müssen von einfachen spitzen +Klammern umschlossen sein. Um also eine einzelne Note +mit @code{\tweak} zu verändern, muss der Befehl innerhalb +der spitzen Klammern zusammen mit der Note eingegeben werden. + +Um also zu unserem Beispiel zurückzukommen, könnte man die +mittlere Note eines Akkordes auf diese Weise ändern: + +@cindex font-size-Eigenschaft, Beispiel +@cindex Schriftgröße, Beispiel +@cindex @code{\tweak}-Beispiel + +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] + 4 + 4 +@end lilypond +Beachten Sie, dass die Syntax des @code{\tweak}-Befehls sich +von der des @code{\override}-Befehls unterscheidet. Weder +Kontext noch Layout-Objekt konnen angegeben werden, denn +das würde zu einem Fehler führen. Beide Angaben sind +durch das folgende Element impliziert. Hier sollte auch +kein Gleichheitzeichen vorhanden sein. Die verallgemeinerte +Syntax des @code{\tweak}-Befehls ist also einfach -@node Collisions of objects -@section Collisions of objects +@example +\tweak #'@var{layout-eigenschaft} #@var{Wert} +@end example -@menu -* Moving objects:: -* Fixing overlapping notation:: -* Real music example:: -@end menu +Ein @code{\tweak}-Befehl kann auch benutzt werden, um nur +eine von mehreren Artikulationen zu ändern, wie im nächsten +Beispiel zu sehen ist. -@node Moving objects -@subsection Moving objects +@cindex Farb-Eigenschaft, Beispiel +@cindex @code{\tweak}-Beispiel -Es wird vielleicht eine Überraschung sein, aber LilyPond ist nicht -perfekt. Einige Notationselemente können sich überschneiden. Das -ist nicht schön, kann aber (in den meisten Fällen) sehr einfach -korrigiert werden. +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +a ^Black + -\tweak #'color #red ^Red + -\tweak #'color #green _Green +@end lilypond -@c FIXME: find a better example for 5.1 Moving Objects. -gp -@c yes, I want this TODO to be visible to end-users. It's better -@c than having nothing at all. -TODO: Mit den neuen Abstandseigenschaften seit Version 2.12 sind die -jeweiligen Beispiele nicht mehr relevant. Sie zeigen jedoch immer noch -machtvolle Eigenschaften von LilyPond und verbleiben deshalb in der -Dokumentation, bis jemand bessere Beispiel zur Verfügung stellt. +@noindent +Beachten Sie, dass dem @code{\tweak}-Befehl ein Artikulationsmodifikartor +vorangestellt werden muss, ganz als ob er selbst ein Artikulationszeichen +wäre. + +@cindex Triolen, geschachtelt +@cindex N-tolen, geschachtelt +@cindex Klammer, Triole +@cindex Triolenklammer +@cindex N-tolenklammer +@cindex Komplizierte Rhythmen, Schachtelung von +@funindex TupletBracket + +Der @code{\tweak}-Befehl muss auch benutzt werden, wenn das +Aussehen einer vor mehreren geschachtelten Triolenklammern +geändert werden soll, die zum selben Zeitpunkt beginnen. +Im folgenden Beispiel beginnen die lange Klammer und die +erste Triolenklammer zum selben Zeitpunkt, sodass ein +@code{\override}-Befehl sich auf beide beziehen würde. +In dem Beispiel wird @code{\tweak} benutzt, um zwischen +ihnen zu unterscheiden. Der erste @code{\tweak}Befehl +gibt an, dass die lange Klammer über den Noten gesetzt +werden soll, und der zweite, dass die Zahl der rhythmischen +Aufteilung für die erste der kurzen Klammern in rot +gesetzt wird. + +@cindex Farb-Eigenschaft, Beispiel +@cindex @code{\tweak}-Beispiel +@cindex Richtungs-Eigenschaft, Beispiel +@cindex color-Eigenschaft, Beispiel +@cindex direction-Eigenschaft, Beispiel + +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +\tweak #'direction #up +\times 4/3 { + \tweak #'color #red + \times 2/3 { c8[ c8 c8] } + \times 2/3 { c8[ c8 c8] } + \times 2/3 { c8[ c8 c8] } +} +@end lilypond -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] - % temporary code to break this example: - \override TextScript #'outside-staff-priority = ##f -e4^\markup{ \italic ritenuto } g b e +Wenn geschachtelte N-tolen nicht zum gleichen Zeitpunkt +beginnen, kann ihr Aussehen auf die übliche Art mit dem +@code{\override}-Befehl geändert werden: + +@cindex text-Eigenschaft, Beispiel +@cindex tuplet-number-Funktion, Beispiel +@cindex transparent-Eigenschaft, Beispiel +@cindex TupletNumber, Beispiel zur Veränderung +@cindex Triolennummer, Beispiel zur Veränderung +@cindex Triolen-Nummer-Funktion, Beispiel + +@c NOTE Tuplet brackets collide if notes are high on staff +@c See issue 509 +@lilypond[quote,ragged-right,verbatim,fragment,relative=1] +\times 2/3 { c8[ c c]} +\once \override TupletNumber + #'text = #tuplet-number::calc-fraction-text +\times 2/3 { + c[ c] + c[ c] + \once \override TupletNumber #'transparent = ##t + \times 2/3 { c8[ c c] } +\times 2/3 { c8[ c c]} +} @end lilypond -@cindex Abstände füllen -Die einfachste Lösung ist es, Abstände zwischen Objekt und Note zu vergrößern - (genauso auch für Fingersätze oder Dynamikzeichen). In -LilyPond wird das durch Veränderung der @code{padding} (Füllungs)-Eigenschaft -erreicht, ihre Maßeinheit sind Notenzeilenabstände. Für die meisten -Objekte ist der Wert etwa 1.0 oder weniger (das unterscheidet sich -von Objekt zu Objekt). Hier soll der Abstand vergrößert werden, also -scheint 1.5 eine gute Wahl. +@seealso +Notationsreferenz: +@ruser{The tweak command}. -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] - % temporary code to break this example: - \override TextScript #'outside-staff-priority = ##f -\once \override TextScript #'padding = #1.5 -e4^\markup{ \italic ritenuto } g b e + +@node The Internals Reference manual +@section The Internals Reference manual + +@menu +* Properties of layout objects:: +* Properties found in interfaces:: +* Types of properties:: +@end menu + +@node Properties of layout objects +@subsection Properties of layout objects + +@cindex Eigenschaften von Layout-Objekten +@cindex Eigenschaften von Grobs +@cindex Grobs, Eigenschaften von +@cindex Layout-Objekte, Eigenschaften von +@cindex Property (Layout-Objekte, Grobs) +@cindex Regerenz der Interna + +Angenommen, in Ihrer Partitur tritt ein Legatobogen +auf, der Ihrer Meinung nach zu dünn ausgefallen ist. +Sie würden ihn gerne etwas schwerer gezeichnet +sehen. Wie gehen Sie vor? Von den Anmerkungen in +früheren Abschnitten wissen Sie schon, dass LilyPond +sehr flexibel ist und eine derartige Modifikation +möglich sein sollte, und Sie erraten vielleicht, +dass ein @code{\override}-Befehl angebracht ist. +Aber gibt es eine Eigenschaft für die Dicke eines +Legatobogens (engl. slur), und wenn es sie gibt, +auf welche Weise lässt sie sich verändern? Hier +kommt die Referenz der Interna zur Geltung. Dort +finden sich alle Informationen, um den beschriebenen +und alle anderen @code{\override}-Befehle zu +konstruieren. + +Bevor Sie jetzt in die Referenz der Interna wechseln, ist +eine Warnung angebracht. Es handelt sich um ein +@strong{Referenz}dokument, was heißt, dass es sehr +wenig oder gar keine Erklärungen enthält: seine Aufgabe +ist es, Information klar und genau darzustellen. Das +bedeutet, dass es auf den ersten Blick entmutigend +wirkt. Die Einführung und Erklärung in diesem Abschnitt +wird Ihnen aber schnell ermöglichen, genau die Information +aus der Referenz zu entnehmen, die Sie benötigen. +@c For German users +Beachten Sie, dass die Referenz der Interna nur auf Englisch +existiert. Um die Eigenschaftsbezeichnung eines bestimmten +Objektes zu finden, können Sie das Glossar (siehe +@rglosnamed{Top,Musikglossar}) + verwenden, in dem +die englischen Begriffe in viele andere Sprachen übersetzt sind. + +@cindex Override-Beispiel +@cindex Referenz der Interna, Benutzung +@cindex IR (Referenz der Interna), Benutzung +@cindex @code{\addlyrics}-Beispiel + +Das Vorgehen soll an einem konkreten Beispiel einer echten +Komposition demonstriert werden. Hier das Beispiel: + +@lilypond[quote,verbatim,relative=2] +{ + \time 6/8 + { + r4 b8 b[( g]) g | + g[( e]) e d[( f]) a | + a g + } + \addlyrics { + The man who feels love's sweet e -- mo -- tion + } +} @end lilypond -Das sieht besser aus, ist aber noch nicht groß genug. Nach einigen -Experimenten wird darum 2.3 genommen für diesen Fall. Diese Zahl -ist aber nur das Resultat einigen Probierens und persönlicher -Geschmack. Probieren Sie selber ein wenig herum und entscheiden -Sie nach eigenem Geschmack. +Angenommen also, wir wollen die Legatobögen etwas +dicker setzten. Ist das möglich? Die Legatobögen sind mit +Sicherheit ein Layout-Objekt, die Frage muss also lauten: +@qq{Gibt es eine Eigenschaft von Legatobögen, die die +Dicke bestimmt?} Um diese Frage zu beantworten, müssen +wir in der Referenz der Interna ( kurz IR) nachschauen. + +Die IR für die LilyPond-Version, die Sie benutzen, findet sich +auf der LilyPond-Webseite unter der Adresse +@uref{http://lilypond.org}. Gehen Sie zur Dokumentationsseite +und klicken Sie auf den Link zur Referenz der Interna. +@c Addition for German users +Die Sprache ändert sich ab hier nach englisch. Für diese Übung +sollten Sie die HTML-Version benutzen, nicht die +@qq{auf einer großen Seite} oder die PDF-Version. +Damit Sie die nächsten Absätze verstehen können, müssen Sie +genauso vorgehen, während Sie weiterlesen. + +Unter der Überschrift @strong{Top} befinden sich fünf Links. +Wählen Sie den Link zum @emph{Backend}, wo sich die Information +über Layout-Objekte befindet. Hier, unter der Überschrift +@strong{Backend}, wählen Sie den Link @emph{All layout objects}. +Die Seite, die sich öffnet, enthält ein Liste aller Layout-Objekte, +die in Ihrerer LilyPond-Version benutzt werden, in alphabetischer +Ordnung. Wählen Sie den Link @emph{Slur} und die Eigenschaften +der Legatobögen (engl. slur) werden aufgelistet. + +Eine alternative Methode, auf diese Seite zu gelangen, ist von +der Notationsreferenz aus. Auf einer der Seiten zu Legatobögen +findet sich ein Link zur Referenz der Interna. Dieser Link führt +Sie direkt auf diese Seite. Wenn Sie aber eine Ahnung haben, +wie die Bezeichnung des Layout-Objektes lauten könnte, das sie +ändern wollen, ist es oft schneller, direkt zur IR zu gehen und +dort nachzuschlagen. + +Aus der Slur-Seite in der IR könne wir entnehmen, dass +Legatobögen (Slur-Objekte) durch den Slur_engraver erstellt +werden. Dann werden die Standardeinstellungen aufgelistet. +Beachten Sie, dass diese @strong{nicht} in alphabetischer Reihenfolge +geordnet sind. Schauen Sie sich die Liste an, ob sie eine Eigenschaft +enthält, mit der die Dicke von Legatobögen kontrolliert werden kann. +Sie sollten folgendes finden: -Die @code{staff-padding}-Eigenschaft ist der vorigen sehr ähnlich. - @code{padding} entscheidet über den minimalen Abstand zwischen einem -Objekt und dem nächsten anderen Objekt (meistens eine Note oder -Notenzeile); @code{staff-padding} entscheidet über den minimalen -Abstand zwischen einem Objekt und dem Notensystem. Das ist nur ein -kleiner Unterschied, aber hier wird das Verhalten demonstriert: +@example +@code{thickness} (number) + @code{1.2} + Line thickness, generally measured in @code{line-thickness} +@end example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] - % temporary code to break this example: - \override TextScript #'outside-staff-priority = ##f -c4^"piu mosso" b a b -\once \override TextScript #'padding = #4.6 -c4^"piu mosso" d e f -\once \override TextScript #'staff-padding = #4.6 -c4^"piu mosso" fis a g -\break -c'4^"piu mosso" b a b -\once \override TextScript #'padding = #4.6 -c4^"piu mosso" d e f -\once \override TextScript #'staff-padding = #4.6 -c4^"piu mosso" fis a g -@end lilypond - -@cindex Abstand, zusätzlicher -@cindex extra-offset - -Eine andere Lösung ermöglicht vollständige Kontrolle über die Positionierung -eines Objektes sowohl horizontal als auch vertikal. Das wird mit der -@code{extra-offset} (Zusätzlicher-Abstand)-Eigenschaft erreicht. Das -ist etwas komplizierter und kann andere Probleme mit sich ziehen. Wenn -Objekte mit dieser Eigenschaft verschoben werden, heißt das, dass -LilyPond sie erst setzt, nachdem alle anderen Objekte positioniert -worden sind. Deshalb können sich die Objekte am Ende überlagern. +Das sieht ganz danach aus, als ob damit die Dicke geändert +werden kann. Es bedeutet, dass der Wert von +@code{thickness} einfach eine Zahl (@emph{number}) ist, +dass der Standardwert 1.2 ist, und dass die Einheit +für die Dicke eine andere Eigenschaft mit der +Bezeichnung @code{line-thickness} ist. + +Wie schon früher gesagt, gibt es wenig bis gar keine Erklärungen +in der IR, aber wir haben schon genug Informationen, um +zu versuchen, die Dicke eines Legatobogens zu ändern. Die +Bezeichnung des Layout-Objekts ist offensichtlich +@code{Slur} und die Bezeichnung der Eigenschaft, die geändert +werden soll +@code{thickness}. Der neue Wert sollte etwas mehr als 1.2 sein, +denn der Bogen soll ja dicker werden. + +Den benötigten @code{\override}-Befehl können wir jetzt einfach +konstruieren, indem wir die Werte für die Bezeichnungen in den +Modellbefehl einfügen und den Kontext auslassen. Setzen wir +einmal einen sehr großen Wert für die Dicke um zu sehen, ob der +Befehl auch funktioniert. Also: -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] - % temporary code to break this example: - \override TextScript #'outside-staff-priority = ##f -\once \override TextScript #'extra-offset = #'( 1.0 . -1.0 ) -e4^\markup{ \italic ritenuto } g b e +@example +\override Slur #'thickness = #5.0 +@end example + +Vergessen Sie nicht das Rautenzeichen und Apostroph +(@code{#'}) vor der Eigenschaftsbezeichnung und das +Rautenzeichen vor dem neuen Wert! + +Die nächste Frage ist nun: @qq{Wohin soll dieser Befehl geschrieben +werden?} Solange wir uns noch im Lernstadium befinden, ist +die beste Antwort: @qq{Innerhalb der Noten, vor den ersten +Legatobogen und nahe bei ihm.} Also etwa so: + +@cindex Legatobogen, Beispiel für Veränderung +@cindex thickness-Eigenschaft, Beispiel +@cindex Dicke-Eigenschaft, Beispiel + +@lilypond[quote,verbatim,relative=2] +{ + \time 6/8 + { + % Increase thickness of all following slurs from 1.2 to 5.0 + \override Slur #'thickness = #5.0 + r4 b8 b[( g]) g | + g[( e]) e d[( f]) a | + a g + } + \addlyrics { + The man who feels love's sweet e -- mo -- tion + } +} @end lilypond -Bei Verwendung von @code{extra-offset} bestimmt die erste Zahl über die -horizontale Verschiebung (nach links ist negativ), die zweite Zahl -bestimmt die vertikale Verschiebung (nach oben ist positiv). Nach einigen -Experimenten wurden hier folgende Werte für gut befunden: +@noindent +und wirklich wird der Legatobogen dicker. + +Das ist also die grundlegende Herangehensweise, +@code{\override}-Befehl zu formulieren. Es gibt einige +zusätzliche Komplikationen, denen wir uns später widmen +werden, aber Sie haben jetzt das Handwerkszeug, um Ihre +eigenen Befehle zu konstruieren -- wenn Sie auch noch etwas +Übung benötigen. Die sollen Sie durch die folgenden Übungen +erhalten. + + +@subheading Finding the context + +@cindex Kontext, Finden und identifizieren + +Manchmal muss dennoch der Kontext spezifiziert werden. +Welcher aber ist der richtige Kontext? Wir könnten raten, +dass Legatobögen sich im @code{Voice}-Kontext befinden, +denn sie sind immer einzelnen Melodielinien zugewiesen. +Aber wir können uns dessen nicht sicher sein. Um unsere +Annahme zu überprüfen, gehen wir wieder zu der Seite im +IR, die die Legatobögen beschreibt und die Überschrift +@emph{Slur} hat. Dort steht: @qq{Slur objects are created +by: Slur engraver}. Legatobögen werden also in dem Kontext +erstellt, in dem sich der @code{Slur_engraver} befindet. +Folgen Sie dem Link zu der @code{Slur_engraver}-Seite. +Unten auf der Seite steht, dass der @code{Slur_engraver} +sich in fünf Stimmen-Kontexten befindet, unter anderem +auch im normalen @code{Voice}-Kontext. Unsere Annahme +war also richtig. Und weil @code{Voice} einer der Kontexte +der untersten Ebene ist, welcher eindeutig schon dadurch +definiert ist, dass wir Noten eingeben, kann er an dieser Stelle +auch weggelassen werden. + + +@subheading Overriding once only + +@cindex Override nur einmal +@cindex once override +@funindex \once +@funindex once + +Im Beispiel oben wurden @emph{alle} Legatobögen dicker +gesetzt. Vielleicht wollen Sie aber nur den ersten Bogen +dicker haben. Das können Sie mit dem @code{\once}-Befehl +erreichen. Er wird direkt vor den @code{\override}-Befehl +gesetzt und bewirkt, dass nur der Bogen geändert wird, der +@strong{unmittelbar an der nächsten Note beginnt.} Wenn +die nächste Note keinen Bogenbeginn hat, dann passiert +gar nichts -- der Befehl wird nicht gespeichert, sondern einfach +vergessen. Der Befehl, mit @code{\once} zusammen benutzt, +muss also wie folgt positioniert werden: + +@cindex Legatobogen, Beispiel zur Veränderung +@cindex thickness-Eigenschaft, Beispiel + +@lilypond[quote,verbatim,relative=2] +{ + \time 6/8 + { + r4 b8 + % Increase thickness of immediately following slur only + \once \override Slur #'thickness = #5.0 + b[( g]) g | + g[( e]) e d[( f]) a | + a g + } + \addlyrics { + The man who feels love's sweet e -- mo -- tion + } +} +@end lilypond -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] - % temporary code to break this example: - \override TextScript #'outside-staff-priority = ##f -\once \override TextScript #'extra-offset = #'( -1.6 . 1.0 ) -e4^\markup{ \italic ritenuto } g b e +@noindent +Jetzt bezieht er sich nur noch auf den ersten Legatobogen. + +Der @code{\once}-Befehl kann übrigens auch vor einem @code{\set}-Befehl +eingesetzt werden. + + +@subheading Reverting + +@cindex Revert +@cindex Rückgängig machen +@cindex Wiederherstellen von Standardeinstellungen +@cindex Standardeinstellungen, Wiederherstellen +@funindex \revert +@funindex revert + +Eine weitere Möglichkeit: nur die beiden ersten Legatobögen sollen +dicker gesetzt werden. Gut, wir könnten jetzt zwei Befehle benutzen, +jeden mit dem @code{\once}-Präfix und direkt vor die entsprechende +Note gestellt, an welcher der Bogen beginnt: + +@cindex Legatobogen, Beispiel zur Veränderung +@cindex thickness-Eigenschaft, Beispiel + +@lilypond[quote,verbatim,relative=2] +{ + \time 6/8 + { + r4 b8 + % Increase thickness of immediately following slur only + \once \override Slur #'thickness = #5.0 + b[( g]) g | + % Increase thickness of immediately following slur only + \once \override Slur #'thickness = #5.0 + g[( e]) e d[( f]) a | + a g + } + \addlyrics { + The man who feels love's sweet e -- mo -- tion + } +} +@end lilypond + +@noindent +Wir könnten aber auch den @code{\once}-Befehl weglassen und anstelle +dessen später den @code{\revert}-Befehl einsetzen, um die +@code{thickness}-Eigenschaft wieder auf ihren Standardwert zurückzusetzen: + +@cindex Legatobogen, Beispiel zur Veränderung +@cindex thickness-Eigenschaft, Beispiel + +@lilypond[quote,verbatim,relative=2] +{ + \time 6/8 + { + r4 b8 + % Increase thickness of all following slurs from 1.2 to 5.0 + \override Slur #'thickness = #5.0 + b[( g]) g | + g[( e]) + % Revert thickness of all following slurs to default of 1.2 + \revert Slur #'thickness + e d[( f]) a | + a g + } + \addlyrics { + The man who feels love's sweet e -- mo -- tion + } +} @end lilypond @noindent -Auch diese Zahlen sind nur Resultat einigen Herumprobierens und Vergleichens -der Ergebnisse. Sie wollen den Text vielleicht etwas höher oder etwas mehr -nach links setzen. Versuchen Sie es selber und vergleichen Sie das Ergebnis. +Der @code{\revert}-Befehl kann benutzt werden, um eine beliebige +Eigenschaft, die mit @code{\override} geändert worden ist, wieder in +ihre Standardeinstellungen zurückzuversetzen. In unserem Beispiel können +Sie die Methode benutzen, die Ihnen lieber ist, beide haben das gleiche +Resultat. + +Damit endet die Einleitung in die Referenz der Interna (IR) und die +grundlegenden Optimierungsmethoden. Einige Beispiele folgen in späteren +Abschnitten dieses Kapitel, einerseits um Sie mit weiteren Möglichkeiten +der IR bekanntzumachen, andererseits um Ihnen mehr Übungsmöglichkeiten +zu geben, die relevante Information dort zu finden. Die Beispiele werden +Schritt für Schritt immer weniger Erklärungen beinhalten. + + +@node Properties found in interfaces +@subsection Properties found in interfaces -Eine letzte Warnung: in diesem Kapitel haben wir den Befehl +@cindex Interface-Eigenschaften +@cindex Eigenschaften von Interfaces +@cindex Schnittstellen, Eigenschaften von +@cindex Eigenschaften von Schnittstellen + +Der Text unseres Beispiels soll jetzt kursiv gesetzt werden. Was für +ein @code{\override}-Befehl wird dazu benötigt? Schauen wir +uns zunächst das Inhaltsverzeichnis in der IR an: @qq{All layout objects}, +wie auch schon zuvor. Welches Objekt könnte die Darstellung des +Textes (engl. lyrics) beeinflussen? Es gibt den Eintrag @code{LyricText}, +das hört sich schon sehr gut an. Ein Klick hierauf zeigt alle Eigenschaften +an, die verändert werden können. Dazu gehört +@code{font-series} und @code{font-size}, aber nichts, womit man kursiven +Text erreichen könnte. Das liegt daran, dass die Schnitteigenschaft allen +Schrift-Objekten gemeinsam ist. Sie findet sich also nicht in jedem einzlenen +Layout-Objekt aufgelistet, sondern ist mit anderen ähnlichen Eigenschaften +zusammen in einem @strong{Interface} -- einer Schnittstelle -- verortet; +in diesem Fall das +@code{font-interface}. + +Jetzt müssen wir also lernen, wie wir Eigenschaften von Schnittstellen finden +und wie wir herausfinden, welche Objekte diese Schnittstelleneigenschaften +benutzen. + +Schauen Sie sich noch einmal die Seite in der IR an, die @code{LyricText} +beschreibt. Unten auf der Seite ist eine klickbare Liste (in der HTML-Version +der IR) an Eigenschaften, die von @code{LyricText} unterstützt +werden. Diese Liste enthält sieben Einträge, darunter auch +@code{font-interface}. Ein Klick hierauf bringt uns zu den Eigenschaften, +die mit dieser Schnittstelle verbunden sind, also auch @code{LyricText}. + +Jetzt sehen wir alle die Eigenschaften, die der Benutzer verändern kann, +um die Schriftartendarstellung zu beeinflussen. Dazu gehört nun auch +@code{font-shape(symbol)}, wobei @code{symbol} auf die Werte +@code{upright} (gerade), @code{italics} (kursiv) oder @code{caps} +(Kapitälchen) gesetzt werden kann. + +Sie werden gemerkt haben, dass @code{font-series} und @code{font-size} +hier auch aufgelistet sind. Es stellt sich die Frage, warum diese +allgemeinen Schriftarteigenschaften @code{font-series} und +@code{font-size} sowohl unter der Überschrift +@code{LyricText} als unter dem @code{font-interface} aufgelistet +sind, aber @code{font-shape} befindet sich nur im +@code{font-interface}? Die Antwort ist: Die globalen Einstellungen +von @code{font-series} und @code{font-size} werden geändert, wenn +ein @code{LyricText}-Objekt erstellt wird, aber @code{font-shape} +wird davon nicht beeinflusst. Die zusätzlichen Einträge unter der +Überschrift @code{LyricText} beinhalten dann die Werte der +Standardeinstellungen dieser zwei Eigenschaften, wenn es sich +um ein @code{LyricText}-Objekt handelt. Andere Objekte, +die auch das @code{font-interface} unterstützen, setzen diese +Eigenschaften anders, wenn sie erstellt werden. + +Versuchen wir nun einen @code{\override}-Befehl zu konstruieren, +der den Gesantext kursiv setzt. Das Objekt hat die Bezeichnung +@code{LyricText}, die Eigenschaft ist @code{font-shape} +und der Wert @code{italic}. Wie vorher schon lassen wir den +Kontext aus. + +Am Rande sei angemerkt, dass die Werte der @code{font-shape}-Eigenschaft +mit einem Apostroph (@code{'}) gekennzeichnet werden +müssen, weil es sich um Symbole handelt. Aus dem gleichen +Grund mussten auch für @code{thickness} weiter oben im +Text ein Apostroph gesetzt werden. Symbole sind besondere +Bezeichnungen, die LilyPond intern bekannt sind. Einige +sind Bezeichnungen von Eigenschaften, wie eben @code{thickness} +oder @code{font-shape}. Andere sind besondere Werte, +die an Eigenschaften übergeben werden können, wie +@code{italic}. Im Unterschied hierzu gibt es auch beliebige +Zeichenketten, die immer mit Anführungszeichen, also +als @code{"Zeichenkette"} auftreten. Für weitere +Einzelheiten zu Zeichenketten und Werten, siehe +@ref{Scheme tutorial}. + +Gut, der @code{\override}-Befehl, mit dem der Gesangstext +kursiv gesetzt wird, lautet: @example -\once \override TextScript @dots{} +\override LyricText #'font-shape = #'italic @end example -@noindent -benutzt. Dieser Befehl verändert die Anzeige des Textes für die nächste -Note. Wenn die Note keinen Text zugeordnet hat, wird auch nichts -verändert (und es wird @strong{nicht} nach dem nächsten Text gesucht). -Um das Verhalten zu verändern, so dass alles, was nach dem Befehl -kommt, verändert wird, müssen Sie den Befehl @code{\once} weglassen. -Um die Veränderung zu stoppen, benutzen Sie den Befehl @code{\revert}. -Das wird genauer im Kapitel -@ruser{The \override command} erklärt. +@noindent +und er muss direkt vor den Text gesetzt werden, auf den er sich +bezieht, etwa so: -@lilypond[quote,fragment,ragged-right,verbatim,relative=3] - % temporary code to break this example: - \override TextScript #'outside-staff-priority = ##f -c4^"piu mosso" b -\once \override TextScript #'padding = #4.6 - a4 b -c4^"piu mosso" d e f -\once \override TextScript #'padding = #4.6 -c4^"piu mosso" d e f -c4^"piu mosso" d e f -\break -\override TextScript #'padding = #4.6 -c4^"piu mosso" d e f -c4^"piu mosso" d e f -\revert TextScript #'padding -c4^"piu mosso" d e f +@cindex font-shape-Eigenschaft, Beispiel +@cindex LyricText, Beispiel zur Veränderung +@cindex kursiv, Beispiel +@cindex @code{\addlyrics}, Beispiel + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 6/8 + { + r4 b8 b[( g]) g | + g[( e]) e d[( f]) a | + a g + } + \addlyrics { + \override LyricText #'font-shape = #'italic + The man who feels love's sweet e -- mo -- tion + } +} @end lilypond -@seealso +@noindent +Jetzt wird der Text kursiv gesetzt. -@ruser{The \override command}, @ref{Common tweaks}. +@subheading Specifying the context in lyric mode -@node Fixing overlapping notation -@subsection Fixing overlapping notation -Im Kapitel @ref{Moving objects} wurde gezeigt, wie man Texte -(@code{TextScript}-Objekte) verschiebt. Mit der gleichen -Technik können auch andere Objektklassen verschoben werden, -@code{TextScript} muss dann nur durch den Namen des Objektes -ersetzt werden. +@cindex Kontext im Gesangstextmodus angeben +@cindex Gesangstextmodus, Kontext angeben -Um den Objektnamen zu finden, siehe die @q{@strong{see also}}-Hinweise -am Ende des jeweiligen Abschnittes. Zum Beispiel am Ende des -Kapitels @ruser{Dynamics} findet sich: +Bei Gesangstexten funktioniert der @code{\override}-Befehl +nicht mehr, wenn Sie den Kontext im oben dargestellten +Format angeben. Eine Silbe wird im Gesangtextmodus +(lyricmode) entweder von einem Leerzeichen, einer +neuen Zeile oder einer Zahl beendet. Alle anderen +Zeichen werden als Teil der Silbe integriert. Aus diesem +Grund muss auch vor der schließenden Klammer +@code{@}} ein Leerzeichen gesetzt oder eine neue +Zeile begonnen werden. Genauso müssen Leerzeichen +vor und nach einem Punkt benutzt werden, um die +Kontext-Bezeichnung von der Objekt-Bezeichnung zu +trennen, denn sonst würden beide Bezeichnungen als +ein Begriff interpretiert und von LilyPond nicht verstanden +werden. Der Befehl muss also lauten: -@quotation -@seealso +@example +\override Lyrics . LyricText #'font-shape = #'italic +@end example -Programmreferenz: @rinternals{DynamicText}, @rinternals{Hairpin}. -Vertikale Positionierung dieser Symbole wird mit -@rinternals{DynamicLineSpanner} erreicht. -@end quotation +@warning{Innerhalb von Gesangstext muss immer ein +Leerzeichen zwischen der letzten Silbe und der schließenden +Klammer gesetzt werden.} -@noindent -Um also Dynamik-Zeichen zu verschieben, muss +@warning{Innerhalb von @code{\override}-Befehlen in +Gesangstexten müssen Leerzeichen um Punkte zwischen +Kontext- und Objektbezeichnungen gesetzt werden.} -@example -\override DynamicLineSpanner #'padding = #2.0 -@end example -benutzt werden. Es ist nicht genügend Platz, um jedes Objekt aufzulisten, -aber die gebräuchlichsten finden sich hier: +@node Types of properties +@subsection Types of properties -@multitable @columnfractions .33 .66 -@headitem Objekttyp @tab Objektbezeichnung -@item Dynamikzeichen (vertikal) @tab @code{DynamicLineSpanner} -@item Dynamikzeichen (horizontal) @tab @code{DynamicText} -@item Bindebögen @tab @code{Tie} -@item Phrasierungsbögen @tab @code{Slur} -@item Artikulationszeichen @tab @code{Script} -@item Fingersatz @tab @code{Fingering} -@item Text, z. B. @code{^"text"} @tab @code{TextScript} -@item Übungs-/Textmarken @tab @code{RehearsalMark} +@cindex Eigenschaftsarten + +Bis jetzt hatten wir es mit zwei Arten von Eigenschaften zu +tun: @code{number} (Zahl) und @code{symbol}. Damit +ein Befehl funktioniert, muss der Wert einer Eigenschaft +vom richtigen Typ sein und die Regeln befolgen, die +für diesen Typ gelten. Der Eigenschaftstyp ist in der +IR in Klammern hinter der Eigenschaftsbezeichnung +angegeben. Hier eine Liste der Typen, die Sie vielleicht +benötigen werden, mit den Regeln, die für den jeweiligen +Typ gelten und einigen Beispielen. Sie müssen immer +ein Rautenzeichen (@code{#}) vor den Typeintrag setzen, +wenn sie in einem @code{\override}-Befehl benutzt werden. + +@multitable @columnfractions .2 .45 .35 +@headitem Eigenschaftstyp + @tab Regeln + @tab Beispiele +@item Boolesch + @tab Entweder wahr oder falsch, dargestellt als #t oder #f + @tab @code{#t}, @code{#f} +@item Dimension (in Notenlinienabständen) + @tab Eine positive Dezimalzahl (in Notenlinienabstand-Einheiten) + @tab @code{2.5}, @code{0.34} +@item Richtung + @tab Eine gültige Richtungskonstante oder das numerische Äquivalent + @tab @code{LEFT}, @code{CENTER}, @code{UP}, + @code{1}, @code{-1} +@item Integer + @tab Eine positive ganze Zahl + @tab @code{3}, @code{1} +@item Liste + @tab Eine eingeklammerte Anzahl von Einträgen, mit Klammern getrennt + und angeführt von einem Apostroph + @tab @code{'(left-edge staff-bar)}, @code{'(1)}, + @code{'(1.0 0.25 0.5)} +@item Textbeschriftung (markup) + @tab Beliebige gültige Beschriftung + @tab @code{\markup @{ \italic "cresc." @}} +@item Moment + @tab Ein Bruch einer ganzen Note, mit der make-moment-Funktion + konstruiert + @tab @code{(ly:make-moment 1 4)}, + @code{(ly:make-moment 3 8)} +@item Zahl + @tab Eine beliebige positive oder negative Dezimalzahl + @tab @code{3.5}, @code{-2.45} +@item Paar (Zahlenpaar) + @tab Zwei Zahlen getrennt von @qq{Leerzeichen . Leerzeichen}, eingeklammert + und angeführt von einem Apostroph + @tab @code{'(2 . 3.5)}, @code{'(0.1 . -3.2)} +@item Symbol + @tab Eine beliebige Anzahl von Symbolen, die für die Eigenschaft + gültig sind, angeführt von einem Apostroph + @tab @code{'italic}, @code{'inside} +@item Unbekannt + @tab Eine Prozedur oder @code{#f} (um keine Aktion hervorzurufen) + @tab @code{bend::print}, @code{ly:text-interface::print}, + @code{#f} +@item Vektor + @tab Eine Liste mit drei Einträgen, eingeklammert und mit + Apostroph-Raute ( @code{'#}) angeführt. + @tab @code{'#(#t #t #f)} @end multitable -@node Real music example -@subsection Real music example - -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml +@seealso +Handbuch zum Lernen: @ref{Scheme tutorial}. -@c DEPRECATED SECTION -@node Common tweaks -@section Common tweaks +@node Appearance of objects +@section Appearance of objects -Bestimmte Korrekturen sind so häufig, dass für sie schon fertige -angepasste Befehle bereitgestellt sind, so etwa - @code{\slurUp} um einen Bindebogen oberhalb anzuzeigen oder -@code{\stemDown} um den Notenhals nach unten zu zwingen. Diese -Befehle sind im Teil Alles über die Notation unter dem -entsprechenden Abschnitt erklärt. +In diesem Abschnitt wollen wir zeigen, wie die Kenntnisse der +vorigen Abschnitte in der Praxis angewandt werden können, +um das Aussehen des Musiksatzes zu beeinflussen. -Eine vollständige Liste aller Veränderungen, die für jeden Objekttypen -(etwa Bögen oder Balken) zur Verfügung stehen, ist in der Programmreferenz -dargestellt. Viele Layoutobjekte benutzen jedoch gleiche Eigenschaften, -die benutzt werden können, um eigene Einstellungen vorzunehmen. +@menu +* Visibility and color of objects:: +* Size of objects:: +* Length and thickness of objects:: +@end menu -@itemize @bullet -@cindex padding -@cindex Füllung +@node Visibility and color of objects +@subsection Visibility and color of objects -@item -@code{padding}-Eigenschaft kann gesetzt werden, um den Abstand zwischen -Symbolen über oder unter den Noten zu vergrößern oder zu verkleinern. -Das gilt für alle Objekte, die ein @code{side-position-interface} -besitzen, also unterscheiden, auf welcher Seite der Note sie sich befinden. +In Unterrichtsmaterial für den Musikunterricht wird oft +eine Partitur dargestellt, in der bestimmte Notationselemente +fehlen, so dass der Schüler die Aufgabe bekommt, die +nachzutragen. Ein einfaches Beispiel ist etwa, die +Taktlinien zu entfernen, damit der Schüler sie selber zeichnen +kann. Aber die Tatklinien werden normalerweise automatisch +eingefügt. Wie verhindern wir, dass sie ausgegeben werden? + +Bevor wir uns hieran machen, sei daran erinnert, dass +Objekteigenschaften in sogenannten @emph{Schnittstellen} +-- engl. interface -- gruppiert sind, siehe auch +@ref{Properties found in interfaces}. Das dient ganz einfach +dazu, die Eigenschaften zusammenzufassen, die üblicherweise +zusammen benötigt werden -- wenn eine davon für ein Objekt +gilt, dann auch die anderen. Manche Objekte brauchen die +Eigenschaften von der einen Schnittstelle, andere von einer +anderen. Die Schnittstellen, die die Eigenschaften von einem +bestimmten Grob beinhalten, sind in der IR unten auf der +Seite aufgelistet, die dieses Grob beschreibt. Die Eigenschaften +können betrachtet werden, indem die Seite der entsprechenden +Schnittstelle geöffnet wird. + +Zu Information, wie man Eigenschaften von Grobs findet, siehe +@ref{Properties of layout objects}. Wir benutzen also jetzt +die selbe Methode um in der IR das Layout-Objekt zu finden, +dass für die Tatklinien zuständig ist. Über die Überschriften +@emph{Backend} und @emph{All layout objects} kommen +wir zu einem Layout-Objekt mit der Bezeichnung +@code{BarLine} (engl. TaktLinie). Seine Eigenschaften +beinhalten zwei, die über die Sichtbarkeit entscheiden: +@code{break-visibility} und @code{stencil}. +@code{BarLine} unterstützt auch einige Schnittstellen, +unter anderem @code{grob-interface}, wo wir eine +@code{transparent} und eine @code{color}-Eigenschaft +finden. Alle können die Sichtbarkeit von Taktlinien (und +natürlich auch die Sichtbarkeit von vielen anderen Objekten) +beeinflussen. Schauen wir uns diese Eigenschaften eine +nach der anderen an. + +@subheading stencil + +@cindex Stencil-Eigenschaft +@cindex Matrizen-Eigenschaft + +Diese Eigenschaft kontrolliert die Erscheinung der Taktlinien, +indem sie das Symbol bestimmt, das ausgegeben werden soll. +Wie bei vielen anderen Eigenschaften auch, kann sie so +eingestellt werden, dass sie nichts ausgibt, indem ihr Wert +auf @code{#f} (falsch) gesetzt wird. Ein Versuch also, +wie vorher, indem wir den impliziten Kontext (@code{Voice}) +auslassen: + +@cindex Taktlinie, Beispiel zur Veränderung +@cindex stencil-Eigenschaft, Beispiel -@lilypond[quote,fragment,relative=1,verbatim] -c2\fermata -\override Script #'padding = #3 -b2\fermata +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 12/16 + \override BarLine #'stencil = ##f + c4 b8 c d16 c d8 | + g, a16 b8 c d4 e16 | + e8 +} @end lilypond -@lilypond[quote,fragment,relative=1,verbatim] -% This will not work, see below: -\override MetronomeMark #'padding = #3 -\tempo 4=120 -c1 -% This works: -\override Score.MetronomeMark #'padding = #3 -\tempo 4=80 -d1 +Die Taktlinien werden aber immer noch angezeigt. Was ist da +falsch gelaufen? Gehen Sie zurück zur IR und schauen Sie auf +die Seite, die die Eigenschafter für @code{BarLine} angibt. +Oben auf der Seite steht: @qq{Barline objects are created +by: Bar_engraver}. Schauen Sie sich die +@code{Bar_engraver}-Seite an. Unten auf der Seite steht +eine Liste der Kontexte, in denen der Takt-Engraver +funktioniert. Alle Kontexte sind @code{Staff}-Typen (also +Notensystem-Typen). Der Grund, warum der +@code{\override}-Befehl nicht funktioniert hat, liegt +also darin, dass das Taktlinie-Objekt (@code{BarLine}) sich nicht +im @code{Voice}-Kontextbefindet. Wenn der Kontext +falsch angegeben wird, bewirkt der Befehl einfach gar +nichts. Keine Fehlermeldung wird ausgegeben und auch +nichts in die Log-Datei geschrieben. Versuchen wir also, +den richtigen Kontext mitanzugeben: + +@cindex Taktlinie, Beispiel zur Veränderung +@cindex stencil-Eigenschaft, Beispiel + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 12/16 + \override Staff.BarLine #'stencil = ##f + c4 b8 c d16 c d8 | + g, a16 b8 c d4 e16 | + e8 +} @end lilypond -Im zweiten Beispiel ist es sehr wichtig zu wissen, welcher Kontext -für bestimmte Objekte zuständig ist. Weil das - @code{MetronomeMark}-Objekt vom @code{Score}-Kontext gesetzt -wird, werden Veränderungen innerhalb des @code{Voice}-Kontextes -nicht berücksichtigt. Genauere Details im Kapitel -@ruser{The \override command}. +@noindent +Jetzt sind die Taktlinien wirklich verschwunden. + +Es sollte jedoch beachtet werden, dass das Setzen der +@code{stencil}-Eigenschaft auf @code{#f} zu Fehlerhinweisen führen +kann, wenn die Dimensionen des Objekts für die richtige Behandlung +benötigt werden. Zum Beispiel werden Fehler ausgegeben, wenn +die @code{stencil}-Eigenschaft des @code{NoteHead}-Objekts auf +@code{#f} gesetzt wird. + + +@subheading break-visibility + +@cindex break-visibility-Eigenschaft +@cindex Unsichtbar machen (break-visibility) + +Aus der Beschreibung der Eigenschaften für @code{BarLine} +in der IR geht hervor, dass die @code{break-visibility}-Eigenschaft +einen Vektor mit drei Booleschen Werten benötigt. Diese +kontrollieren jeweils, ob die Taktlinien am Ende einer Zeile, +in der Mitte einer Zeile und am Anfang einer Zeile ausgegeben +werden. Wenn also alle Taktlinien unsichtbar sein sollen, wie in +unserem Beispiel, brauchen wir den Wert @code{'#(#f #f #f)}. +Versuchen wir es also, und berücksichtigen wir auch den +@code{Staff}-Kontext. Beachten Sie auch, dass Sie @code{#'#} +vor der öffnenden Klammer schreiben müssen: +@code{'#} wird benötigt als Teil des Wertes, um einen Vektor zu +signalisieren, und das erste @code{#} wird benötigt, um +den Wert in einem @code{\override}-Befehl anzuführen. + +@cindex Taktlinie, Beispiel zur Veränderung +@cindex break-visibility-Eigenschaft, Beispiel -@cindex extra-offset -@cindex zusätzlicher Abstand -@cindex Abstand, zusätzlicher +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 12/16 + \override Staff.BarLine #'break-visibility = #'#(#f #f #f) + c4 b8 c d16 c d8 | + g, a16 b8 c d4 e16 | + e8 +} +@end lilypond -@item -Die @code{extra-offset}-Eigenschaft verschiebt Objekte, hier ist ein -Zahlenpaar zur Angabe der Positionierung erforderlich. Die erste Nummer bestimmt -die horizontale Bewegung, eine positive Zahl bewegt das Objekt nach rechts. -Die zweite Zahl bestimmt die vertikale Bewegung, eine positive Zahl bewegt -das Objekt nach oben. Die -@code{extra-offset}-Eigenschaft läuft auf unterster Ebene ab: Die -Formatierungsmaschine ist sich der Veränderungen nicht bewusst. +@noindent +Auch auf diesem Weg gelingt es, die Taktlinien unsichtbar zu machen. -Im folgenden Beispiel wird die zweite Fingersatzbezeichnung etwas nach -links verschoben und 1,8 Notenzeilenabstände nach unten: -@lilypond[quote,fragment,relative=1,verbatim] -\stemUp -f-5 -\once \override Fingering - #'extra-offset = #'(-0.3 . -1.8) -f-5 -@end lilypond +@subheading transparent -@item -Die Verwendung der @code{transparent}-Eigenschaft druckt das entsprechende Objekt -mit @qq{unsichtbarer Druckerschwärze}: Das Objekt wird nicht angezeigt, aber -sein Verhalten bleibt bestehen. Das Objekt nimmt weiterhin Platz ein, es nimmt -teil an Überschneidungen und deren Auflösung durch das Programm, Bögen und Balken -können daran angebunden werden. +@cindex transparent-Eigenschaft +@cindex Durchsichtig machen (transparent) -@cindex transparente Objekte -@cindex Entfernen von Objekten -@cindex Verstecken von Objekten -@cindex unsichtbare Objekte -Das nächste Beispiel zeigt, wie man unterschiedliche Stimmen mit -Bindebögen verbinden kann. Normalerweise können Bindebögen nur -zwei Noten der selben Stimme verbinden. Indem aber ein Bogen in einer -anderen Stimme erstellt wird, +Aus den Eigenschaftsdefinitionen auf der @code{grob-interface}-Seite +in der IR geht hervor, dass die @code{transparent}-Eigenschaft +boolesch ist. Mit @code{#t} (wahr) wird also ein Grob durchsichtig +gemacht. Im unserem Beispiel soll jetzt die Taktart durchsichtig +gemacht werden, anstatt die Taktlinien durchsichtig zu machen. +Wir brauchen also wieder die Grob-Bezeichnung für die Taktart. +Auf der @qq{All layout objects}-Seite in der IR müssen wir die +Eigenschaften des @code{TimeSignature}-Layout-Objekts suchen +Das Objekt wird vom @code{Time_signature_engraver} erstellt, +der sich auch im @code{Staff}-Kontext befindet und genauso das +@code{grob-interface} unterstützt, wie Sie sich +überzeugen können. Der Befehl, um die Taktangabe unsichtbar zu +machen, ist also: -@lilypond[quote,fragment,relative=2] -<< { - b8~ b8\noBeam -} \\ { - b[ g8] -} >> +@cindex Taktart, Beispiel zur Veränderung +@cindex transparent-Eigenschaft, Beispiel + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 12/16 + \override Staff.TimeSignature #'transparent = ##t + c4 b8 c d16 c d8 | + g, a16 b8 c d4 e16 | + e8 +} @end lilypond @noindent -und dann der erste Hals nach oben unsichtbar gemacht wird, scheint der -Bindebogen die Stimme zu wechseln: +Die Taktangabe ist verschwunden, aber mit diesem Befehl wird ein +freier Platz gelassen, wo sich die Taktangabe eigentlich befinden +würde. Das braucht man vielleicht für eine Schulaufgabe, in der +die richtige Taktangabe eingefügt werden soll, aber in anderen +Fällen ist diese Lücke nicht schön. Um auch die Lücke zu entfernen, +muss die Matrize (stencil) der Taktangabe auf @code{#f} (falsch) +gesetzt werden: +@cindex Taktart, Beispiel zur Veränderung +@cindex stencil-Eigenschaft, Beispiel -@lilypond[quote,fragment,relative=2,verbatim] -<< { - \once \override Stem #'transparent = ##t - b8~ b8\noBeam -} \\ { - b[ g8] -} >> +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 12/16 + \override Staff.TimeSignature #'stencil = ##f + c4 b8 c d16 c d8 | + g, a16 b8 c d4 e16 | + e8 +} @end lilypond -Damit der Hals den Bogen nicht zu sehr verkleinert, wird seine -Länge (@code{length}) auf den Wert @code{8} gesetzt: - +@noindent +Und der Unterschied wird deutlich: hiermit wird das gesamte Objekt +entfernt, während man mit @code{transparent} ein Objekt +unsichtbar machen kann, es aber an seinem Platz gelassen wird. + + +@subheading color + +@cindex color-Eigenschaft +@cindex Farb-Eigenschaft + +Abschließend wollen wir die Taktlinien unsichtbar machen, indem +wir sie weiß einfärben. (Es gibt hier eine Schwierigkeit: die weiße +Taktlinie übermalt manchmal die Taktlinienen, wo sie sie kreuzt, +manchmal aber auch nicht. Sie können in den Beispielen unten +sehen, dass das nicht vorhersagbar ist. Die Einzelheiten dazu, warum +das passiert und wie sie es kontrollieren können, werden dargestellt +in @ruser{Painting objects white}. Im Moment wollen wir lernen, wie +man mit Farbe arbeitet, akzeptieren Sie bitte an dieser Stelle die +Beschränkung.) + +Das @code{grob-interface} bestimmt, dass der Wert der Farb-Eigenschaft +eine Liste ist, aber es gibt keine Erklärung, was für eine Liste das +sein soll. Die Liste, die benötigt wird, ist eine Liste mit Werten in +internen Einheiten, aber damit Sie nicht wissen müssen, wie diese +aussehen, gibt es mehrere Wege, Farben anzugeben. Der erste +Weg ist es, @qq{normale} Farben zu benutzen, wie sie in der +Tabelle in @ruser{List of colors} aufgelistet sind. Beachten Sie, +dass die Bezeichnungen auf English sind. Um die Taktlinien auf +weiß zu setzen, können Sie schreiben: + +@cindex Taktlinie, Beispiel zur Veränderung +@cindex color-Eigenschaft, Beispiel -@lilypond[quote,fragment,relative=2,verbatim] -<< { - \once \override Stem #'transparent = ##t - \once \override Stem #'length = #8 - b8~ b8\noBeam -} \\ { - b[ g8] -} >> +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 12/16 + \override Staff.BarLine #'color = #white + c4 b8 c d16 c d8 | + g, a16 b8 c d4 e16 | + e8 +} @end lilypond -@end itemize +@noindent +und die Taktlinien verschwinden in der Tat. Beachten Sie, +dass @emph{white} nicht mit einem Apostroph angeführt +wird -- es ist kein Symbol, sondern eine @emph{Funktion}. +Wenn sie aufgerufen wird, stellt sie eine Liste mit internen +Werten zu Verfügung, mit welcher die Farbe auf weiß +gestellt wird. Die anderen Farben in der Liste sind auch +Funktionen. Um sich zu überzeugen, dass der Befehl auch +wirklich funktioniert, können Sie die Farbe auf eine der +anderen Funktionen dieser Liste abändern. + +@cindex Farben, X11 +@cindex X11-Farben +@funindex x11-color + +Die zweite Art die Farbe zu ändern geschieht, indem die Liste +der X11-Farbbezeichnungen einzusetzen, siehe die zweite Liste +in @ruser{List of colors}. Diesen Farben muss jedoch eine +andere Funktion vorangestellt werden, die die X11-Farbbezeichnungen +in interne Werte konvertiert: +@code{x11-color}. Das geschieht wie folgt: + +@cindex Taktlinie, Beispiel zur Veränderung +@cindex color-Eigenschaft, Beispiel + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 12/16 + \override Staff.BarLine #'color = #(x11-color 'white) + c4 b8 c d16 c d8 | + g, a16 b8 c d4 e16 | + e8 +} +@end lilypond -@cindex Veränderungen von Abständen -@cindex Optimierung von Abständen -@cindex Abstände +@noindent +In diesem Fall hat die Funktion @code{x11-color} ein Symbol +als Argument, darum muss dem Symbol ein Apostroph vorangestellt +und beide zusammen in Klammern gesetzt werden. -Abstände in LilyPond werden in Notenzeilenabständen -(@code{staff-space}) gemessen, während die meisten Dicke-Eigenschaften -auf mit der Notenliniendicke korrespondieren. Eine Eigenschaften -verhalten sich anders, etwa die Dicke von Balken ist an die -Notenzeilenabstände gekoppelt. Mehr Information findet sich -im relevanten Teil der Programmreferenz. +@cindex RGB-Farben +@cindex Farben, RGB +@funindex rgb-color -@node Further tweaking -@section Further tweaking +Es gibt noch eine dritte Funktion, die RGB-Werte in die +internen Werte übersetzt -- die @code{rgb-color}-Funktion. Sie +braucht drei Argumente, um die Stärke von Rot, Grün und +Blau darzustellen. Die Werte befinden sich zwischen +0 und 1. Um also die Farbe Rot darzustellen, muss der +Wert der Funktion lauten: @code{(rgb-color 1 0 0)}, weiß +würde sein: @code{(rgb-color 1 1 1)}. -@menu -* Other uses for tweaks:: -* Using variables for tweaks:: -* Other sources of information:: -* Avoiding tweaks with slower processing:: -* Advanced tweaks with Scheme:: -@end menu +@cindex Taktlinie, Beispiel zur Veränderung +@cindex color-Eigenschaft, Beispiel -@node Other uses for tweaks -@subsection Other uses for tweaks +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 12/16 + \override Staff.BarLine #'color = #(rgb-color 1 1 1) + c4 b8 c d16 c d8 | + g, a16 b8 c d4 e16 | + e8 +} +@end lilypond -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml +Schließlich gibt es noch eine Grauskala, die zu den X11-Farben +gehört. Sie reicht von schwarz (@code{'grey0'}) bis +weiß (@code{'grey100}), in Einserschritten. Wir wollen das +illustrieren, indem alle Layout-Objekte im Beispiel +verschiede Grauschattierungen erhalten: + +@cindex StaffSymbol, Beispiel zur Veränderung +@cindex TimeSignature, Beispiel zur Veränderung +@cindex Schlüssel, Beispiel zur Veränderung +@cindex Notenhals, Beispiel zur Veränderung +@cindex Taktlinie, Beispiel zur Veränderung +@cindex Farbeigenschaft, Beispiel +@cindex x11-Farben, Beispiel +@cindex Taktlinien, Beispiel zur Veränderung +@cindex Taktart, Beispiel zur Veränderung +@cindex Clef, Beispiel zur Veränderung +@cindex Stem, Beispiel zur Veränderung +@cindex NoteHead, Beispiel zur Veränderung +@cindex Notenkopf, Beispiel zur Veränderung -@node Using variables for tweaks -@subsection Using variables for tweaks +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 12/16 + \override Staff.StaffSymbol #'color = #(x11-color 'grey30) + \override Staff.TimeSignature #'color = #(x11-color 'grey60) + \override Staff.Clef #'color = #(x11-color 'grey60) + \override Voice.NoteHead #'color = #(x11-color 'grey85) + \override Voice.Stem #'color = #(x11-color 'grey85) + \override Staff.BarLine #'color = #(x11-color 'grey10) + c4 b8 c d16 c d8 | + g, a16 b8 c d4 e16 | + e8 +} +@end lilypond -@ifhtml -UNTRANSLATED NODE: IGNORE ME -@end ifhtml +@noindent +Beachten Sie die Kontexte, die mit jedem einzelnen Layout-Objekt +verbunden sind. Es ist wichtig, den richtigen Kontext einzusetzen, +damit die Befehle funktionieren. Denken Sie daran, dass der +Kontext sich daran orientiert, wo sich der entsprechende +Engraver befindet. Den Standardkontext für Engraver finden +Sie, indem Sie beim Layout-Objekt beginnen, zum Engraver +gehen, der es produziert und auf der Seite des Engravers in der +IR finden Sie Information, in welchem Kontext sich der +Engraver normalerweise befindet. -@node Other sources of information -@subsection Other sources of information -Die Programmreferenz enthält sehr viel Information über LilyPond, aber -noch mehr Information findet sich in den internen -LilyPond-Dateien. +@node Size of objects +@subsection Size of objects -Eine Standardeinstellungen (wie die Definitionen für den Kopf (@code{\header} -sind als @code{.ly}-Datei gespeichert. Andere Einstellungen -(wie die Definition für Beschriftung (@code{markup}) sind -als @code{.scm} (Scheme)-Datei gespeichert. Eine nähere Erklärung -geht über den Rahmen dieses Handbuches hinaus. Der Hinweis -scheint aber angebracht, dass es grundlegende technische -Kenntnis und sehr viel Zeit erfordert, diese Dateien zu verstehen. +@cindex Veränderung von Objektgrößen +@cindex Objektgrößen, verändern +@cindex Größen von Objekten verändern -@itemize @bullet +Als Startpunkt wollen wir wieder ein früheres Beispiel +wählen, siehe @ref{Nesting music expressions}. Hier wurde +ein neues Notensystem erstellt, wie man es für ein @rglos{ossia} +braucht. -@item Linux: @file{@var{installdir}/lilypond/usr/share/lilypond/current/} +@cindex alignAboveContext-Eigenschaft, Beispiel +@cindex über dem System anordnen, Beispiel +@cindex @code{\with}-Beispiel -@item OS X: -@file{@var{installdir}/LilyPond.app/Contents/Resources/share/lilypond/current/}. -Um diese Ordner anzuschauen, wechseln Sie entweder mit @code{cd} im Terminal -zu der Adresse oder klicken Sie mit der rechten Maustaste auf das LilyPond-Symbol -und wählen Sie @q{Show Package Contents}. +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +\new Staff ="main" { + \relative g' { + r4 g8 g c4 c8 d | + e4 r8 + << + { f c c } + \new Staff \with { + alignAboveContext = #"main" } + { f8 f c } + >> + r4 | + } + } +@end lilypond -@item Windows: @file{@var{installdir}/LilyPond/usr/share/lilypond/current/} +Ossia-Systeme werden normalerweise ohne Schlüssel und Taktangabe +geschrieben, und sie werden etwas kleiner als das Hauptsystem gesetzt. +Wie man Schlüssel und Taktangabe entfernt, wissen wir schon: +wir setzen den Stencil von beiden auf @code{#f}: -@end itemize +@cindex alignAboveContext-Eigenschaft, Beispiel +@cindex über dem System anordnen, Beispiel +@cindex @code{\with}-Beispiel +@cindex stencil-Eigenschaft, Beispiel +@cindex Schlüssel, Beispiel zur Veränderung +@cindex Taktart, Beispiel zur Veränderung -Die @file{ly/} und @file{scm/}-Ordner sind von besonderem Interesse. -Dateien wie @file{ly/property-init.ly} und -@file{ly/declarations-init.ly} definieren alle häufig vorkommenden Veränderungen. +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +\new Staff ="main" { + \relative g' { + r4 g8 g c4 c8 d | + e4 r8 + << + { f c c } + \new Staff \with { + alignAboveContext = #"main" + } + { + \override Staff.Clef #'stencil = ##f + \override Staff.TimeSignature #'stencil = ##f + { f8 f c } + } + >> + r4 | + } +} +@end lilypond +@noindent +wobei ein zusätzliches Klammerpaar nach der @code{\with}-Konstruktion +erforderlich ist um sicherzugehen, dass die Modifikation und +die Noten sich auch auf das Ossia-System beziehen. + +Was für einen Unterschied macht es, ob man den @code{Staff}-Kontext +mit @code{\with} verändert, oder ob man die Stencils mit +@code{\override} beeinflusst? Der größte Unterschied liegt +darin, dass Änderungen, die mit @code{\with} eingeführt werden, +während der Erstellung des Kontextes miterzeugt werden und +als @strong{Standardeinstellungen} für diesen Kontext während seiner +gesamten Dauer gelten, während @code{\set}- oder @code{\override}-Befehle +dynamisch in die Noten eingebettet werden -- sie führen die +Änderungen synchron mit einem bestimmten Zeitpunkt in +der Musik aus. Wenn die Änderungen mit @code{\unset} +oder @code{\revert} rückgängig gemacht werden, werden +wieder die Standardwerte eingesetzt, die also die sind, die +mit einer @code{\with}-Konstruktion definiert wurden, oder +wenn hier keine definiert worden sind, die normalen +Standardwerte. + +Manche Kontexteigenschaften können nur ein einer +@code{\with}-Konstruktion verändert werden. Das sind +Eigenschaften, die nicht sinnvoll mitten im System geändert +werden können. @code{alignAboveContext} (Orientierung +über dem Kontext) und die Parallele, +@code{alignBelowContext} (Orientierung unter dem Kontext) +sind zwei derartige Eigenschaften -- wenn das Notensystem +einmal erstellt wurde, ist die Orientierung schon bestimmt +und es wäre nicht sinnvoll, sie später zu ändern. + +Die Standardwerte für Layout-Objekt-Eigenschaften können +auch in der @code{\with}-Konstruktion gesetzt werden. +Benutzen Sie einfach den normalen @code{\override}-Befehl +ohne den Kontext, denn der Kontext ist eindeutig definiert +durch die Stelle, an welcher sich @code{\with} befindet. +Wenn an dieser Stelle ein Kontext angegeben wird, produziert LilyPond +eine Fehlermeldung. + +Das obige Beispiel könnte also auch so aussehen: + +@cindex alignAboveContext-Eigenschaft, Beispiel +@cindex über dem System anordnen, Beispiel +@cindex @code{\with}-Beispiel +@cindex stencil-Eigenschaft, Beispiel +@cindex Schlüssel, Beispiel zur Veränderung +@cindex Taktart, Beispiel zur Veränderung -@node Avoiding tweaks with slower processing -@subsection Avoiding tweaks with slower processing +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +\new Staff ="main" { + \relative g' { + r4 g8 g c4 c8 d | + e4 r8 + << + { f c c } + \new Staff \with { + alignAboveContext = #"main" + % Don't print clefs in this staff + \override Clef #'stencil = ##f + % Don't print time signatures in this staff + \override TimeSignature #'stencil = ##f + } + { f8 f c } + >> + r4 | + } +} +@end lilypond -LilyPond kann einige zusätzliche Tests durchführen, während -die Noten gesetzt werden. Dadurch braucht das Programm länger, -um den Notensatz zu produzieren, aber üblicherweise werden -weniger nachträgliche Anpassungen nötig sein. +Nun können wir daran gehen, auch wirklich die +Größe der Objekte zu ändern. + +Manche Layout-Objekte werden aus Glyphen erstellt, +die sich in einer Schriftartdatei befinden. Dazu gehören +die Notenköpfe, Versetzungszeichen, Text, Schlüssel, +Taktbezeichnung, Dynamik und Gesangstext. Ihre +Größe wird verändert, indem die +@code{font-size}- (Schriftgröße)-Eigenschaft geändert wird, wie +wir bald sehen werden. Andere Layout-Objekte, wie +Bögen -- oder allgemein Strecker-Objekte -- werden +individuell gezeichnet, es gibt dazu also keine +@code{font-size}, die mit ihnen verknüpft wäre. +Weitere Eigenschaften wie die Länge von Hälsen und +Taktlinien, Dicke von Balken und anderen Linien und +der Abstand der Notenlinien voneinander müssen auf +spezielle Weise verändert werden. + +In unserem Ossia-Beispiel wollen wir zuerst die +Schriftgröße verändern. Das ist auf zwei Arten möglich. +Entweder wir ändern die Schriftgröße für jede Objektart +mit einem eigenen Befehl, etwa: @example -%% Um sicher zu gehen, dass Texte und Liedtext -%% innerhalb der Papierränder bleiben -\override Score.PaperColumn #'keep-inside-line = ##t +\override NoteHead #'font-size = #-2 @end example +@noindent +oder wir ändern die Größe aller Schriftobjekte, indem wir +den Wert einer besonderen Eigenschaft, @code{fontSize}, +mit dem @code{\set}-Befehl bestimmen oder sie in +eine @code{\with}-Konstruktion (ohne @code{\set} einschließen. -@node Advanced tweaks with Scheme -@subsection Advanced tweaks with Scheme +@example +\set fontSize = #-2 +@end example + +Beide Beispiele reduzieren die Schriftgröße um zwei Schritte +im Vergleich zum vorigen Wert, wobei jeder Schritt die +Schriftgröße um etwa 12% verändert. + +Setzen wir das also in unserem Ossia-Beispiel ein: + +@cindex alignAboveContext-Eigenschaft, Beispiel +@cindex über dem System anordnen, Beispiel +@cindex @code{\with}-Beispiel +@cindex stencil-Eigenschaft, Beispiel +@cindex Schlüssel, Beispiel zur Veränderung +@cindex Taktart, Beispiel zur Veränderung + +@lilypond[quote,verbatim,fragment,ragged-right,relative=2] +\new Staff ="main" { + \relative g' { + r4 g8 g c4 c8 d | + e4 r8 + << + { f c c } + \new Staff \with { + alignAboveContext = #"main" + \override Clef #'stencil = ##f + \override TimeSignature #'stencil = ##f + % Reduce all font sizes by ~24% + fontSize = #-2 + } + { f8 f c } + >> + r4 | + } +} +@end lilypond -Es wurde schon gezeigt, wie die LilyPond-Ausgabe sehr stark verändert -werden kann, indem man Befehle wie -@code{\override TextScript #'extra-offset = ( 1 . -1)} benutzt. Aber -noch mehr Einfluss auf die Formatierung kann durch den Einsatz von -Scheme genommen werden. Eine vollständige Erklärung findet sich in der - @ref{Scheme tutorial} und den -@ruser{Interfaces for programmers}. +Das sieht aber immer noch nicht richtig aus. Die Notenköpfe +und Fähnchen sind kleiner, aber die Hälse im Vergleich +dazu zu lang und die Notenlinien zu weit auseinander. +Sie müssen auch proportional zur Schriftart verkleinert +werden. Der nächste Abschnitt behandelt diese Anpassung. -Scheme kann benutzt werden, um einfach nur Befehle zu @qq{überschreiben} -(@code{\override}): -@lilypond[quote,verbatim,ragged-right] -padText = #(define-music-function (parser location padding) (number?) -#{ - \once \override TextScript #'padding = #$padding -#}) +@node Length and thickness of objects +@subsection Length and thickness of objects -\relative c''' { - c4^"piu mosso" b a b - \padText #1.8 - c4^"piu mosso" d e f - \padText #2.6 - c4^"piu mosso" fis a g +@cindex Entfernungen +@cindex Dicke +@cindex Länge +@funindex magstep +@cindex Größe, verändern +@cindex Notenhalslänge, verändern +@cindex Hälse, Länge verändern +@cindex Notenlinien, Länge verändern + +Abstände und Längen werden in LilyPond üblicherweise +in Notenlinienabständen (engl. staff-spaces) gemessen. +Das ist der Abstand zwischen zwei Notenlinien im System. +Die meisten Dicken (engl. thickness) dagegen werden in +einer internen Einheit Linien-Dicke (engl. line-thickness) +gemessen. Die Linien von Dynamikklammern zum Beispiel +haben standardmäßig eine Dicke von einer Einheit +@code{line-thickness}, während die Dicke eines +Notenhalses 1,3 ist. Beachten Sie jedoch, dass sich +manche Dicken anders verhalten: die Dicke von +Balken etwa wird in Notenlinienabständen gemessen. + +Wie also werden Längen skaliert um der Schriftgröße +zu entsprechen? Das kann mit einer besonderen Funktion +@code{magstep} vorgenommen werden, die genau für +diesen Zweck vorhanden ist. Sie nimmt ein Argument auf, +die Änderung der Schriftgröße (#-2 im obigen Beispiel) +und gibt einen Skalierungsfaktor aus, der dazu dient, +Objekte proportionell zueinander zu verändern. So wird +sie benutzt: + +@cindex alignAboveContext-Eigenschaft, Beispiel +@cindex über dem System anordnen, Beispiel +@cindex @code{\with}-Beispiel +@cindex stencil-Eigenschaft, Beispiel +@cindex Schlüssel, Beispiel zur Veränderung +@cindex Taktart, Beispiel zur Veränderung +@cindex Notenlinienabstände verändern +@cindex staff-space-Eigenschaft verändern +@cindex magstep-Funktion, Beispiel +@cindex Schriftart-Eigenschaft, Beispiel + +@lilypond[quote,verbatim,fragment,ragged-right,relative=2] +\new Staff ="main" { + \relative g' { + r4 g8 g c4 c8 d | + e4 r8 + << + { f c c } + \new Staff \with { + alignAboveContext = #"main" + \override Clef #'stencil = ##f + \override TimeSignature #'stencil = ##f + fontSize = #-2 + % Reduce stem length and line spacing to match + \override StaffSymbol #'staff-space = #(magstep -2) + } + { f8 f c } + >> + r4 | + } } @end lilypond -Hiermit können aber auch neue Befehle erstellt werden: +@noindent +Da die Länge eines Halses und viele andere Längeneigenschaften +relativ zum Wert des Notenlinienabstands (@code{staff-space}) +errechnet werden, werden sie auch automatisch verkleinert. +Das wirkt sich jedoch nur auf die vertikale Skalierung des Ossias +aus -- die horizontale Skala ist durch das Layout des Haupsystems +bestimmt und wird also von diesen Größenänderungen nicht +betroffen. Wenn natürlich die Größe der gesamten Noten reduziert +würde, würde sich auch die horizontalen Abstände ändern. Dass +wird später im Layout-Abschnitt betrachtet. + +Mit dieser Änderung ist unser Ossia fertig. Die Größen und Längen +aller anderen Objekte können auf analoge Weise geändert +werden. + +Für kleine Größenänderungen, wie in dem obigen Beispiel, +braucht die Dicke der verschiedenen Linien, wie Taktlinien, +Notenlinien, Balken, Dynamikklammern usw. normalerweise +keine spezielle Anpassung. Wenn die Dicke eines bestimmten +Layout-Objektes angepasst werden muss, kann man das erreichen, +indem die entsprechende @code{thickness}-Eigenschaft des +Objekts mit @code{\override} verändert wird. Ein Beispiel, +wie man die Dicke von Bögen ändert, wurde schon gezeigt, +siehe @ref{Properties of layout objects}. Die Dicke aller +gezeichneten Objekte (die also nicht aus einer Schriftart +stammen) können auf gleiche Weise geändert werden. -@lilypond[quote,verbatim,ragged-right] -tempoMark = #(define-music-function (parser location padding marktext) - (number? string?) -#{ - \once \override Score . RehearsalMark #'padding = $padding - \once \override Score . RehearsalMark #'extra-spacing-width = #'(+inf.0 . -inf.0) - \mark \markup { \bold $marktext } -#}) -\relative c'' { - c2 e - \tempoMark #3.0 #"Allegro" - g c -} +@node Placement of objects +@section Placement of objects + +@menu +* Automatic behavior:: +* Within-staff objects:: +* Outside-staff objects:: +@end menu + + +@node Automatic behavior +@subsection Automatic behavior + +@cindex within-staff-Objekte +@cindex outside-staff-Objekte +@cindex Objekte innerhalb des Notensystems +@cindex Objekte außerhalb des Notensystems + +Es gibt Objekte der Notation, die zum Notensystem gehören, und +andere, die außerhalb des Systems gesetzt werden müssen. Sie +werden @code{within-staff}-Objekte bzw. +@code{outside-staff}-Objekte genannt. + +@code{within-staff}-Objekte werden innerhalb des Notensystems +(engl. staff) gesetzt: Notenköpfe, Hälse, Versetzungszeichen +usw. Ihre Position ist üblicherweise durch die notierte Musik +bestimmt -- sie werden vertikal auf bestimmten Linien notiert +oder sind an andere Objekte gebunden, die vertikal festgelegt +sind. Kollisionen von Notenköpfen, Hälsen und Versetzungszeichen +werden normalerweise automatisch vermieden. Es gibt +Befehle, um dieses automatische Verhalten zu verändern, wie +unten gezeigt werden soll. + +Objekte, die außerhalb des Notensystems gesetzt werden, sind +unter Anderem Übungsmarkierungen, Text und Dynamikzeichen. +LilyPonds Regel für ihre vertikale Positionierung lautet, sie so nah wie +möglich am Notensystem zu setzen, aber nicht so nah, dass +sie mit anderen Objekten kollidieren. Dabei wird die +@code{outside-staff-priority}-(Priorität außerhalb des Notensystems)-Eigenschaft +eingesetzt, um die Reihenfolge zu bestimmen, in denen Objekte gesetzt werden +sollen. + +Zuerst werden alle Innersystemobjekte von LilyPond gesetzt. +Dann werden die Objekte außerhalb des Systems nach +ihrer +@code{outside-staff-priority} geordnet. Die @code{outside-staff}-Objekte +werden dann nacheinander gesetzt, mit der niedrigsten +Priorität beginnend, und so gesetzt, dass sie nicht mit anderen +Objekten kollidieren, die schon gesetzt wurden. Wenn also zwei +@code{outside-staff}-Objekte um den selben Platz streiten, +wird das mit der geringeren @code{outside-staff-priority} näher +am System gesetzt werden. Wenn zwei Objekte die selbe Priorität +haben, wird das näher am System gesetzt, welches zuerst +auftritt. + +Im folgenden Beispiel haben alle Textbeschriftungen die gleiche +Priorität (weil sie nicht explizit gesetzt worden ist). Beachten Sie, +dass @qq{Text3} wieder dicht am System gesetzt wurde, weil +er unter @qq{Text2} passt. + +@cindex Textbeschriftungsbeispiel + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +c2^"Text1" +c^"Text2" +c^"Text3" +c^"Text4" +@end lilypond + +Notensysteme werden in den Standardeinstellungen auch so dicht +beeinander gesetzt wie es möglich ist (mit einem minimalen Abstand). +Wenn Noten sehr weit aus einem System herausragen, zwingen sie +das nächste System weiter weg, wenn eine Kollision drohen würde. +Im nächsten Beispiel sehen Sie, wie Noten auf zwei Systemen +@qq{ineinander greifen}. + +@lilypond[quote,ragged-right,verbatim] +<< + \new Staff { + \relative c' { c a, } + } + \new Staff { + \relative c'''' { c a, } + } +>> @end lilypond -Sogar ganze musikalische Ausdrücke können eingefügt werden: -@lilypond[quote,verbatim,ragged-right] -pattern = #(define-music-function (parser location x y) (ly:music? ly:music?) -#{ - $x e8 a b $y b a e -#}) +@node Within-staff objects +@subsection Within-staff objects + +Es wurde schon gezeigt, wie die Befehle @code{\voiceXXX} die Richtung +von Bögen, Fingersatz und allen anderen Objekten beeinflusst, +die von der Richtung der Notenhälsen abhängen. Diese Befehle +sind nötig, wenn polyphone Musik geschrieben wird, damit sich +die einzelnen Melodielinien klar abzeichnen. Es kann aber von Zeit +zu Zeit nötig sein, dieses automatische Verhalten zu verändern. Das +kann entweder für ganze Abschnitte, aber genauso auch nur für eine +einzelne Note vorgenommen werden. Die Eigenschaft, die die Richtung +bestimmt, ist die @code{direction}-Eigenschaft jedes Layout-Objekts. +Es soll erst erklärt werden, was sie bewirkt und dann eine Anzahl +an fertigen Befehlen für die üblicheren Situationen präsentiert werden, +mit denen Sie gleich loslegen können. + +Manche Layout-Objekte, wie Legato- und Bindebögen, biegen sich +oder zeigen entweder nach oben oder nach unten, andere, wie +Hälse und Fähnchen, verändern auch die Position rechts oder links, +je nach der Richtung, in die sie zeigen. Das wird automatisch +berücksichtigt, wenn die @code{direction}-Eigenschaft verändert +wird. + +@funindex down +@funindex up +@funindex center +@funindex neutral +@cindex hoch-Eigenschaft +@cindex runter-Eigenschaft +@cindex zentriert-Eigenschaft +@cindex neutral-Eigenschaft + +Das folgende Beispiel zeigt im ersten Takt die Standardeinstellung +für Hälse, die bei hohen Noten nach unten zeigen und bei tiefen +noten nach oben. Im nächsten Takt werden alle Hälse nach unten +gezwungen, im dritten Takt nach oben, und im vierten wird wieder +der Standard eingestellt. + +@cindex Notenhals, Beispiel zur Veränderung +@cindex Richtungseigenschaft, Beispiel + +@lilypond[quote,verbatim,relative=2] +a4 g c a +\override Stem #'direction = #DOWN +a g c a +\override Stem #'direction = #UP +a g c a +\revert Stem #'direction +a g c a +@end lilypond -\relative c''{ - \pattern c8 c8\f - \pattern {d16 dis} { ais16-> b\p } +Hier werden die Konstanten @code{DOWN} und @code{UP} +eingesetzt. Sie haben die Werte @code{-1} bwz. @code{+1}, und +diese numerischen Werte können ebenso benutzt werden. Auch +der Wert @code{0} kann in manchen Fällen benutzt werden. Er +bedeutet für die Hälse das gleiche wie @code{UP}, für einige +andere Objekte jedoch @qq{zentiert}. Es gibt hierzu die Konstante +@code{CENTER}, die den Wert @code{0} hat. + +Es gibt aber einfachere Befehle, die normalerweise benutzt werden. +Hier eine Tabelle der häufigsten. Die Bedeutung des Befehls wird +erklärt, wenn sie nicht selbsverständlich ist. + +@multitable @columnfractions .2 .2 .25 .35 +@headitem Runter/Links + @tab Rauf/Rechts + @tab Rückgängig + @tab Wirkung +@item @code{\arpeggioArrowDown} + @tab @code{\arpeggioArrowUp} + @tab @code{\arpeggioNormal} + @tab Arpeggio mit Pfeil nach unten, oben oder ohne Pfeil +@item @code{\dotsDown} + @tab @code{\dotsUp} + @tab @code{\dotsNeutral} + @tab Richtung der Verschiebung eines Punktes, um Notenlinien zu vermeiden +@item @code{\dynamicDown} + @tab @code{\dynamicUp} + @tab @code{\dynamicNeutral} + @tab Position der Dynamik-Bezeichnung relativ zum System +@item @code{\phrasingSlurDown} + @tab @code{\phrasingSlurUp} + @tab @code{\phrasingSlurNeutral} + @tab Befehl für Richtung von Phrasierungsbögen +@item @code{\slurDown} + @tab @code{\slurUp} + @tab @code{\slurNeutral} + @tab Befehl für Richtung von Legatobögen +@item @code{\stemDown} + @tab @code{\stemUp} + @tab @code{\stemNeutral} + @tab Befehl für Richtung von Hälsen +@item @code{\textSpannerDown} + @tab @code{\textSpannerUp} + @tab @code{\textSpannerNeutral} + @tab Position von Textbeschrifungen, die als Strecker eingegeben werden +@item @code{\tieDown} + @tab @code{\tieUp} + @tab @code{\tieNeutral} + @tab Befehl für Richtung von Bindebögen +@item @code{\tupletDown} + @tab @code{\tupletUp} + @tab @code{\tupletNeutral} + @tab Befehl für Richtung von Klammern/Zahlen der N-tolen +@end multitable + +Diese vordefinierten Befehl können allerdings @strong{nicht} +zusammen mit @code{\once} benutzt werden. Wenn Sie die +Wirkung eines Befehl auf eine einzige Noten begrenzen wollen, +müssen Sie den entsprechenden +@code{\once \override}-Befehl benutzen oder den definierten +Befehl, gefolgt von dem entsprechenden neutralisierenden +@code{xxxNeutral}-Befehl nach der Note. + + +@subheading Fingering + +@cindex Fingersatz, Positionierung +@cindex Fingersatz, Akkorde + +Die Positionierung von Fingersatz kann auch durch den Wert +seiner @code{direction}-Eigenschaft beeinflusst werden, aber +eine Veränderung von @code{direction} hat keinen Einfluss auf +Akkorde. es gibt auch hier +besondere Befehle, mit denen der Fingersatz von einzelnen +Noten in Akkorden kontrolliert werden kann, wobei mögliche +Positionen über, unter der Note und rechts bzw. links von +ihr sind. + +Zunächst die Wirkungsweise von @code{direction} auf +den Fingersatz: im ersten Takt der Standard, dann +die Wirkung von @code{DOWN} (runter) und @code{UP} +(hinauf). + +@cindex Fingersatz, Beispiel zur Veränderung +@cindex direction-Eigenschaft, Beispiel + +@lilypond[quote,verbatim,relative=2] +c-5 a-3 f-1 c'-5 +\override Fingering #'direction = #DOWN +c-5 a-3 f-1 c'-5 +\override Fingering #'direction = #UP +c-5 a-3 f-1 c'-5 +@end lilypond + +Eine Beeinflussung der @code{direction}-Eigenschaft ist jedoch +nicht die einfachste Art, Fingersatzbezeichnungen manuell über oder +unter das System zu setzen. Normalerweise bietet es sich an, +@code{_} oder @code{^} anstelle von @code{-} vor der Fingersatz-Zahl +zu benutzen. Hier das vorherigen Beispiel mit dieser Methode: + +@cindex Fingersatz-Beispiel + +@lilypond[quote,verbatim,relative=2] +c-5 a-3 f-1 c'-5 +c_5 a_3 f_1 c'_5 +c^5 a^3 f^1 c'^5 +@end lilypond + +Die @code{direction}-Eigenschaft wirkt sich nicht auf +Akkorde aus, während die Präfixe @code{_} und @code{^} funktionieren. +Standardmäßig wird der Fingersatz automatisch entweder +über oder unter dem Akkord gesetzt: + +@cindex Fingersatz-Beispiel + +@lilypond[quote,verbatim,relative=2] + + + +@end lilypond + +@noindent +aber das kann manuell geändert werden, um einzelne Fingersatzanweisungen +nach oben oder unten zu zwingen: + +@cindex Fingersatz-Beispiel + +@lilypond[quote,verbatim,relative=2] + + + +@end lilypond + +Noch bessere Kontrolle über die Positionierung von Fingersatz für +einzelne Noten in einem Akkord ist mit dem +@code{\set fingeringOrientations}-Befehl möglich. Die Syntax +lautet: + +@example +@code{\set fingeringOrientations = #'([up] [left/right] [down])} +@end example + +@noindent +@code{\set}wird benutzt, weil @code{fingeringOrientations} eine +Eigenschaft des @code{Voice}-Kontextes ist, erstellt und eingesetzt +vom @code{New_fingering_engraver}. + +Die Eigenschaft kann als Wert eine Liste mit einem bis drei Einträgen +haben. Damit wird bestimmt, ob Fingersatz oberhalb gesetzt +werden kann (wenn @code{up} in der Liste auftaucht), darunter +(wenn@code{down} auftaucht), links (wenn @code{left} auftaucht) +oder rechts (wenn @code{right} auftaucht). Wenn andererseits +ein Wert nicht auftaucht, wir auch kein Fingersatz in dieser Richtung +gesetzt. LilyPond nimmt diese Beschränkung als Bedingung und +errechnet die besten Positionen für die Noten des nächsten Akkordes. +Die seitliche Positionierung kann nur auf einer Seite des Akkordes +geschehen, nicht auf beiden gleichzeitig, es kann also nur entweder +@code{left} oder @code{right} auftreten, nicth beide gleichzeitig. + +@warning{Damit eine einzelne Note mit diesem Befehl beeinflusst werden +kann, muss sie als ein @qq{Ein-Noten-Akkord} geschrieben +werden, indem einfache spitze Klammern um die Note positioniert +werden.} + +Hier ein paar Beispiele: + +@cindex Fingersatz-Beispiel +@cindex @code{\set}, Benutzungsbeispiel +@cindex fingerOrientations-Eigenschaft, Beispiel + +@lilypond[quote,verbatim,relative=1] +\set fingeringOrientations = #'(left) + +< c-1 e-2 g-3 b-5 > 4 +\set fingeringOrientations = #'(left) + +< c-1 e-2 g-3 b-5 > 4 +\set fingeringOrientations = #'(up left down) + +< c-1 e-2 g-3 b-5 > 4 +\set fingeringOrientations = #'(up left) + +< c-1 e-2 g-3 b-5 > 4 +\set fingeringOrientations = #'(right) + +< c-1 e-2 g-3 b-5 > 4 +@end lilypond + +@noindent +Wenn die Fingersatzbezeichnung zu gedrungen aussieht, +kann auch die Schriftgröße (@code{font-size}) verringert +werden. Der Standardwert kann aus dem +@code{Fingering}-Objekt in der IR entnommen werden, +er ist @code{-5}, versuchen wir es also mit @code{-7}. + +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +\override Fingering #'font-size = #-7 +\set fingeringOrientations = #'(left) + +< c-1 e-2 g-3 b-5 > 4 +\set fingeringOrientations = #'(left) + +< c-1 e-2 g-3 b-5 > 4 +\set fingeringOrientations = #'(up left down) + +< c-1 e-2 g-3 b-5 > 4 +\set fingeringOrientations = #'(up left) + +< c-1 e-2 g-3 b-5 > 4 +\set fingeringOrientations = #'(right) + +< c-1 e-2 g-3 b-5 > 4 +@end lilypond + + + +@node Outside-staff objects +@subsection Outside-staff objects + +Objekte außerhalb des Notensystems werden automatisch gesetzt, +um Kollisionen zu vermeiden. Objekten mit einem geringeren +Prioritätswert der Eigenschaft @code{outside-staff-priority} +werden näher an das System gesetzt, und andere Objekte außerhalb +des Systems werden dann soweit vom System entfernt gesetzt, dass +Zusammenstöße vermieden werden. Die +@code{outside-staff-priority}-Eigenschaft ist im +@code{grob-interface} definiert und ist also eine Eigenschaft +von allen Layout-Objekten. Standardmäßig ist sie für alle Objekte +auf falsch (@code{#f}) gesetzt; dieser Wert wird in einen numerischen +Wert dem Objekt entsprechend geändert, wenn das Objekt für die +Notenausgabe erstellt wird. Die Tabelle unten zeigt die +Standardwerte für die meistbenutzten @code{outside-staff}-Objekte, +die den Voreinstellungen nach im +@code{Staff}- oder @code{Voice}-Kontext gesetzt werden. + +@multitable @columnfractions .3 .3 .3 +@headitem Layout-Objekt + @tab Priorität + @tab Kontrolliert Position von: +@item @code{MultiMeasureRestText} + @tab @code{450} + @tab Text über Ganztaktpausen +@item @code{TextScript} + @tab @code{450} + @tab Textbeschriftung +@item @code{OttavaBracket} + @tab @code{400} + @tab Ottava (Oktavierungsklammern) +@item @code{TextSpanner} + @tab @code{350} + @tab Text-Strecker +@item @code{DynamicLineSpanner} + @tab @code{250} + @tab Alle Dynamik-Bezeichnungen +@item @code{VoltaBracketSpanner} + @tab @code{100} + @tab Volta-Klammern +@item @code{TrillSpanner} + @tab @code{50} + @tab Triller-Strecker +@end multitable + +Hier ein Beispiel, das die Standardpositionierung von einigen +Objekten zeigt. + +@cindex Text-Strecker +@cindex Text-Spanner +@funindex \startTextSpan +@funindex \stopTextSpan +@funindex startTextSpan +@funindex stopTextSpan +@cindex Ottava-Klammer +@cindex Oktavierungsklammer + +@cindex TextSpanner, Beispiel zur Veränderung +@cindex bound-details-Eigenschaft, Beispiel + +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +% Set details for later Text Spanner +\override TextSpanner #'(bound-details left text) + = \markup { \small \bold Slower } +% Place dynamics above staff +\dynamicUp +% Start Ottava Bracket +\ottava #1 +c' \startTextSpan +% Add Dynamic Text +c\pp +% Add Dynamic Line Spanner +c\< +% Add Text Script +c^Text +c c +% Add Dynamic Text +c\ff c \stopTextSpan +% Stop Ottava Bracket +\ottava #0 +c, c c c +@end lilypond + +Dieses Beispiel zeigt auch, wie man Text-Strecker erstellt, d.h. +Text mit Bindestrichen, der sich über eine bestimmte Länge +erstreckt. Der Strecker beginnt mit dem +@code{\startTextSpan}-Befehl und endet mit dem +@code{\stopTextSpan}-Befehl, und das Format des Textes +wird mit dem @code{\override TextSpanner}-Befehl bestimmt. +Mehr Einzelheiten siehe @ruser{Text spanners}. + +Im Beispiel wird auch gezeigt, wie Oktavierungsklammern +(Ottava) erstellt werden. + +@cindex Taktzahlposition verändern +@cindex Verändern der Taktzahlposition +@cindex Position der Taktzahl, verändern +@cindex Metronom-Bezeichnungsposition verändern +@cindex Verändern der Metronom-Bezeichnungsposition +@cindex Übungszeichenposition verändern +@cindex Verändern der Übungszeichenposition + +Beachten Sie, dass Taktnummern, Metronombezeichnungen +und Übungszeichen nicht gezeigt werden. Sie werden +standardmäßig im @code{Score}-(Partitur)-Kontext +erstellt und ihre @code{outside-staff-priority} wird +in Bezug auf die Layout-Objekte, die im @code{Staff}-Kontext +erstellt werden, ignoriert. Wenn Sie Taktnummern, +Metronombezeichnungen oder Übungszeichen entsprechend +ihrer Außersystem-Priorität setzen wollen, müssen Sie +die entsprechenden Engraver (@code{Bar_number_engraver}, +@code{Metronome_mark_engraver} oder @code{Mark_engraver}) +vom @code{Score}-Kontext entfernen und dem +@code{Staff}-Kontext hinzufügen. Wenn die Engraver so +geändert werden, erhalten sie folgenden Werte für +@code{outside-staff-priority}: + +@multitable @columnfractions .3 .3 +@headitem Layout-Objekt @tab Priorität +@item @code{RehearsalMark} @tab @code{1500} +@item @code{MetronomeMark} @tab @code{1000} +@item @code{BarNumber} @tab @code{ 100} +@end multitable + +Wenn die Standardwerte der @code{outside-staff-priority} nicht +die Positionierung hervorrufen, die Sie wünschen, kann die +Priorität eines jeden Objektes geändert werden. Als Beispiel +wollen wir zeigen, wie sich die Oktavierungsklammer unter +den Textstrecker des vorigen Beispiels setzen lässt. Wir müssen +nur die Priorität des +@code{OttavaBracket}-Objektes in der IR oder der Tabelle oben +herausfinden und einen kleineren Wert angeben als der Wert, den +das @code{TextSpanner}-(Strecker)-Objekt bekommt, wobei noch daran +zu denken ist, dass @code{OttavaBracket} im @code{Staff}-Kontext +erstellt wird: + +@cindex TextSpanner, Beispiel zur Veränderung +@cindex bound-details-Eigenschaft, Beispiel + +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +% Set details for later Text Spanner +\override TextSpanner #'(bound-details left text) + = \markup { \small \bold Slower } +% Place dynamics above staff +\dynamicUp +%Place following Ottava Bracket below Text Spanners +\once \override Staff.OttavaBracket #'outside-staff-priority = #340 +% Start Ottava Bracket +\ottava #1 +c' \startTextSpan +% Add Dynamic Text +c\pp +% Add Dynamic Line Spanner +c\< +% Add Text Script +c^Text +c c +% Add Dynamic Text +c\ff c \stopTextSpan +% Stop Ottava Bracket +\ottava #0 +c, c c c +@end lilypond + +@cindex Legatobögen und outside-staff-priority +@cindex Legatobögen und Artikulationszeichen +@cindex Artikulationszeichen und Legatobögen + +Legatobögen werden als Innersystem-Objekte klassifiziert, aber +sie erscheinen oft auch über dem System, wenn die Noten, an die +sie verbunden sind, sehr hoch im System notiert sind. Dadurch +können Außersystem-Objekte, wie Artikulationszeichen, zu hoch +gerückt werden. Die @code{avoid-slur}-Eigenschaft hat nur +eine Auswirkung, wenn auch die @code{outside-staff-priority} +auf @code{#f} gesetzt ist. Alternativ kann die +@code{outside-staff-priority} des Legatobogens auf einen +numerischen Wert gesetzt werden, sodass er mit anderen +Außersystem-Objekten anhand dieses Wertes gesetzt wird. +Hier ein Beispiel, das die beiden Möglichkeiten veranschaulicht: + +@lilypond[quote,verbatim,relative=2] +c4( c^\markup\tiny\sharp d4.) c8 +c4( +\once \override TextScript #'avoid-slur = #'inside +\once \override TextScript #'outside-staff-priority = ##f +c^\markup\tiny\sharp d4.) c8 +\once \override Slur #'outside-staff-priority = #500 +c4( c^\markup\tiny\sharp d4.) c8 +@end lilypond + +Eine Änderung der @code{outside-staff-priority} kann auch dazu +benutzt werden, die vertikale Plazierung von individuellen Objekten +zu kontrollieren, auch wenn das Ergebnis nicht immer optimal +ist. Im nächsten Beispiel soll @qq{Text3} oberhalb von @qq{Text4} +gesetzt werden, das Beispiel wurde behandelt in +@ref{Automatic behavior}. Der Wert der Priorität muss also für +die Eigenschaft @code{TextScript} entweder in der IR oder in der +Tabelle oben festgestellt werden und dann die Priorität für +@qq{Text3} höher eingestellt werden: + +@cindex TextScript, Beispiel zur Veränderung +@cindex outside-staff-priority-Eigenschaft, Beispiel + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +c2^"Text1" +c^"Text2" +\once \override TextScript #'outside-staff-priority = #500 +c^"Text3" +c^"Text4" +@end lilypond + +Damit wird zwar @qq{Text3} ganz richtig über @qq{Text4} +platziert, aber auch über @qq{Text2}, und @qq{Text4} +wird jetzt weiter unten gesetzt. Eigentlich sollten ja alle +diese Anmerkungen gleichweit vom System entfernt sein. +Dazu muss offensichtlich horizontal etwas Platz gemacht +werden. Das kann erreicht werden mit dem +@code{textLengthOn}-(Textlänge an)-Befehl. + +@subheading \textLengthOn + +@cindex Noten, durch Text gespreizt +@funindex \textLengthOn +@funindex textLengthOn +@funindex \textLengthOff +@funindex textLengthOff + +Standardmäßig wird Text, der mit dem Beschriftungsbefehl +@code{\markup} bzw. Äquivalenten erstellt wird, kein +zusätzlicher Platz in Bezug auf die Positionierung der Noten +zugestanden. Der @code{\textLengthOn}-Befehl ändert +dieses Verhalten, so dass die Noten gespreizt werden, wenn +die Breite des Textes es erfordert: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +\textLengthOn % Cause notes to space out to accommodate text +c2^"Text1" +c^"Text2" +c^"Text3" +c^"Text4" +@end lilypond + +Dieses Verhalten wird mit dem @code{\textLengthOff}-Befehl +rückgängig gemacht. Erinnern Sie sich, dass @code{\once} nur mit +@code{\override}, @code{\set}, @code{\revert} oder @code{unset} +funktioniert, der Befehl kann also nicht zusammen mit +@code{\textLengthOn} benutzt werden. + +@cindex Textbeschriftung, Vermeidung von Zusammenstößen +@cindex Zusammenstöße vermeiden mit Textbeschriftung + +Textbeschriftung vermeidet auch Noten, die über das System hinausstehen. +Wenn das nicht gewünscht ist, kann die automatische Verschiebung +nach oben hin auch vollständig ausgeschaltet werden, indem die +Priorität auf @code{#f} gesetzt wird. Hier ein Beispiel, wie +eine Textbeschriftung mit diesen Noten reagiert: + +@cindex Textbeschriftung, Beispiel zur Veränderung +@cindex outside-staff-priority-Eigenschaft, Beispiel + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +% This markup is short enough to fit without collision +c2^"Tex" +c''2 +R1 +% This is too long to fit, so it is displaced upwards +c,,2^"Text" +c''2 +R1 +% Turn off collision avoidance +\once \override TextScript #'outside-staff-priority = ##f +c,,2^"Long Text " +c''2 +R1 +% Turn off collision avoidance +\once \override TextScript #'outside-staff-priority = ##f +\textLengthOn % and turn on textLengthOn +c,,2^"Long Text " % Spaces at end are honored +c''2 +@end lilypond + + +@subheading Dynamics + +@cindex Verändern der Positionierung von Dynamikzeichen +@cindex Dynamikzeichen: Positionierung verändern + +Dynamikbezeichnung wird üblicherweise unter dem System +gesetzt, kann aber auch nach oben mit dem Befehl +@code{dynamicUp} gezwungen werden. Die Bezeichnung +wird vertikal relativ zu der Note positioniert, an die sie angefügt +wurde. Sie wird vertikal variabel gesetzt in Bezug zu +Innersystemobjekten wie Bögen oder Taktnummern. Damit +können oft recht gute Resultate erreicht werden, wie im +folgenden Beispiel: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +\clef "bass" +\key aes \major +\time 9/8 +\dynamicUp +bes4.~\f\< \( bes4 bes8 des4\ff\> c16 bes\! | +ees,2.~\)\mf ees4 r8 | +@end lilypond + +Wenn aber Noten und Dynamikzeichen sehr dicht beieinander +stehen, positioniert die automatische Kollisionsvermeidung +später kommende Dynamikzeichen weiter weg, was allerdings +nicht immer die beste Möglichkeit ist, wie in dem folgenden, +etwas gewollten Beispiel zu sehen ist: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +\dynamicUp +a4\f b\mf c\mp b\p +@end lilypond + +@noindent +Wenn eine ähnliche Situation in @qq{echter} Musik auftaucht, +kann es nötig sein, die Noten etwas zu spreizen, damit die +Dynamikzeichen alle auf der selben vertikalen Position +gesetzt werden können. Dieses Verhalten war im Falle von +Textbeschriftungen möglich mit dem @code{\textLengthOn}-Befehl, +aber es gibt keinen entsprechenden Befehl für Dynamik. Wir +müssen also unsere eigenen Befehle mit @code{\override} +konstruieren. + + +@subheading Grob sizing + +@cindex Grob, Größenveränderung +@cindex Größenveränderung von grobs + +Zuallererst müssen wir lernen, wie die Größe von Grobs verändert +wird. Alle Grobs besitzen einen Referenzpunkt, der +benutzt wird, um ihre Position in Relation zu ihnen übergeordneten +Objekten zu bestimmen. Dieser Punkt innerhalb des Grobs wird dann +auf einer horizontalen Position (@code{X-offset}) und einer +vertikalen Position (@code{Y-offset}) ausgerichtet, immer bezüglich +des übergeordneten Objektes. Eine horizontale Strecke wird +durch ein Zahlenpaar angegeben (@code{X-extent}), welche +die linke und rechte Grenze relativ zum übergeordneten Objekt +bezeichnen. Die vertikale Strecke wir genauso durch ein +Zahlenpaar (@code{Y-extent}) definiert. Diese Eigenschaften +gehören zu allen Grobs, die das +@code{grob-interface} unterstützen. + +@cindex @code{extra-spacing-width} + +Standardmäßig haben Außersystemobjekte eine Länge von Null, +so dass sie sich in horizontaler Richtung überlappen können. Das +geschieht, indem dem linken Rand Unendlich zugewiesen wird +und dem rechten Rand minus Undendlich (der Code der +@code{extra-spacing-width}-(zusätzliche Positionierungslänge)-Eigenschaft +lautet: @code{'(+inf.0 . -inf.0)}). +Damit sich diese Objekte also horizontal nicht überschneiden, muss +der Wert von @code{extra-spacing-width} auf +@code{'(0 . 0)} gesetzt werden, sodass die wirkliche Länge eines +Objektes zur Geltung kommt. Mit diesem Befehl wird das für +Dynamik-Zeichen erledigt: + +@example +\override DynamicText #'extra-spacing-width = #'(0 . 0) +@end example + +@noindent +Schauen wir uns an, wie es mit dem vorigen Beispiel funktioniert: + +@cindex DynamicText, Beispiel zur Veränderung +@cindex extra-spacing-width-Eigenschaft, Beispiel + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +\dynamicUp +\override DynamicText #'extra-spacing-width = #'(0 . 0) +a4\f b\mf c\mp b\p +@end lilypond + +@noindent +Damit werden die Dynamik-Zeichen also wirklich nebeneinander +gesetzt, aber es gibt noch zwei Probleme. Die Zeichen sollten +etwas weiter außeinander stehen und es wäre gut, wenn sie alle +den gleichen Abstand zum System hätte. Das erste Problem ist +einfach behoben. Anstatt der @code{extra-spacing-width}-Eigenschaft +Null zuzuweisen, können wir auch einen etwas größeren Wert +wählen. Die Einheit wird gemessen in dem Abstand zwischen zwei +Notenlinien, es scheint also gut, den rechten und linken +Rand eine halbe Einheit zu vergrößern: + +@cindex DynamicText, Beispiel zur Veränderung +@cindex extra-spacing-width-Eigenschaft, Beispiel + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +\dynamicUp +% Extend width by 1 staff space +\override DynamicText #'extra-spacing-width = #'(-0.5 . 0.5) +a4\f b\mf c\mp b\p +@end lilypond + +@noindent +Das sieht schon besser aus, aber es wäre noch besser, wenn die +Dynamik-Zeichen alle an einer Linie ausgerichtet wären, anstatt +höher und tiefer zu sitzen. Das kann mit der +@code{staff-padding}-Eigenschaft erreicht werden, +die wir uns im folgenden Abschnitt genauer anschauen werden. + + + +@node Collisions of objects +@section Collisions of objects + +@menu +* Moving objects:: +* Fixing overlapping notation:: +* Real music example:: +@end menu + +@node Moving objects +@subsection Moving objects + +@cindex Verschieben von überschneidenden Objekten +@cindex Verschieben von Zusammenstößen +@cindex Zusammenstöße vermeiden +@cindex Objekte, verschieben von Zusammestößen +@cindex Vermeiden von Zusammenstößen + +Es wird vielleicht eine Überraschung sein, aber LilyPond ist nicht +perfekt. Einige Notationselemente können sich überschneiden. Das +ist nicht schön, aber zum Glück sehr selten. Normalerweise müssen +die Objekte zur Klarheit oder aus ästhetischen Gründen verschoben +werden -- sie könnten besser aussehen, wenn sie etwas zusätzlichen +Platz erhalten. + +Es gibt im Grunde drei Herangehensweisen, überlappende Notation +zu verbessern. Man sollte sie in der folgenden Reihenfolge +anwenden: + +@enumerate +@item +Die @strong{Richtung} eines der überlappenden Objekte kann +geändert werden, indem die vordefinierten Befehle für +Innersystemobjekte verwendet werden, wie beschrieben in +@ref{Within-staff objects}. Hälse, Bögen, Balken, Dynamik-Zeichen +und Triolen können auf diese Weise einfach umgeordnet +werden. Beschränkt ist diese Methode insofern, als es nur +zwei Möglichkeiten zur Veränderung gibt: oben oder unten. + +@item +Die @strong{Objekteigenschaft}, die LilyPond benutzt um die +Layout-Objekte zu platzieren, können mit dem +@code{\override}-Befehl positioniert werden. Die Vorteile +von Änderungen dieser Art sind a) dass einige Objekte +automatisch verschoben werden, wenn es nötig ist Platz zu +schaffen und b) ein einziges @code{\override} sich auf +alle Fälle eines Objekttyps bezieht. Zu diesen Eigenschaften +gehören: + +@itemize + +@item +@code{direction} (Richtung) + +Das wurde schon detailliert behandelt, siehe +@ref{Within-staff objects}. + +@item +@code{padding}, @code{left-padding}, +@code{right-padding}, @code{staff-padding} (Verschiebung) + +@cindex left-padding-Eigenschaft +@cindex Padding-Eigenschaft +@cindex right-padding-Eigenschaft +@cindex staff-padding-Eigenschaft +@cindex Verschieben (padding) +@cindex Füllung (padding) +@cindex padding (Füllung) + +Wenn ein Objekt platziert wird, bestimmt der Wert seiner +@code{padding}-(Füllungs)-Eigenschaft die Größe des +Abstandes, der zwischen dem Objekt selber und dem +Objekt, relativ zu welchem es positioniert wird, gelassen +werden muss. Dabei zählt der @code{padding}-Wert +des Objektes, das platziert werden soll, der @code{padding}-Wert +des Objektes, das schon gesetzt wurde, wird hingegegen +ignoriert. Abstände mit @code{padding} können zu +allen Objekten hinzugefügt werden, die das +@code{side-position-interface} unterstützen. + +Anstelle von @code{padding} wird die Position von +Versetzungszeichengruppen durch die Eigenschaften +@code{left-padding} und @code{right-padding} bestimmt. +Diese Eigenschaften werden im +@code{AccidentalPlacement}-(Versetzungszeichen-Positionierungs)-Objekt +gefunden, das sich innerhalb des @strong{Staff}-Kontexts +befindet. Während des Notensatzes werden die Notenköpfe +zuerst gesetzt und dann die Versetzungszeichen, wenn denn +welche gesetzt werden, durch die @code{right-padding}-Eigenschaft +auf die linke Seite der Notenköpfe positioniert, um die Entfernung +von den Notenköpfen zu bestimmen. Also nur die +@code{right-padding}-(Verschiebung nach rechts)-Eigenschaft des +@code{AccidentalPlacement}-Objekts hat Einfluss auf die +Positionierung der Versetzungszeichen. + +Die @code{staff-padding}-(Verschiebung zum System)-Eigenschaft +ist sehr ähnlich wie die @code{padding}-Eigenschaft: +@code{padding} bestimmt den Minimalabstand zwischen +einem Objekt, das das @code{side-position-interface} +unterstützt, und dem nächsten anderen Objekt (normalerweise +die Note oder Notenlinie); @code{staff-padding} dagegen +wirkt nur auf Objekte die immer außerhalb des Notensystems +sind -- damit wird der minimale Abstand bestimmt, der +zwischen dem Objekt und dem Notensystem gelassen werden +soll. @code{staff-padding} hat also @strong{keinen Einfluss} +auf Objekte, die relativ zu einer Note positioniert werden, sondern +nur auf solche, die zum System relativ stehen. Wenn es mit einem +anderen Objekt eingesetzt wird, erhält man keine Fehlermeldung, aber +der Befehl hat auch keine Auswirkungen. + +Um herauszufinden, welche @code{padding}-Eigenschaft für +das bestimmte Objekt nötig, ist, das Sie verschieben wollen, +müssen Sie in der IR nach den Objekt-Eigenschaften schauen. +Dabei sollten Sie bedenken, dass sich die @code{padding}-Eigenschaften +nicht unbedingt in dem Objekt selber befinden, schauen Sie +also auch in Objekten nach, die offensichtlich Ähnlichkeiten +haben. + +Alle @code{padding}-Werte werden in Notenlinienabständen +gemessen. Für die meisten Objekte ist der Wert ungefähr auf +1.0 oder weniger gesetzt (das variiert von Objekt zu Objekt). +Der Wert kann geändert werden, wenn ein größerer (oder +kleinerer) Abstand gewünscht wird. + +@item +@code{self-alignment-X} (Selbstpositionierung) + +@cindex self-alignment-X-Eigenschaft +@cindex Selbstpositionierung von Objekten +@cindex Ausrichtung von Objekten + +Diese Eigenschaft kann benutzt werden, um ein Objekt +nach links, rechts oder zentriert an dem Referenzpunkt des Objekts +auszurichten, an das es verknüpft ist. Es kann bei allen +Objekten benutzt werden, die das @code{self-alignment-interface} +unterstützen. Das sind üblicherweise Objekte, die Text +enthalten. Die möglichen Werte der Eigenschaft sind @code{LEFT}, +@code{RIGHT} oder @code{CENTER}. Alternativ kann ein +numerischer Wert zwischen @code{-1} und @code{+1} +bestimmt werden: @code{-1} heißt linksbündig, @code{+1} +rechtsbündig und Zahlen dazwischen bewegen den Text +schrittweise von links nach rechts. Zahlen größer als +@code{1} können angegeben werdne, um den Text +noch weiter nach links zu bewegen, oder weniger als @code{-1}, +um ihn weiter nach rechts zu schieben. Eine Änderung +um @code{1} des Wertes entspricht einer Bewegung um +die halbe Textbreite. + +@item +@code{extra-spacing-width} (zusätzliche Breite) + +@cindex extra-spacing-width-Eigenschaft + +Diese Eigenschaft steht für alle Objekte zur Verfügung, die +das @code{item-interface} unterstützen. Es braucht zwei +Zahlen als Argument, die erste wird zur rechten Ausdehnung, +die zweite zur linken Ausdehnung hinzugerechnet. Negative +Zahlen verschieben die Ausdehnung nach rechts, positive nach +links, um also ein Objekt zu verbreitern, muss die erste +Zahl negativ und die zweite positiv sein. Allerdings beachten +nicht alle Objekte beide Zahlen. Das +@code{accidental}-(Versetzungszeichen)-Objekt etwa beachtet +nur erste Zahl für die linke Ausdehnung. + +@item +@code{staff-position} (Notensystempositionierung) + +@cindex staff-position-Eigenschaft + +@code{staff-position} ist eine Eigenschaft des +@code{staff-symbol-referencer-interface}, die von Objekten unterstützt +wird, die relativ zum Notensystem (engl. staff) positioniert werden. +Hiermit wird die vertikale Position eines Objekts relativ zur +Mittellinie des Systems in halben Notenlinienabständen angegeben. +Das ist sehr nützlich, um Zusammenstöße zwischen Layout-Objekten +wie Ganztaktpausen, Bögen und Noten in verschiedenen Stimmen +zu lösen. + +@item +@code{force-hshift} (vertikale Verschiebung erzwingen) + +@cindex force-hshift-Eigenschaft + +Eng beeinander stehende Noten in einem Akkord oder Noten, die zum +gleichen Zeitpunkt in unterschiedlichen Stimmen stehen, werden +in zwei oder manchmal auch mehr Kolumnen gesetzt, um Kollisionen +zu umgehen. Diese Kolumnen werden Notenkolumnen genannt; +ein @code{NoteColumn}-Objekt wird erstellt um die Noten in den +Kolumnen zu setzen. + +Die @code{force-hshift}-(erzwinge horizontale Verschiebung)-Eigenschaft +ist eine Eigenschaft von @code{NoteColumn} (bzw. vom +@code{note-column-interface}). Eine Veränderung dieser Eigenschaft +macht es möglich, eine Notenkolumne zu verschieben, dabei gilt als +Einheit die Breite einer Kolumne, also die Breite des Notenkopfes der +ersten Stimme. Diese Eigenschaft kann in Situationen benutzt werden, +in denen die normalen @code{\shiftOn}-Befehle (siehe auch +@ref{Explicitly instantiating voices}) das Problem nicht beseitigen. +Diese Eigenschaft ist besser in solchen Fällen zu verwenden als die +@code{extra-offset}-Eigenschaft, weil man die richtige Entfernung nicht +in Notenlinienabständen ausrechnen muss. Wenn eine Note in eine +Notenkolumne oder aus ihr heraus geschoben wird, werden auch andere +Funktionen beeinflusst, wie etwa die Verschmelzung von Notenköpfen. + +@end itemize + +@item +Zu guter Letzt, wenn alles andere nicht funktioniert, können Objekte auch +manuell positioniert werden, entweder vertikal in Bezug auf die +Mittellinie des Systems, oder indem sie einen beliebigen Abstand weit +auf eine neue Position verschoben werden. Der Nachteil ist, dass die +richtigen Werte für eine gute Position manuell ausprobiert werden müssen, +meistens durch Herantasten an den richtigen Wert, und das für jedes +einzelne Objekt extra. Und weil diese Verschiebungen erst vorgenommen +werden, wenn LilyPond alle anderen Objekte gesetzt hat, ist man als +Notensetzer selber dafür verantwortlich, ob es Zusammenstöße gibt. +Am schwerwiegendsten ist aber die Tatsache, dass die +Verschiebungskoordinaten wahrscheinlich neu errechnent oder +ausprobiert werden müssen, wenn sich an den Noten und deren +Layout später irgend etwas ändert. Die Eigenschaften, die für diese +Arte der manuellen Verschiebung verwendet werden können, sind: + +@table @code +@item extra-offset (zusätzlicher Abstand) + +@cindex extra-offset-Eigenschaft + +Diese Eigenschaft gehört zu jedem Layout-Objekt, das das +@code{grob-interface} unterstützt. Sie braucht ein Zahlenpaar, +das die exakte Verschiebung in horizontaler und vertikaler Richtung +bezeichnet. Negative Zahlen verschieben das Objekt nach links oder +unten. Die Einheit sind Notenlinienabstände. Die zusätzliche +Positionierung wird vorgenommen, nachdem alle anderen Objekte +platziert sind, weshalb ein Objekt irgendwohin verschoben werden +kann, ohne den restlichen Satz zu beeinflussen. + +@item positions (Position) + +@cindex positions-Eigenschaft + +Diese Eigenschaft ist am sinnvollsten, um die Steigung und die +Höhe von Balken, Bögen und Triolenklammern anzupassen. +Sie braucht ein Zahlenpaar, das die Position des rechten und linken +Endes relativ zur Mittellinie des Notensystems bestimmt. Die +Einheit sind Notenlinienabstände. Bögen allerdings können nicht +beliebig weit weg positioniert werden. LilyPond erstellt zunächst eine +Liste an möglichen Positionen für den Bogen und findet normalerweise +die Version, die @qq{am besten aussieht}. Wenn die +@code{positions}-Eigenschaft verändert worden ist, wird der +Bogen aus der Liste gewählt, der der gewünschten Position am +nächsten kommt. +@end table + +@end enumerate + +Ein bestimmtes Objekt hat vielleicht nicht alle dieser Eigenschaften. +Darum ist es nötig, in der IR nachzuschlagen, welche Eigenschaften +ein bestimmtes Objekt unterstützt. + +Hier ist eine Liste an Objekten, die am wahrscheinlichsten an einer +Kollision beteiligt sind, daneben findet sich die Bezeichnung des +Objektes, mit der Sie es in der IR finden, um zu bestimmen, +welche Eigenschaften benutzt werden können, um es zu verschieben. + +@multitable @columnfractions .5 .5 +@headitem Objekttyp @tab Objektbezeichnung +@item Articulationszeichen @tab @code{Script} +@item Balken @tab @code{Beam} +@item Dynamikzeichen (vertikal) @tab @code{DynamicLineSpanner} +@item Dynamikzeichen (horizontal) @tab @code{DynamicText} +@item Fingersatz @tab @code{Fingering} +@item Übungs-/Textmarken @tab @code{RehearsalMark} +@item Legatobögen @tab @code{Slur} +@item Text z. B. @code{^"text"} @tab @code{TextScript} +@item Bindebögen @tab @code{Tie} +@item N-tolen @tab @code{TupletBracket} +@end multitable + + +@node Fixing overlapping notation +@subsection Fixing overlapping notation + +Hier soll nun gezeigt werden, wie die Eigenschaften, die im +vorigen Abschnitt vorgestellt wurden, bei der Problemlösung +mit sich überschneidenden Notationselementen eingesetzt +werden können. + +@subheading padding property + +@cindex padding (Verschiebungs-Eigenschaft) +@cindex Überschneidende Notation korrigieren +@cindex Korrigieren von überschneidender Notation + +Die @code{padding}-(Verschiebungs-)Eigenschaft kann benutzt +werden, um den Abstand zwischen Symbolen zu vergößern (oder +zu verkleinern), die über oder unter den Noten gesetzt werden. + +@cindex Script, Beispiel zur Veränderung +@cindex Verschiebungs-Eigenschaft, Beispiel +@cindex padding (Verschiebuns-Eigenschaft), Beispiel + +@lilypond[quote,fragment,relative=1,verbatim] +c2\fermata +\override Script #'padding = #3 +b2\fermata +@end lilypond + +@cindex MetronomMark, Beispiel zur Veränderung +@cindex Verschiebungs-Eigenschaft, Beispiel +@cindex padding (Verschiebuns-Eigenschaft), Beispiel + +@lilypond[quote,fragment,relative=1,verbatim] +% This will not work, see below: +\override MetronomeMark #'padding = #3 +\tempo 4=120 +c1 +% This works: +\override Score.MetronomeMark #'padding = #3 +\tempo 4=80 +d1 +@end lilypond + +Im zweiten Beispiel können Sie sehen, wie wichtig es ist den richtigen +Kontext anzugeben. Weil das @code{MetronomeMark}-Objekt +sich im @code{Score}-Kontext befindet, werden Eigenschaftsänderungen +im @code{Voice}-Kontext einfach ignoriert. Für mehr Einzelheiten siehe +@ruser{Modifying properties}. + +Wenn die @code{padding}-Eigenschaft eines Objektes erhöht wird, das +sich in einem Stapel von Objekten befindet, die nach ihrer +Außersystempriorität (@code{outside-staff-priority}) positioniert werden, +werden das Objekt und alle, die sich außerhalb davon befinden, +entsprechend verschoben. + +@subheading left-padding and right-padding + +@cindex left-padding-Eigenschaft (Verschiebung nach links) +@cindex Verschiebung nach rechts oder links +@cindex right-padding-Eigenschaft (Verschiebung nach rechts) + +Die @code{right-padding}-Eigenschaft wirkt sich auf den Abstand +zwischen einem Versetzungszeichen und der Note, auf das sie sich +bezieht, aus. Sie wird nicht sehr oft benötigt, aber das folgende +Beispiel zeigt eine Situation, wo man sie braucht. Das Beispiel +stellt eine Situation dar, in der in einem Akkord sowohl H als auch +B vorkommen sollen. Damit keine Ambiguität ensteht, sollen beide +Noten ein Zeichen haben, also ein B und ein Auflösungszeichen. +Hier einige Notationsversuche: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] + + + +@end lilypond + +@noindent +Keiner davon funktioniert, und der zweite und dritte weist +hässliche Zusammenstöße zwischen den Zeichen auf. + +Eine Möglichkeit, das Gewünschte zu erhalten, ist es den +Stencil des Versetzungszeichens zu ersetzen mit einer +Textbeschriftung (Markup), die sowohl das B als auch das +Aulösungszeichen enthält: + +@cindex Versetzungszeichen, Beispiel zur Veränderung +@cindex Accidental, Beispiel zur Veränderung +@cindex Text-Eigenschaft, Beispiel +@cindex stencil-Eigenschaft, Beispiel +@cindex AccidentalPlacement, Beispiel zur Veränderung +@cindex right-padding-Eigenschaft, Beispiel +@cindex Verschiebung nach rechts (rigth-padding), Beispiel + +@lilypond[quote,ragged-right,verbatim] +naturalplusflat = \markup { \natural \flat } +\relative c'' { + \once \override Accidental + #'stencil = #ly:text-interface::print + \once \override Accidental #'text = #naturalplusflat + \once \override Score.AccidentalPlacement #'right-padding = #1.5 + +} +@end lilypond + +@noindent +Dazu ist aber ein @code{\override}-Befehl für den Stencil des +Versetzungszeichens nötig, der bisher nicht behandelt wurde. +Der Typ des Stencils muss eine Prozedur sein, die hier geändert +wurde, um den Inhalt der @code{text}-Eigenschaft des +@code{Accidental} (Versetzungszeichen)-Objekts zu setzen, +die dann so definiert wird, dass sie ein Auflösungszeichen gefolgt +von einem B enthält. Diese werden dann mit @code{right-padding} +weiter nach rechts verschoben. + + +@subheading staff-padding property + +@cindex staff-padding-Eigenschaft +@cindex Objekte an der Grundlinie ausrichten +@cindex Ausrichten von Objekten an der Grundlinie + +@code{staff-padding} (Verschiebung zum Notensystem) kann +verwendet werden um Objekte wie Dynamikzeichen an einer +Grundlinie auf einer bestimmten Höhe über dem System +auszurichten, sodass sie nicht von der Position der Note abhängen, +an die sie angehängt sind. Diese Verschiebung ist keine Eigenschaft +von @code{DynamicText}, sondern von @code{DynamicLineSpanner}. +Das liegt daran, dass die Grundlinie sich gleicherweise auf +@strong{alle} Dynamikzeichen beziehen soll, also auch auf die, +die als Strecker erstellt wurden. Hier also die Lösung, die Dynamikzeichen +aus dem Beispiel des vorigen Abschnitts auszurichten: + +@cindex DynamikText, Beispiel zur Veränderung +@cindex extra-spacing-width-Eigenschaft, Beispiel +@cindex DynamicLineSpanner, Beispiel zur Veränderung +@cindex staff-padding-Eigenschaft, Beispiel + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +\dynamicUp +% Extend width by 1 unit +\override DynamicText #'extra-spacing-width = #'(-0.5 . 0.5) +% Align dynamics to a base line 2 units above staff +\override DynamicLineSpanner #'staff-padding = #2 +a4\f b\mf c\mp b\p +@end lilypond + + +@subheading self-alignment-X property + +@cindex self-alignment-X-Eigenschaft + +Das nächste Beispiel zeigt, wie man den Zusammenstoß +einer Fingersatzbezeichnung mit einem Notenhals +verhindern kann, indem die rechte Ecke an dem +Referenzpunkt der abhängigen Note angeordnet wird: + +@cindex StringNumber, Beispiel zur Veränderung + +@lilypond[quote,fragment,ragged-right,verbatim,relative=3] +\voiceOne +< a \2 > +\once \override StringNumber #'self-alignment-X = #RIGHT +< a \2 > +@end lilypond + + +@subheading staff-position property + +@cindex staff-position-Eigenschaft +@cindex Notensystem-Position-Eigenschaft +@cindex Kollision von Objekten im System +@cindex Zusammenstöße von Objekten im System + +Vieltaktpausen in einer Stimmen können mit Noten in anderen +Stimmen kollidieren. Da diese Pausen zentriert zwischen den +Taktlinien gesetzt werden, würde es für LilyPond eine recht große +Anstrengung bedeuten herauszufinden, welche Noten mit ihnen +zusammenstoßen könnten, denn alle Kollisionsvermeidung +für Noten und Pausen funktioniert nur für Noten bzw. Pausen, die +zur selben Zeit auftreten. Hier ein typisches Beispiel für eine +Kollision dieser Art: + +@lilypond[quote,verbatim,fragment,ragged-right, relative=1] +<< {c c c c} \\ {R1} >> +@end lilypond + +Die beste Lösung ist es, die Ganztaktpause nach unten zu +schieben, denn die Pause ist in der zweiten Stimme. Per +Standardeinstellung für die zweite Stimme (@code{\voiceTwo}, +also die zweite Stimme in der +@code{<<@{...@} \\ @{...@}>>}-Konstruktion) wird die +Position auf dem System (@code{staff-position}) auf -4 +für @code{MultiMeasureRest}, in unserem Beispiel muss +es also bspw. auf die Position @code{-8} gesetzt werden, +d.h. vier halbe Notenlinienabstände weiter nach unten: + +@cindex MultiMeasureRest, Beispiel zur Veränderung +@cindex Ganztaktpausen, Beispiel zur Veränderung +@cindex staff-position-Eigenschaft, Beispiel + +@lilypond[quote,verbatim,fragment,ragged-right, relative=1] +<< + {c c c c} +\\ + \override MultiMeasureRest #'staff-position = #-8 + {R1} +>> +@end lilypond + +Das ist besser, als etwa @code{extra-offset} zu benutzen, denn +in unserem Fall wird die Hilfslinie der Pause automatisch gesetzt. + + +@subheading extra-offset property + +@cindex extra-offset-Eigenschaft +@cindex Zusätzlicher Abstand, Positionierung +@cindex Positionierung von Objekten +@cindex Objekte, Positionierung + +Die @code{extra-offset}-Eigenschaft bietet vollständige Kontrolle +über die Positionierung von Objekten in horizontaler und vertikaler +Richtung. + +Im Beispiel unten ist das zweite Fingersatzzeichen (@code{Fingering}) etwas nach +links und 1,8 Notenlinienabstände nach unten verschoben: + +@cindex Fingersatz, Beispiel zur Veränderung +@cindex extra-offset-Eigenschaft, Beispiel + +@lilypond[quote,fragment,relative=1,verbatim] +\stemUp +f-5 +\once \override Fingering + #'extra-offset = #'(-0.3 . -1.8) +f-5 +@end lilypond + + +@subheading positions property + +@cindex positions-Eigenschaft +@cindex Kontrolle über Triolen, Bögen und Balken manuell +@cindex manuelle Kontrolle über Triolen, Bögen, Balken +@cindex Balken, manuelle Kontrolle +@cindex Bögen, manuelle Kontrolle +@cindex Legatobögen, manuelle Kontrolle +@cindex Phrasierungsbögen, manuelle Kontrolle +@cindex Triollen-Klammer, manuelle Kontrolle + +Die @code{positions}-Eigenschaft erlaubt die Kontrolle von Position und +Steigung von Balken, Legato- und Phrasierungsbögen sowie Triolenklammern. +Hier ein Beispiel, in der ein unschöner Phrasierungsbogen auftritt, weil +er den Bogen des Vorschlags vermeidet: + +@lilypond[quote,verbatim,fragment,ragged-right,relative=1] +r4 \acciaccatura e8\( d8 c ~c d c d\) +@end lilypond + +@noindent +Man könnte einfach den Phrasierungsbogen oberhalb der Noten setzen, und +das wäre auch die beste Lösung: + +@cindex Phrasierungsbogen, Beispiel zur Veränderung +@cindex positions-Eigenschaft, Beispiel +@cindex Positionierung, Beispiel + +@lilypond[quote,verbatim,fragment,ragged-right,relative=1] +r4 +\phrasingSlurUp +\acciaccatura e8\( d8 c ~c d c d\) +@end lilypond + +@noindent +aber wenn es einen Grund geben sollte, warum das nicht geht, könnte +man das linke Ende des Phrasierungsbogens etwas nach unten verschieben, +indem man die @code{positions}-Eigenschaft einsetzt. Damit +verschwindet auch die etwas unschöne Form: + +@lilypond[quote,verbatim,fragment,ragged-right,relative=1] +r4 +\once \override PhrasingSlur #'positions = #'(-4 . -3) +\acciaccatura +e8\( d8 c ~c d c d\) +@end lilypond + +Hier noch ein weiteres Beispiel aus der Einleitung von Chopins +Prelude Op. 28 Nr. 2, das untere System. Wie zu sehen ist, +stößt der Balken mit den oberen Noten zusammen: + +@lilypond[quote,verbatim,fragment,ragged-right] +{ +\clef "bass" +<< {b,8 ais, b, g,} \\ {e, g e, g} >> +<< {b,8 ais, b, g,} \\ {e, g e, g} >> +} +@end lilypond + +@noindent +Das kann manuell gelöst werden, indem beide Enden des Balkens +von ihrer Position 2 Notenlinienabstände über der Mittellinie +hochgeschoben werden, etwa auf 3: + +@cindex Balken, Beispiel zur Veränderung +@cindex positions-Eigenschaft, Beispiel +@cindex Positionierung, Beispiel + +@lilypond[quote,verbatim,fragment,ragged-right] +{ + \clef "bass" + << + \override Beam #'positions = #'(3 . 3) + {b,8 ais, b, g,} + \\ + {e, g e, g} + >> + << {b,8 ais, b, g,} \\ {e, g e, g} >> +} +@end lilypond + +@noindent +Hier ist zu beobachten, dass die Veränderung sich auch auf die +weiteren Achtelbalken der ersten Stimme auwirkt, während sie keine +Auswirkung auf die Balken der zweiten Stimme hat. + +@subheading force-hshift property + +@cindex force-hshift-Eigenschaft +@cindex Vertikale Verschiebung erzwingen + +@c FIXME: formatting stuff (ie not important right now IMO) +@c @a nchor Chopin finally corrected TODOgp + +An diesem Punkt können wir den letzten Feinschliff an unserem +Chopin-Beispiel vornhemen, das wir behandelt haben in +@ref{I'm hearing Voices}. Wir hatten es in folgende Form +gebracht: + +@lilypond[quote,verbatim,fragment,ragged-right] +\new Staff \relative c'' { + \key aes \major + << + { c2 aes4. bes8 } \\ + { aes2 f4 fes } \\ + { \voiceFour + 2 + des2 + } + >> | + 1 | +} +@end lilypond + +@noindent +Die unteren zwei Noten des ersten Akkords (also diein der +dritten Stimme) sollten nicht aus der Notenkolumne der +oberen zwei Noten weggeschoben werden. Um das zu +korrigieren, setzen wir @code{force-hshift}, das eine +Eigenschaft von +@code{NoteColumn} ist, für diese Noten auf Null. +Die untere Note des zweiten Akkordes wird am besten +direkt rechts von den oberen Noten gesetzt. Das erreichen +wir, indem wir @code{force-hshift} für diese Note auf +0.5 setzen, also eine halbe Notenkopfbreite nach rechts von +der Kolumne der oberen Noten aus. + +Hier das Endergebnis: + +@cindex Notenkolumne, Beispiel zur Veränderung +@cindex force-hshift-Eigenschaft, Beispiel +@cindex vertikale Verschiebung, Beispiel + +@lilypond[quote,verbatim,fragment,ragged-right] +\new Staff \relative c'' { + \key aes \major + << + { c2 aes4. bes8 } \\ + { aes2 f4 fes } \\ + { \voiceFour + \once \override NoteColumn #'force-hshift = #0 2 + \once \override NoteColumn #'force-hshift = #0.5 des2 + } + >> | + 1 | +} +@end lilypond + + +@node Real music example +@subsection Real music example + +Das Kapitel zu Optimierungen soll mit einem komplizierten Beispiel +beendet werden, in dem verschiedene Optimierungen vorgenommen +werden müssen, bis das Ergebnis gut ausssieht. Das Beispiel wurde +ganz bewusst gewählt um die Benutzung der Notationsreferenz +zu zeigen, wenn ungewöhnliche Notationsprobleme gelöst werden +müssen. Es ist nicht repräsentativ für normale Notationsprojekte, +lassen Sie sich also nicht durch dieses Beispiel entmutigen! Zum +Glück sind Probleme wie die hier gezeigten nicht sehr häufig. + +Das Beispiel stammt aus Chopins Premiére Ballade, Op. 23, Takte +6--9, der Übergang vom Lento der Einleitung zum Moderato. +Hier zunächst der Satz, wie er aussehen soll, allerdings ohne +Dynamik, Fingersatz und Pedalbezeichnung, um das Beispiel nicht +zu kompliziert zu machen. + +@c This example should not be indexed +@lilypond[quote,ragged-right] +rhMusic = \relative c'' { + r2 + c4.\( g8 | + \once \override Tie #'staff-position = #3.5 + bes1~ | + \bar "||" + \time 6/4 + \mergeDifferentlyHeadedOn + \mergeDifferentlyDottedOn + bes2.^\markup {\bold "Moderato"} r8 + << + {c,8[ d fis bes a] | } + \\ + % Reposition the c2 to the right of the merged note + {c,8~ \once \override NoteColumn #'force-hshift = #1.0 + % Move the c2 out of the main note column so the merge will work + \shiftOnn c2} + \\ + % Stem on the d2 must be down to permit merging + {s8 \stemDown \once \override Stem #'transparent = ##t d2} + \\ + {s4 fis4.} + >> + \mergeDifferentlyHeadedOff + \mergeDifferentlyDottedOff + g2.\) +} + +lhMusic = \relative c' { + r2 2( | + 1)\arpeggio | + r2. d,,4 r4 r | + r4 +} + +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond + +Die erste Überlegung ist, dass das System für die rechte Hand +im dritten Takt vier Stimmen braucht. Das sind die fünf +Achtelnoten mit Balken, das übergebundene C, die Halbe D, die +mit der Achtel D verschmolzen ist, und die punktierte Viertel +Fis, die auch mit einer Achtelnote verschmolzen ist. Alles +andere ist eine einzige Stimme, es ist also am einfachsten, die +Stimmen nur zeitweise zu erstellen, wenn sie auftreten. Wenn +Sie vergessen haben, wie man das anstellt, schauen Sie sich +nochmal den Abschnitt @ref{I'm hearing Voices} an. Wir +wollen anfange, indem wir die Noten in zwei Variablen +notieren und dann die Systemstruktur in einer +@code{\score}-Umgebung erstellen. Das ist, was LilyPond +erstellt: + +@lilypond[quote,verbatim,ragged-right] +rhMusic = \relative c'' { + r2 c4. g8 | + bes1~ | + \time 6/4 + bes2. r8 + % Start polyphonic section of four voices + << + {c,8 d fis bes a | } + \\ + {c,8~ c2 | } + \\ + {s8 d2 | } + \\ + {s4 fis4. | } + >> + g2. +} + +lhMusic = \relative c' { + r2 2 | + 1 | + r2. d,,4 r4 r | + r4 +} + +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond + +Alle Noten sind richtig, aber die Positionierung sehr +verbesserungsbedürftig. Der Bindebogen stößt mit +der veränderten Taktart zusammen, die Balkung im +dritten Takt ist falsch, die Noten werden nicht +verschmolzen und einige Notationselemente fehlen ganz. +Behandeln wir zunächst die einfacheren Dinge. Der +Balken kann durch eine manuelle Begrenzung einfach +korrigiert werden, und auch der Legatobogen der linken +Hand und der Phrasierungsbogen der rechten Hand +sind schnell gesetzt, denn sie wurden schon in der +Übung erklärt. Damit haben wir folgendes Notenbild: + +@lilypond[quote,verbatim,ragged-right] +rhMusic = \relative c'' { + r2 c4.\( g8 | + bes1~ | + \time 6/4 + bes2. r8 + % Start polyphonic section of four voices + << + {c,8[ d fis bes a] | } + \\ + {c,8~ c2 | } + \\ + {s8 d2 | } + \\ + {s4 fis4. | } + >> + g2.\) +} + +lhMusic = \relative c' { + r2 2( | + 1) | + r2. d,,4 r4 r | + r4 +} + +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond + +Der erste Takt stimmt jetzt schon. Der zweite Takt enthält ein +Arpeggio und wird mit einer doppelten Taktlinie beschlossen. +Wie können wir diese notieren, denn sie sind im Handbuch zum +Lernen nicht vorgekommen? Hier brauchen wir jetzt die +Notationsreferenz. Ein Blick in den Index zeigt uns die +Einträge für @qq{Arpeggio} und @qq{Taktlinien}: ein +Arpeggio also erstellt man mit dem Befehl @code{\arpeggio} +hinter einem Akkord und eine doppelte Taktlinie wird mit dem +Befehl @code{\bar "||"} erstellt. Das ist einfach. Als nächstes +muss der Zusammenstoß des Bindebogens mit der Taktartbezeichnung +gelöst werden. Das geht am besten, indem wir den Bogen nach +oben verschieben. Wie man Objekte verschiebt wurde schon +behandelt in @ref{Moving objects}, wo stand, dass Objekte +die +relativ zum System positioniert werden, verschoben werden +können, indem ihre @code{staff-position}-Eigenschaft +geändert wird, die in halben Notenlienienabständen relativ +zur Mittellinie angegeben wird. Dieser @code{\override}-Befehl +also, direkt vor die erste übergebundene Note gestellt, verschiebt +den Bindebogen (@code{tie}) 3,5 halbe Notenlinienabstände +über die Mittellinie: + +@code{\once \override Tie #'staff-position = #3.5} + +Damit ist auch der zweite Takt vollständig: + +@lilypond[quote,verbatim,ragged-right] +rhMusic = \relative c'' { + r2 c4.\( g8 | + \once \override Tie #'staff-position = #3.5 + bes1~ | + \bar "||" + \time 6/4 + bes2. r8 + % Start polyphonic section of four voices + << + {c,8[ d fis bes a] | } + \\ + {c,8~ c2 | } + \\ + {s8 d2 | } + \\ + {s4 fis4. | } + >> + g2.\) +} + +lhMusic = \relative c' { + r2 2( | + 1)\arpeggio | + r2. d,,4 r4 r | + r4 +} + +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond + +In Takt drei beginnt der Moderato-Abschnitt. In der +Übung wurde behandelt, wie man fetten Text mit dem +@code{\markup}-Befehl eingibt, es ist also einfach, das +@qq{Moderato} hinzuzufügen. Wie aber werden Noten +verschmolzen? Hier nehmen wir wieder die Notationsreferenz +zu Hilfe. Die Suche nach @qq{Verschmelzen} (engl. merge) +im Index führt uns zu den Befehlen um Noten mit +unterschiedlichen Köpfen und unterschiedlichen Punkten +zu verschmelzen in @ruser{Collision resolution}. In unserem +Beispiel müssen sowohl unterschiedliche Köpfe also auch +unterschiedliche Punktierung verschmolzen werden, wir +brauchen also die Befehle + +@example +\mergeDifferentlyHeadedOn +\mergeDifferentlyDottedOn +@end example + +@noindent +aus der Notationsreferenz, die wir an den Beginn unseres +Abschnittes stellen und + +@example +\mergeDifferentlyHeadedOff +\mergeDifferentlyDottedOff +@end example + +@noindent +um das Verhalten wieder auszuschalten. Das sieht so aus: + +@cindex Bindebogen, Beispiel zur Veränderung +@cindex staff-position-Eigenschaft, Beispiel + +@lilypond[quote,verbatim,ragged-right] +rhMusic = \relative c'' { + r2 c4.\( g8 | + \once \override Tie #'staff-position = #3.5 + bes1~ | + \bar "||" + \time 6/4 + bes2.^\markup {\bold "Moderato"} r8 + \mergeDifferentlyHeadedOn + \mergeDifferentlyDottedOn + % Start polyphonic section of four voices + << + {c,8[ d fis bes a] | } + \\ + {c,8~ c2 | } + \\ + {s8 d2 | } + \\ + {s4 fis4. | } + >> + \mergeDifferentlyHeadedOff + \mergeDifferentlyDottedOff + g2.\) +} + +lhMusic = \relative c' { + r2 2( | + 1)\arpeggio | + r2. d,,4 r4 r | + r4 +} + +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond + +Mit diesen Veränderungen wurden die beiden Fis-Noten +verschmolzen, aber nicht die zwei Ds. Warum nicht? Die +Antwort befindet sich im gleicher Abschnitt der Notationsreferenz: +Noten, die verschmolzen werden, müssen Hälse in entgegengesetzte +Richtungen aufweisen und zwei Noten können nicht verschmolzen +werden, wenn eine dritte Noten in der gleichen Kolumne +stört. In unserem Fall weisen beide Hälse nach oben und es +befindet sich zur gleichen Zeit auch noch eine dritte Note, das C. +Wie die Richtung von Hälsen geändert wird, wissen wir schon: +mit @code{\stemDown}, und in der Notationsreferenz findet +sich auch Information, wie das C verschoben werden kann: mit +dem @code{\shift}-Befehl. Aber welcher von ihnen? Das C +befindet sich in der zweiten Stimme, die @qq{shift off} hat, +die zwei Ds sind in den Stimmen eins und drei, die @qq{shift +off} bzw. @qq{shift on} haben. Das C muss also noch eine +Stufe weiter verschoben werden mit @code{\shiftOnn}, damit +es die Verschmelzung der Ds nicht stört. Das sieht jetzt so +aus: + +@lilypond[quote,verbatim,ragged-right] +rhMusic = \relative c'' { + r2 c4.\( g8 | + \once \override Tie #'staff-position = #3.5 + bes1~ | + \bar "||" + \time 6/4 + bes2.^\markup {\bold "Moderato"} r8 + \mergeDifferentlyHeadedOn + \mergeDifferentlyDottedOn + % Start polyphonic section of four voices + << + {c,8[ d fis bes a] | } + \\ + % Move the c2 out of the main note column so the merge will work + {c,8~ \shiftOnn c2 | } + \\ + % Stem on the d2 must be down to permit merging + {s8 \stemDown d2 | } + \\ + {s4 fis4. | } + >> + \mergeDifferentlyHeadedOff + \mergeDifferentlyDottedOff + g2.\) +} + +lhMusic = \relative c' { + r2 2( | + 1)\arpeggio | + r2. d,,4 r4 r | + r4 +} + +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond + +Fast schon geschafft. Nur noch ein Problem ist übrig: Der Hals nach +unten des verschmolzenen sollte nicht da sein, und das C sähe +besser auf der rechten Seite des Ds aus. Beides können wir mit den +gelernten Optimierungsmethoden erreichen. Den Hals machen +wir durchsichtig und das C verschieben wir mit der +@code{force-hshift}-Eigenschaft. Hier ist das Endergebnis: + +@cindex Notenkolumne, Beispiel zur Veränderung +@cindex force-hshift-Eigenschaft, Beispiel +@cindex Hals, Beispiel zur Veränderung +@cindex Notenhals, Beispiel zur Veränderung +@cindex transparent-Eigenschaft, Beispiel + +@lilypond[quote,verbatim,ragged-right] +rhMusic = \relative c'' { + r2 + c4.\( g8 | + \once \override Tie #'staff-position = #3.5 + bes1~ | + \bar "||" + \time 6/4 + bes2.^\markup {\bold "Moderato"} r8 + \mergeDifferentlyHeadedOn + \mergeDifferentlyDottedOn + << + {c,8[ d fis bes a] | } + \\ + % Reposition the c2 to the right of the merged note + {c,8~ \once \override NoteColumn #'force-hshift = #1.0 + % Move the c2 out of the main note column so the merge will work + \shiftOnn c2} + \\ + % Stem on the d2 must be down to permit merging + {s8 \stemDown \once \override Stem #'transparent = ##t d2} + \\ + {s4 fis4.} + >> + \mergeDifferentlyHeadedOff + \mergeDifferentlyDottedOff + g2.\) +} + +lhMusic = \relative c' { + r2 2( | + 1)\arpeggio | + r2. d,,4 r4 r | + r4 +} + +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond + + +@node Further tweaking +@section Further tweaking + +@menu +* Other uses for tweaks:: +* Using variables for tweaks:: +* Other sources of information:: +* Avoiding tweaks with slower processing:: +* Advanced tweaks with Scheme:: +@end menu + +@node Other uses for tweaks +@subsection Other uses for tweaks + +@cindex Transparente Objekte +@cindex Entfernen von Objekten +@cindex Verstecken von Objekten +@cindex Unsichtbare Objekte +@cindex transparent-Eigenschaft, Benutzung +@cindex Objekte unsichtbar machen +@cindex Objekte entfernen +@cindex Objekte verstecken +@cindex Noten zwischen Stimmen überbinden +@cindex Überbinden von Noten zwischen Stimmen + +@subheading Tying notes across voices + +Das nächste Beispiel zeigt, wie man Noten von verschiedenen +Stimmen miteinander verknüpfen kann, indem man Bindebögen +für Überbindungen benutzt. Normalerweise können nur zwei +Noten der gleichen Stimme übergebunden werden. Wenn +man zwei Stimmen benutzt, wobei die überbundenen Noten +sich in der selben befinden, + +@lilypond[quote,fragment,relative=2] +<< { b8~ b8\noBeam } +\\ { b[ g8] } +>> +@end lilypond + +@noindent +und dann den ersten Hals nach oben unsichtbar macht, +sieht es so aus, als ob die Überbindung zwischen +den Stimmen stattfindet: + +@cindex Hals, Beispiel zur Veränderung +@cindex Notenhals, Beispiel zur Veränderung +@cindex transparent-Eigenschaft, Beispiel + +@lilypond[quote,fragment,relative=2,verbatim] +<< + { + \once \override Stem #'transparent = ##t + b8~ b8\noBeam + } +\\ + { b[ g8] } +>> +@end lilypond + +Um sicherzugehen, dass der unsichtbare Hals den Bindebogen +nicht zu sehr verkleinert, kann er verlängert werden, indem +seine Länge (@code{length}) auf den Wert @code{8} +gesetzt wird: + +@lilypond[quote,fragment,relative=2,verbatim] +<< + { + \once \override Stem #'transparent = ##t + \once \override Stem #'length = #8 + b8~ b8\noBeam + } +\\ + { b[ g8] } +>> +@end lilypond + + +@subheading Simulating a fermata in MIDI + +@cindex stencil-Eigenschaft, Benutzung +@cindex Fermate, Benutzung in MIDI +@cindex MIDI: Fermate erstellen + +Für Objekte außerhalb des Notensystems ist es normalerweise +besser, die @code{stencil}-Eigenschaft anstelle der +@code{transparent}-Eigenschaft zu verändern, wenn man +sie vom fertigen Notensatz entfernen will. Indem die +@code{stencil}-Eigenschaft auf falsch (@code{#f}) gesetzt +wird, wird das entsprechende Objekt vollständig entfernt. +Das bedeutet, dass es die Positionierung der anderen Objekte +nicht beeinflusst. + +Auf diese Art kann etwa das Tempo geändert werden, damit +in der MIDI-Ausgabe eine Fermate zu hören ist, ohne dass +im Notensatz etwas von diesen Tempoänderungen zu sehen +ist. Die Metronombezeichnung soll auch nicht die Position +von Text an der gleichen Stelle oder die Abstände zwischen +zwei Systemen beeinflussen. Darum ist es am besten, +@code{stencil} auf @code{#f} zu setzen. Im Beispiel wird +der Unterschied zwischen einem unsichtbaren Objekt und +einem entfernten Objekt gezeigt: + +@cindex Metronom-Bezeichnung, Beispiel zur Veränderung +@cindex transparent-Eigenschaft, Beispiel + +@lilypond[quote,verbatim,ragged-right] +\score { + \relative c'' { + % Visible tempo marking + \tempo 4=120 + a4 a a + \once \override Score.MetronomeMark #'transparent = ##t + % Invisible tempo marking to lengthen fermata in MIDI + \tempo 4=80 + a\fermata + % New tempo for next section + \tempo 4=100 + a a a a + } + \layout { } + \midi { } +} +@end lilypond + +@lilypond[quote,verbatim,ragged-right] +\score { + \relative c'' { + % Visible tempo marking + \tempo 4=120 + a4 a a + \once \override Score.MetronomeMark #'stencil = ##f + % Invisible tempo marking to lengthen fermata in MIDI + \tempo 4=80 + a\fermata + % New tempo for next section + \tempo 4=100 + a a a a + } + \layout { } + \midi { } +} +@end lilypond + +@noindent +Mit beiden Methoden wird die Tempobezeichnung entfernt, mit +der die Fermate verlängert wird, und beide beeinflussen die +MIDI-Ausgabe wie gewünscht. Die unsichtbare Metronombezeichnung +schiebt aber die folgende Bezeichnung in die Höhe, während +das im zweiten Beispiel, in dem der @code{stencil} entfernt +wurde, nicht passiert. + + +@node Using variables for tweaks +@subsection Using variables for tweaks + +@cindex Variablen, Benutzung zur Optimierung +@cindex Optimierung mit Variablen + +@code{\override}-Befehle sind oft lang und mühsam zu +tippen, und sie müssen immer absolut richtig sein. Wenn +derselbe Befehl mehrere Male benutzt werden muss, lohnt +es sich oft schon, eine Variable zu definieren, in der er +sich befindet. + +Als Beispiel sollen einige Worte im +Gesangstext fett und kursiv hervorgehoben werden. +Die Befehle @code{\italic} und @code{\bold} funktionieren +im Gesangstext-Kontext nur, wenn sie gleichzeitig mit den Wörtern, +auf die sie angewendet werden sollen, zusätzlich +in eine @code{\markup}-Umgebung eingeschlossen +werden. Durch diese Einbettung können einzelne Wörter nicht +einfach zu einer Variable umgeformt werden. Als +Alternative versuchen wir, einen Befehl mit +@code{\override} und @code{\revert} zu konstruieren. + +@example +@code{\override Lyrics . LyricText #'font-shape = #'italic} +@code{\override Lyrics . LyricText #'font-series = #'bold} + +@code{\revert Lyrics . LyricText #'font-shape} +@code{\revert Lyrics . LyricText #'font-series} +@end example + +Das wäre natürlich noch viel mühsamer, wenn viele Wörter eine +Hervorhebung benötigen. Anstelle dieser Befehlsketten @emph{können} +wir jedoch zwei Variablen definieren. Mit ihnen und dem entsprechenden +Wort in geschweiften Klammern erreichen wir den gewünschten Effekt. +Ein weiterer Vorteil ist, dass in diesem Fall die Leerzeichn um die +Punkte herum nicht benötigt werden, weil sie nicht innerhalb des +@code{lyricmode}-Kontextes interpretiert werden. Hier ein Beispiel; +die Bezeichnungen können natürlich auch kürzer sein, +um noch weniger schreiben zu müssen: + +@cindex LyricText, Beispiel zur Veränderung +@cindex Gesangstext, Beispiel zur Veränderung +@cindex font-shape-Eigenschaft, Beispiel +@cindex font-series-Eigenschaft, Beispiel + +@lilypond[quote,verbatim] +emphasize = { + \override Lyrics.LyricText #'font-shape = #'italic + \override Lyrics.LyricText #'font-series = #'bold +} +normal = { + \revert Lyrics.LyricText #'font-shape + \revert Lyrics.LyricText #'font-series +} + +global = { \time 4/4 \partial 4 \key c \major} +SopranoMusic = \relative c' { c4 | e4. e8 g4 g | a a g } +AltoMusic = \relative c' { c4 | c4. c8 e4 e | f f e } +TenorMusic = \relative c { e4 | g4. g8 c4. b8 | a8 b c d e4 } +BassMusic = \relative c { c4 | c4. c8 c4 c | f8 g a b c4 } +VerseOne = \lyrics { E -- | ter -- nal \emphasize Fa -- ther, \normal | strong to save, } +VerseTwo = \lyricmode { O | \emphasize Christ, \normal whose voice the | wa -- ters heard, } +VerseThree = \lyricmode { O | \emphasize Ho -- ly Spi -- rit, \normal | who didst brood } +VerseFour = \lyricmode { O | \emphasize Tri -- ni -- ty \normal of | love and pow'r } + +\score { + \new ChoirStaff << + \new Staff << + \clef "treble" + \new Voice = "Soprano" { \voiceOne \global \SopranoMusic } + \new Voice = "Alto" { \voiceTwo \AltoMusic } + \new Lyrics \lyricsto "Soprano" { \VerseOne } + \new Lyrics \lyricsto "Soprano" { \VerseTwo } + \new Lyrics \lyricsto "Soprano" { \VerseThree } + \new Lyrics \lyricsto "Soprano" { \VerseFour } + >> + \new Staff << + \clef "bass" + \new Voice = "Tenor" { \voiceOne \TenorMusic } + \new Voice = "Bass" { \voiceTwo \BassMusic } + >> + >> +} +@end lilypond + + +@node Other sources of information +@subsection Other sources of information + +Die Programmreferenz enthält sehr viel Information über LilyPond, aber +noch mehr Information findet sich in den internen +LilyPond-Dateien. Um sie erforschen zu können, müssen Sie erst +das richtige Verzeichnis auf Ihrem System finden. Die Position +hängt a) davon ab, ob Ihre LilyPond-Installation mit der vorkompilierten +Version von der LilyPond-Internetseite vorgenommen wurde oder Sie +die Version durch Ihren Paketmanager installiert haben (also +z. B. in einer Linux-Distribution oder unter fink oder cygwin +installiert), und b) auf welchem Betriebssystem Sie das Programm +benutzen: + +@strong{Von lilypond.org heruntergeladen} + +@itemize @bullet +@item Linux + +Wechseln Sie in das Verzeichnis +@file{@var{INSTALL_VERZ}/lilypond/usr/share/lilypond/current/} + +@item MacOS X + +Wechseln Sie in das Verzeichnis +@file{@var{INSTALL_VERZ}/LilyPond.app/Contents/Resources/share/lilypond/current/} +indem Sie entweder mit dem Befehl @code{cd} vom Terminal aus +in das Verzeichnis wechseln, oder mit Control-Klick auf das +LilyPond-Programmsymbol gehen und @qq{Show Package Contents} +auswählen. + +@item Windows + +Wechseln Sie mit dem Windows Explorer ins Verzeichnis +@file{@var{INSTALL_VERZ}/LilyPond/usr/share/lilypond/current/} + +@end itemize + +@strong{Mit einem Paket-Manager installiert oder selber aus +den Quellen kompiliert} + +Wechseln Sie in das Verzeichnis +@file{@var{PREFIX}/share/lilypond/@var{X.Y.Z}/}, wobei +@var{PREFIX} bei Ihrem Paket-Manager oder dem +@code{configure}-Skript gesetzt wird, und @var{X.Y.Z} +die LilyPond-Versionsnummer. + +@smallspace + +In diesem Ordner sind die zwei interessanten Unterordner: + +@itemize +@item @file{ly/} - beinhaltet Dateien im LilyPond-Format +@item @file{scm/} - beinhaltet Dateien im Scheme-Format +@end itemize + +Schauen wir uns zuerst einige Dateien in @file{ly/} an. +Öffnen Sie @file{ly/property-init.ly} in einem Texteditor. +Der, den Sie normalerweise für @code{.ly}-Dateien benutzen, +genügt. Diese Datei enthält die Definitionen aller vordefinierten +Befehle für LilyPond, wie etwa @code{\stemUp} und +@code{\slurDotted}. Sie können sehen, dass es sich um +nichts mehr handelt als Definitionen von Variablen, die eine +oder mehrere @code{\override}-Befehle enthalten. Der +Befehl @code{/tieDotted} etwa wird folgendermaßen definiert: + +@example +tieDotted = @{ + \override Tie #'dash-period = #0.75 + \override Tie #'dash-fraction = #0.1 +@} +@end example + +Wenn Sie diese Voreinstellungen der vordefinierten Befehl nicht +mögen, können Sie sie ganz einfach umdefinieren, genauso wie +jede andere Variable auch, indem Sie sie an den Anfang Ihrer +Quelldatei schreiben. + +Hier sind die wichtisgsten Dateien, die sich im Ordner +@file{ly/} befinden: + +@multitable @columnfractions .4 .6 +@headitem Dateiname + @tab Inhalt +@item @file{ly/engraver-init.ly} + @tab Definitionen von Engraver-Kontexten +@item @file{ly/paper-defaults-init.ly} + @tab Spezifikationen von Voreinstellungen für Papiermaße +@item @file{ly/performer-init.ly} + @tab Definitionen von Performer-Kontexten +@item @file{ly/property-init.ly} + @tab Definitionen aller vordefinierten Befehle +@item @file{ly/spanner-init.ly} + @tab Definitionen aller vordefinierten Strecker-Befehle +@end multitable + +Andere Einstellungen (wie die Definitionen von Beschriftungsbefehlen) +sind in @code{.scm}-(Scheme)-Dateien gespeichert. Die +Scheme-Programmiersprache wird benutzt, um eine +programmierbare Schnittstelle zu den internen Operationen von +LilyPond zu haben. Eine weitere Erklärung dieser Dateien ist +im Moment außerhalb des Rahmens dieses Handbuchs, denn +sie erfordern einige Kenntnis der Scheme-Sprache. Die Warnung +ist hier angebracht, dass des ein gutes technisches Verständnis +oder sehr viel Zeit braucht, um Scheme und diese +Dateien zu verstehen (siehe auch @ref{Scheme tutorial}). + +Wenn Sie sich mit Scheme auskennen, sind hier mögliche +interessante Dateien: + +@multitable @columnfractions .4 .6 +@headitem Dateiname + @tab Inhalt +@item @file{scm/auto-beam.scm} + @tab Sub-Balken-Voreinstellungen +@item @file{scm/define-grobs.scm} + @tab Voreinstellungen für Grob-Eigenschaften +@item @file{scm/define-markup-commands.scm} + @tab Definition aller Markup-Beschriftungsbefehle +@item @file{scm/midi.scm} + @tab Voreinstellung für die MIDI-Ausgabe +@item @file{scm/output-lib.scm} + @tab Einstellungen mit Einfluss auf die Darstellung von Bunddiagrammen, Farben, Versetzungszeichen, Taktlinien usw. +@item @file{scm/parser-clef.scm} + @tab Definitionen der unterstützten Schlüssel +@item @file{scm/script.scm} + @tab Voreinstellungen for Artikulationszeichen +@end multitable + + +@node Avoiding tweaks with slower processing +@subsection Avoiding tweaks with slower processing + +LilyPond kann einige zusätzliche Tests durchführen, während +die Noten gesetzt werden. Dadurch braucht das Programm länger, +um den Notensatz zu produzieren, aber üblicherweise werden +weniger nachträgliche Anpassungen nötig sein. Wenn eine +Textsilbe oder eine Beschriftung aus dem Rand der Partitur +ragt, wird durch diese Tests die Zeile gerade so weit komprimiert, +dass sie sich innerhalb der Ränder befindet. + +@example +\new Score \with @{ + % Um sicher zu gehen, dass Texte und Liedtext + % innerhalb der Papierränder bleiben + \override PaperColumn #'keep-inside-line = ##t + \override NonMusicalPaperColumn #'keep-inside-line = ##t +@} @{ + ... +@} +@end example + + +@node Advanced tweaks with Scheme +@subsection Advanced tweaks with Scheme + +Auch wenn viele Sachen mit @code{\override} und @code{\tweak} +möglich sind, gibt es eine sehr viel mächtigere Möglichkeit, die +Arbeitsweise von LilyPond mit Hilfe der programmierbaren Schnittstelle +zu beeinflussen. Code, der in der Scheme-Programmiersprache +geschrieben ist, kann direkt in die interne Satzmaschine von LilyPond +eingefügt werden. Natürlich brauchen Sie dazu wenigstens ein +grundlegendes Verständnis von Scheme. Eine Einleitung finden +Sie in der @ref{Scheme tutorial}. + +Zur Illustration der vielen Möglichkeiten soll gezeigt werden, dass eine +Eigenschaft nicht nur auf eine Konstante, sondern auch auf eine +Scheme-Prozedur gesetzt werden kann, die dann jedes Mal +aufgerufen wird, wenn die Eigenschaft von LilyPond benutzt +wird. Die Eigenschaft kann damit dynamisch auf einen Wert +gesetzt werden, der durch die Prozedur jedes Mal neu bestimmt +wird. In diesem Beispiel wird die Farbe der Notenköpfe entsprechend +zu ihrer Position innerhalb der Tonleiter gesetzt. + +@cindex x11-Farben, Beispiel zur Benutzung +@cindex Notenkopf, Beispiel zur Veränderung +@cindex Farb-Eigenschaft, in Scheme-Prozedur gesetzt + +@lilypond[quote,verbatim,ragged-right] +#(define (color-notehead grob) + "Color the notehead according to its position on the staff." + (let ((mod-position (modulo (ly:grob-property grob 'staff-position) 7))) + (case mod-position + ;; Return rainbow colors + ((1) (x11-color 'red )) ; for C + ((2) (x11-color 'orange )) ; for D + ((3) (x11-color 'yellow )) ; for E + ((4) (x11-color 'green )) ; for F + ((5) (x11-color 'blue )) ; for G + ((6) (x11-color 'purple )) ; for A + ((0) (x11-color 'violet )) ; for B + ) + ) +) + +\relative c' { + % Arrange to obtain color from color-notehead procedure + \override NoteHead #'color = #color-notehead + c2 c' | + b4 g8 a b4 c | + c,2 a' | + g1 | +} +\addlyrics { + Some -- where o -- ver the Rain -- bow, way up high, } @end lilypond +Weiter Beispiele, die die Benutzung dieser programmierbaren +Schnittstelle zeigen, finden sich in @ref{Tweaking with Scheme}.