[ < ] [ > ]   [ << ] [ Nach oben ] [ >> ]         [Anfang] [Inhalt] [Index] [ ? ]

4.1 Grundlagen für die Optimierung

@translationof Tweaking basics


[ < ] [ > ]   [ << ] [ Nach oben ] [ >> ]         [Anfang] [Inhalt] [Index] [ ? ]

4.1.1 Grundlagen zur Optimierung

@translationof Introduction to tweaks

„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 Optimierungen sind sehr einfach, andere dagegen recht komplex. Aber insgesamt erlaubt das System an Optimierungen so gut wie alle möglichen Erscheinungsformen 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 Kontexte und Engraver 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.


[ < ] [ > ]   [ << ] [ Nach oben ] [ >> ]         [Anfang] [Inhalt] [Index] [ ? ]

4.1.2 Objekte und Schnittstellen

@translationof Objects and interfaces

Optimierung bedeutet, die internen Operationen und Strukturen des LilyPond-Programms zu verändern, darum sollen hier zunächst die wichtigsten Begriffe erklärt werden, die zur Beschreibung dieser Operationen und Strukturen benutzt werden.

Der Begriff „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 \new Staff auftritt, wird ein neues Objekt vom Typ Staff erstellt. Dieses Objekt 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 Voice-Objekte, Score-Objekte, Lyrics-Objekte, aber auch für Objekte, die Notationselemente wie die Taktstriche, 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 „Layout-Objekte“, oft auch „Graphische Objekte“ genannt. Daraus resultiert die künstliche Abkürzung „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 platziert – sie haben vielmehr einen Anfangspunkt, einen Endpunkt und eventuell noch andere Eigenschaften, die ihre Form bestimmen. Objekte mit solch einer erweiterten Gestalt werden als „Strecker“ (engl. Spanners) bezeichnet.

Darüber hinaus gibt es ‚abstrakte‘ Grobs, die selbst keinen Ausdruck irgendwelcher Art erzeugen. Vielmehr sammeln sie, positionieren oder verwalten andere Grobs. Typische Beispiele hierfür sind DynamicLineSpanner, BreakAlignment, NoteColumn, VerticalAxisGroup, NonMusicalPaperColumn und Ähnliche. Wir werden uns später mit einigen von ihnen noch näher befassen.

Es bleibt uns noch übrig zu erklären, was „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 grob-interface (Schnittstelle eines graphischen Objektes) zusammengefasst. Es gibt viele andere Gruppen gemeinsamer Eigenschaften, die jede eine Bezeichnung besitzen, welche auf -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.


[ < ] [ > ]   [ << ] [ Nach oben ] [ >> ]         [Anfang] [Inhalt] [Index] [ ? ]

4.1.3 Regeln zur Benennung von Objekten und Eigenschaften

@translationof Naming conventions of objects and properties

Es wurden schon früher einige Regeln zur Benennung von Objekten vorgestellt, siehe Kontexte und Engraver. Hier eine Referenzliste der häufigsten Objekt- und Eigenschaftsbezeichnungen mit den Regeln für ihre Bezeichnung und illustrierenden echten Bezeichnungen. Es wurde „A“ für einen beliebigen Großbuchstaben und „aaa“ für eine beliebige Anzahl an Kleinbuchstaben eingesetzt. Andere Zeichen werden explizit angegeben.

Objekt-/EigenschaftstypNaming conventionBeispiele
KontexteAaaa oder AaaaAaaaAaaaStaff, GrandStaff
Layout-ObjekteAaaa oder AaaaAaaaAaaaSlur, NoteHead
EngraverAaaa_aaa_engraverClef_engraver, Note_heads_engraver
Schnittstellenaaa-aaa-interfacegrob-interface, break-aligned-interface
Kontext-Eigenschaftenaaa oder aaaAaaaAaaaalignAboveContext, skipBars
Layout-Objekt-Eigenschaftenaaa oder aaa-aaa-aaadirection, beam-thickness

Es wird bald ersichtlich werden, dass die Eigenschaften von unterschiedlichen Objekttypen mit unterschiedlichen Befehlen geändert werden. Deshalb ist es nützlich, bereits am Namen den Typ und die Eigenschaften eines Objekts zu erkennen.


[ < ] [ > ]   [ << ] [ Nach oben ] [ >> ]         [Anfang] [Inhalt] [Index] [ ? ]

4.1.4 Optimierungsmethoden

@translationof Tweaking methods


[ < ] [ > ]   [ << ] [ Nach oben ] [ >> ]         [Anfang] [Inhalt] [Index] [ ? ]

Der \override-Befehl

@translationof The override command

Der \override-Befehl

Wir haben uns schon mit den Befehlen \set und \with bekannt gemacht, mit welchen Eigenschaften von Kontexten verändert und Engraver entfernt oder hinzugefügt werden können. Siehe dazu Kontexteigenschaften verändern und Engraver hinzufügen und entfernen. Jetzt wollen wir uns weitere wichtige Befehle anschauen.

Der Befehl, um die Eigenschaften von Layout-Objekten zu ändern, ist \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 werden soll, und welches der neu zu setzende Wert dann ist. Schauen wir uns an, wie das vor sich geht.

Die allgemeine Syntax dieses Befehles ist:

 
\override Kontext.LayoutObjekt.layout-eigenschaft = #Wert

Damit wir die Eigenschaft mit der Bezeichnung layout-property das Layout-Objektes mit der BezeichnungLayoutObject, welches ein Mitglied des Kontext-Kontextes ist, auf den Wert value.

Der Kontext kann (und wird auch normalerweise) ausgelassen werden, wenn der benötigte Kontext eindeutig impliziert ist und einer der untersten Kontexte ist, also etwa Voice, ChordNames oder 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, siehe Typen von Eigenschaften. Aber um ihre Funktion und ihr Format zu demonstrieren, werden wir hier nur einige einfache Eigenschaften und Werte einsetzen, die einfach zu verstehen sind.

LilyPond’s hauptsächliche Ausdrücke sind musikalische Dinge wie Noten, Notendauern und Markierungen. Diesen zugrunde liegende Ausdrücke wie Zahlen, Zeichenketten und Listen werden im ‚Scheme Modus‘ verarbeitet. Der Präfix ‘#’ leitet diesen Modus ein. Einige dieser Werte haben manchmal eine gültige Repräsentation in LilyPond’s Musik Modus, in diesem Handbuch werden wir aus Gründen der Einheitlichkeit immer das ‘#’ für ihre Eingabe verwenden. Weiterführende Informationen zu LilyPond’s Scheme mode finden sie unter (extending)LilyPond Scheme-Syntax in Abschnitt ‘LilyPond Scheme-Syntax’ in Extending.

\override ist der bei Optimierungen am häufigsten verwendete Befehl. Daher wird der Rest dieses Kapitels im Wesentlichen aus Anwendungsbeispielen dieses Befehls bestehen. Hier kommt gleich ein einfaches Beispiel zur Änderung der Farbe von Notenköpfen:

 
\relative {
  c'4 d
  \override NoteHead.color = #red
  e4 f |
  \override NoteHead.color = #green
  g4 a b c |
}

[image of music]


[ < ] [ > ]   [ << ] [ Nach oben ] [ >> ]         [Anfang] [Inhalt] [Index] [ ? ]

Der \revert-Befehl

@translationof The revert command

Wenn eine Eigenschaft einmal überschrieben wurde, wird ihr neuer Wert so lange bewahrt, bis er noch einmal überschrieben wird oder ein \revert-Befehl vorkommt. Der \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 \override-Befehle benutzt wurden.

 
\revert Kontext.LayoutObjekt.layout-eigenschaft

Wiederum, genauso wie der Kontext bei dem \override-Befehl, wird 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.

 
\relative {
  c'4 d
  \override NoteHead.color = #red
  e4 f |
  \override NoteHead.color = #green
  g4 a
  \revert NoteHead.color
  b4 c |
}

[image of music]


[ < ] [ > ]   [ << ] [ Nach oben ] [ >> ]         [Anfang] [Inhalt] [Index] [ ? ]

Der \once-Präfix

@translationof The once prefix

Sowohl der \override-Befehl als auch der \set-Befehl können mit dem Präfix \once (einmal) versehen werden. Dadurch wird der folgende \override- oder \set-Befehl nur für den aktuellen Musik-Moment wirksam, bevor sich wieder der vorherige Zustand herstellt (dieser kann sich vom Standard unterscheiden, wenn etwa noch ein anderer \override-Befehl aktiv ist). Am gleichen Beispiel demonstriert, kann damit die Farbe eines einzelnen Notenkopfes geändert werden:

 
\relative {
  c'4 d
  \override NoteHead.color = #red
  e4 f |
  \once \override NoteHead.color = #green
  g4 a
  \revert NoteHead.color
  b c |
}

[image of music]

Der \once Präfix eignet sich also dazu, die Geltungsdauer eines anderen vordefinierten Befehls, dem er vorangestellt ist, auf ein einziges musikalisches Ereignis zu beschränken:

 
\relative {
  c'4( d)
  \once \slurDashed
  e4( f) |
  g4( a)
  \once \hideNotes
  b( c) |
}

[image of music]

Allerdings funktioniert das nicht bei vordefinierten Befehlen wie \…Neutral, \…Off oder \un…, weil diese intern \revert verwenden und nicht \override, sodass ein \once Präfix hier keine Auswirkungen hat.


[ < ] [ > ]   [ << ] [ Nach oben ] [ >> ]         [Anfang] [Inhalt] [Index] [ ? ]

Der \overrideProperty-Befehl

@translationof The overrideProperty command

Es gibt eine andere Form des override-Befehls, \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 (extending)Schwierige Korrekturen in Abschnitt ‘Schwierige Korrekturen’ in Extending.


[ < ] [ > ]   [ << ] [ Nach oben ] [ >> ]         [Anfang] [Inhalt] [Index] [ ? ]

Der \tweak-Befehl

@translationof The tweak command

Der letzte Optimierungsbefehl in LilyPond ist \tweak (engl. optimieren). Er wird eingesetzt um Eigenschaften nur eines Objektes von mehreren Objekten zu verändern, die zum selben Musik-Zeitpunkt auftreten, wie etwa die Noten eines Akkordes. Ein \override würde alle Noten des Akkords beeinflussen, während mit \tweak nur das nächste Objekt der Eingabe geändert wird.

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 \once \override erhalten:

 
\relative {
  <c' e g>4
  \once \override NoteHead.font-size = #-3
  <c e g>4
  <c e g>4
}

[image of music]

Wie man sehen kann, beeinflusst override alle Notenköpfe des Akkordes. Das liegt daran, dass alle die Noten eines Akkordes zum selben Musik-Moment auftreten und die Funktion von \once ist es, die Optimierung auf an allen Objekten auszuführen, die zum selben Musik-Moment auftreten wie der \override-Befehl.

Der \tweak-Befehl funktioniert anders. Er bezieht sich auf das direkt folgende Element in der Eingabe-Datei. In seiner einfachsten Form ist der Befehl nur an Objekten wirksam, die direkt vom vorhergehenden Element erstellt worden sind, insbesondere Notenköpfe und Artikulation.

Um also zu unserem Beispiel zurückzukommen, könnte man die mittlere Note eines Akkordes auf diese Weise ändern:

 
\relative {
  <c' e g>4
  <c \tweak font-size #-3 e g>4
}

[image of music]

Beachten Sie, dass die Syntax des \tweak-Befehls sich von der des \override-Befehls unterscheidet. Der Kontext dürfen nicht angegeben werden, denn das würde zu einem Fehler führen. Sowohl Kontext als auch das Layout-Objekt sind durch das folgende Element im Inputstream impliziert. Hier sollte auch kein Gleichheitszeichen vorhanden sein. Die verallgemeinerte Syntax des \tweak-Befehls ist also

 
\tweak layout-eigenschaft #Wert

Ein \tweak-Befehl kann auch benutzt werden, um nur eine von mehreren Artikulationen zu ändern, wie im nächsten Beispiel zu sehen ist.

 
a'4^"Black"
  -\tweak color #red ^"Red"
  -\tweak color #green _"Green"

[image of music]

Beachten Sie, dass ein Artikulationsmodifikator vor dem \tweak-Befehl geschrieben werden muss, weil auch der \tweak-Ausdruck als Artikulation angefügt wird. Im Falle von mehreren Richtungsmodifikatoren (^ or _) gilt der Modifikator links außen, weil er als letzter angefügt wird.

Objekte wie Hälse und Versetzungszeichen werden später erstellt und nicht direkt aus dem vorhergehenden Ereignis. Es ist dennoch möglich, \tweak mit solchen indirekt erstelltn Objekten zu verwenden, indem man die Layout-Objekte direkt benennt, vorausgesetzt dass LilyPond ihre Herkunft bis zu dem ursprünglichen Ereignis zurück verfolgen kann:

 
<\tweak Accidental.color #red   cis''4
 \tweak Accidental.color #green es''
 g''>

[image of music]

Diese Langform des \tweak-Befehls kann wie folgend beschrieben werden:

 
\tweak layout-object.layout-property value

Der \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 \override-Befehl sich auf beide beziehen würde. In dem Beispiel wird \tweak benutzt, um zwischen ihnen zu unterscheiden. Der erste \tweakBefehl 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.

 
\relative c'' {
  \tweak direction #up
  \tuplet 3/4 {
    \tweak color #red
    \tuplet 3/2 { c8[ c c] }
    \tuplet 3/2 { c8[ c c] }
    \tuplet 3/2 { c8[ c c] }
  }
}

[image of music]

Wenn geschachtelte N-tolen nicht zum gleichen Zeitpunkt beginnen, kann ihr Aussehen auf die übliche Art mit dem \override-Befehl geändert werden:

 
\relative {
  \tuplet 3/2 { c'8[ c c] }
  \once \override TupletNumber.text = #tuplet-number::calc-fraction-text
  \tuplet 3/2 {
    c8[ c]
    c8[ c]
    \once \override TupletNumber.transparent = ##t
    \tuplet 3/2 { c8[ c c] }
    \tuplet 3/2 { c8[ c c] }
  }
}

[image of music]

Siehe auch

Notationsreferenz: (notation)Der tweak-Befehl in Abschnitt ‘Der tweak-Befehl’ in Notationsreferenz.


[ < ] [ > ]   [ << ] [ Nach oben ] [ >> ]         [Anfang] [Inhalt] [Index] [ ? ]

Der \single-Präfix

@translationof The single prefix

Nehmen wir einmal an, wir möchten bestimmte Noten betonen, indem wir ihre Köpfe rot einfärben und sie außerdem vergrößern. Damit das einfach zu machen ist nehmen wir ferner an, wir hätten dafür eine Funktion definiert:

 
emphNoteHead = {
  \override NoteHead.color = #red
  \override NoteHead.font-size = 2
}
\relative {
  c''4 a \once \emphNoteHead f d |
}

[image of music]

Der \once Präfix funktioniert wunderbar, wenn es darum geht einzelne Noten oder ganze Akkorde zu betonen, jedoch versagt er, gilt es eine einzelne Note innerhalb eines Akkordes zu betonen. Wir haben schon gesehen, wie \tweak dennoch dazu gebracht werden kann, siehe Der \tweak-Befehl. Aber \tweak kann nicht auf eine Funktion angewandt werden; hier kommt \single ins Spiel:

 
emphNoteHead = {
  \override NoteHead.color = #red
  \override NoteHead.font-size = 2
}
\relative {
   <c'' a \single \emphNoteHead f d>4
}

[image of music]

Zusammenfassend kann man sagen, \single wandelt overrides in tweaks sodass bei mehreren zeitgleichen musiklaischen Objekten (wie die Notenköpfe eines Akkords), man mit \single lediglich ein einzelnes Objekt beeinflusst, nämlich dasjenige, was im direkt folgenden musikalischen Ausdruck steckt. Das ist anders, als \once, welches alle diese Objekte beträfe.

Man kann so \single dafür verwenden, jede kleine Funktion, die lediglich overrides enthält auf einzelne Noten innerhalb eines Akkords anzuwenden. Es sei jedoch darauf hingewiesen, \single wandelt weder \revert, noch noch \set oder \unset in tweaks.

Siehe auch

Handbuch zum Lernen: Der \tweak-Befehl, Variablen für Layout Anpassungen einsetzen.


[ < ] [ > ]   [ << ] [ Nach oben ] [ >> ]

Dieses Dokument wurde erzeugt von gub am 13. Juli 2020 durch texi2html 1.82.

Andere Sprachen: English, català, česky, español, français, italiano, 日本語, nederlands.
Über die automatische Sprachauswahl.