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

5.3 Eigenschaften verändern

@translationof Modifying properties


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

5.3.1 Grundlagen zum Verändern von Eigenschaften

@translationof Overview of modifying properties

Jeder Kontext ist verantwortlich für die Erstellung bestimmter graphischer Objekte. Die Einstellungen für diese Objekte werden auch in dem Kontext gespeichert. Wenn man diese Einstellungen verändert, kann die Erscheinung der Objekte geändert werden.

Es gibt zwei unterschiedliche Eigenschaftenarten, die in Kontexten gespeichert werden: Kontexteigenschaften und Grob-Eigenschaften. Kontexteigenschaften sind Eigenschaften, die sich auf den gesamten Kontext beziehen und seine Darstellung beinflussen. Grob-Eigenschaften dagegen wirken sich nur auf bestimmte graphische Objekte aus, die in einem Kontext dargestellt werden.

Die \set- und \unset-Befehle werden benutzt, um die Werte von Kontexteigenschaften zu ändern. Die Befehle \override und \revert hingegen verändern die Werte von Grob-Eigenschaften.

Siehe auch

Referenz der Interna: (internals)OverrideProperty in Abschnitt ‘OverrideProperty’ in Referenz der Interna, (internals)RevertProperty in Abschnitt ‘RevertProperty’ in Referenz der Interna, (internals)PropertySet in Abschnitt ‘PropertySet’ in Referenz der Interna, (internals)Backend in Abschnitt ‘Backend’ in Referenz der Interna, (internals)All layout objects in Abschnitt ‘All layout objects’ in Referenz der Interna.

Bekannte Probleme und Warnungen

Das Back-end ist nicht sehr streng bei der Überprüfung der Typen von Objekteigenschaften. Auf sich selbst verweisende Bezüge in Scheme-Werten der Eigenschaften können Verzögerung oder einen Absturz des Programms hervorrufen.


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

5.3.2 Der \set-Befehl

@translationof The set command

Jeder Kontext kann unterschiedliche Eigenschaften besitzen, Variablen, die in diesem Kontext definiert sind. Sie können während der Interpretation des Kontextes verändert werden. Hierzu wird der \set-Befehl eingesetzt:

 
\set Kontext.Eigenschaft = #Wert

Wert ist ein Scheme-Objekt, weshalb ihm # vorangestellt werden muss.

Kontexteigenschaften werden üblicherweise mit kleinGroßbuchstabe benannt. Sie kontrollieren vor allem die Übersetzung von Musik in Notation, wie etwa localAlterations, welche bestimmt, wann ein Taktstrich gesetzt werden muss. Kontexteigenschaften können ihren Wert mit der Zeit ändern, während eine Notationsdatei interpretiert wird. Ein gutes Beispiel dafür ist measurePosition, was die Position der Noten im Takt angibt. Kontexteigenschaften werden mit dem \set-Befehl verändert.

Mehrtaktpausen etwa können in einen Takt zusammengefasst werden, wenn die Kontexteigenschaft skipBars (Takte überspringen) auf #t (wahr) gesetzt wird:

 
R1*2
\set Score.skipBars = ##t
R1*2

[image of music]

Wenn das Kontext-Argument ausgelassen wird, bezieht sich der Befehl auf den gerade aktiven unterstmöglichen Kontext, üblicherweise ChordNames, Voice oder Lyrics.

 
\set Score.autoBeaming = ##f
\relative {
  e''8 e e e
  \set autoBeaming = ##t
  e8 e e e
} \\
\relative {
  c''8 c c c c8 c c c
}

[image of music]

Die Änderung wird zur Laufzeit während der Musik interpretiert, sodass diese Einstellung sich nur auf die zweite Gruppe von Achteln auswirkt.

Dabei gilt zu beachten, dass der unterste Kontext nicht immer die Eigenschaft enthält, die verändert werden soll. Wenn man beispielsweise skipBars aus dem oberen Beispiel ohne Angabe des Kontextes zu verändern sucht, hat der Befehl keine Auswirkung, weil er sich auf den Voice-Kontext bezieht, die Eigenschaft sich aber im Score-Kontext befindet:

 
R1*2
\set skipBars = ##t
R1*2

[image of music]

Kontexte sind hierarchisch angeordnet. Wenn ein übergeordneter Kontext angegeben wird, etwa Staff, dann beziehen sich die Änderungen auf alle Stimmen (Voice), die in diesem Kontext enthalten sind.

Es gibt auch einen \unset-Befehl:

 
\unset Kontext.Eigenschaft

der bewirkt, dass die vorgenommenen Definitionen für Eigenschaft entfernt werden. Dieser Befehl macht nur Einstellungen im richtigen Kontext rückgängig. Wenn also im Staff-Kontext die Bebalkung ausgeschaltet wird:

 
\set Score.autoBeaming = ##t
\relative {
  \unset autoBeaming
  e''8 e e e
  \unset Score.autoBeaming
  e8 e e e
} \\
\relative {
  c''8 c c c c8 c c c
}

[image of music]

Wie für \set muss das Kontext-Argument für den untersten Kontext nicht mitangegeben werden. Die zwei Versionen

 
\set Voice.autoBeaming = ##t
\set autoBeaming = ##t

verhalten sich gleich, wenn die gegenwärtige Basis der Voice-Kontext ist.

Einstellungen, die nur einmal vorgenommen werden sollen, können mit \once notiert werden, etwa:

 
c''4
\once \set fontSize = #4.7
c''4
c''4

[image of music]

Eine vollständige Beschreibung aller vorhandenen Kontexteigenschaften findet sich in der Referenz der Interna, siehe (internals)Tunable context properties in Abschnitt ‘Tunable context properties’ in Referenz der Interna.

Siehe auch

Internals Reference:

(internals)Tunable context properties in Abschnitt ‘Tunable context properties’ in Referenz der Interna.


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

5.3.3 Der \\override-Befehl

@translationof The override command

Es gibt eine besondere Art von Kontexteigenschaft: die Grob-Beschreibung. Grob-Beschreibungen werden mit GroßGroßbuchstabe benannt. Sie enthalten „Standardeinstellungen“ für ein bestimmtes Grob als eine assoziative Liste. Siehe ‘scm/define-grobs.scm’ für die Einstellungen aller Grob-Beschreibungen. Grob-Beschreibungen werden mit \override verändert.

\override ist eigentlich eine Kurzform, der Befehl

 
\override Kontext.GrobBezeichnung #'Eigenschaft = #Wert

ist äquivalent zu

 
\set Kontext.GrobBezeichnung  =
  #(cons (cons 'Eigenschaft Wert)
         <vorheriger Wert von Kontext.GrobBezeichnung>)

Der Wert von Kontext.GrobBezeichnung (die assoz. Liste „alist“) wird benutzt um die Eigenschaften von individuellen Grobs zu initialisieren. Grobs haben Eigenschaften, die im Scheme-Stil mit bindestrich-wörtern benannt sind. Diese Werte der Grob-Eigenschaften verändern sich während des Notensetzens: LilyPonds Notensatz heißt im Grunde, die Eigenschaften mit Callback-Fuktionen auszurechnen.

Beispielsweise kann die Dicke eines Notenhalses verändert werden, indem man die thickness-Eigenschaft des Stem-Objekts verändert:

 
c4 c
\override Voice.Stem.thickness = #3.0
c4 c

[image of music]

Wenn kein Kontext angegeben wird, wird der tiefste aktuelle Kontext benutzt:

 
{ \override Staff.Stem.thickness = #3.0
  <<
    {
      e4 e
      \override Stem.thickness = #0.5
      e4 e
    } \\ {
      c4 c c c
    }
  >>
}

[image of music]

Die Auswirkungen von \override können mit \revert wieder rückgängig gemacht werden:

 
c4
\override Voice.Stem.thickness = #3.0
c4 c
\revert Voice.Stem.thickness
c4

[image of music]

Die Auswirkungen von \override und \revert wirken sich auf alle Grobs im entsprechenden Kontext aber der Stelle aus, an der sie gesetzt werden:

 
{
  <<
    {
      e4
      \override Staff.Stem.thickness = #3.0
      e4 e e
    } \\ {
      c4 c c
      \revert Staff.Stem.thickness
      c4
    }
  >>
}

[image of music]

\once kann zusammen mit \override benutzt werden, um nur den aktuellen Zeitwert zu verändern:

 
{
  <<
    {
      \override Stem.thickness = #3.0
      e4 e e e
    } \\ {
      c4
      \once \override Stem.thickness = #3.0
      c4 c c
    }
  >>
}

[image of music]

Siehe auch

Referenz der Interna: (internals)Backend in Abschnitt ‘Backend’ in Referenz der Interna.


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

5.3.4 Der \tweak-Befehl

@translationof The tweak command

Wenn man Grob-Eigenschaften mit \override verändert, verändern sich alle fraglichen Objekte zu dem gegebenen musikalischen Moment. Manchmal will man allerdings nur ein Grob verändern, anstatt allen Grobs des aktuellen Kontextes. Das kann mit dem \tweak-Befehl erreicht werden, mit dem man Optimierungen vornehmen kann:

 
\tweak Layout-Objekt #'grob-eigenschaft #Wert

Die Angabe von Layout-Objekt ist optional. Der \tweak-Befehl wirkt sich auf das musikalische Objekt aus, dass direkt auf Wert folgt.

Eine Einleitung der Syntax und Benutzungen des \tweak-(Optimierungs)-Befehls findet sich in (learning)Optimierungsmethoden in Abschnitt ‘Optimierungsmethoden’ in Handbuch zum Lernen.

Wenn mehrere gleichartige Elemente zum gleichen musikalischen Moment auftreten, kann der \override-Befehl nicht benutzt werden, um nur einen von ihnen zu verändern: hier braucht man den \tweak-Befehl. Elemente, die mehrfach zum gleichen musikalischen Moment auftreten können sind unter Anderem:

In diesem Beispiel wird die Farbe eines Notenkopfes und die Art eines anderen Notenkopfes innerhalb eines Akkordes verändert:

 
< c''
  \tweak color #red
  d''
  g''
  \tweak duration-log #1
  a''
> 4

[image of music]

\tweak kann auch benutzt werden, um Bögen zu verändern:

 
\relative { c'-\tweak thickness #5 ( d e f) }

[image of music]

Damit der \tweak-Befehl funktioniert, muss er direkt vor dem Objekt stehen, auf das er sich bezieht. Einen ganzen Akkord kann man nicht mit \tweak verändern, weil der Akkord wie ein Kontainer ist, in dem alle Layoutelemente aus Ereignissen innerhalb von EventChord erstellt werden:

 
\tweak color #red <c e>4
<\tweak color #red c e>4

[image of music]

Der einfache \tweak-Befehl kann nicht eingesetzt werden, um Elemente zu verändern, die nicht direkt aus der Eingabe erstellt werden. Insbesondere Hälse, automatische Balken oder Versetzungszeichen lassen sich nicht beeinflussen, weil diese später durch die Layoutobjekte des Notenkopfs erstellt werden und nicht direkt durch den Quelltext.

Derartige indirekt erstellt Layoutobjekte können mit \tweak verändert werden, indem man die ausführliche Form des Befehls einsetzt:

 
\tweak Stem.color #red
\tweak Beam.color #green c''8 e''
<c'' e'' \tweak Accidental.font-size #-3 ges''>4

[image of music]

\tweak kann auch nicht verwendet werden, um Schlüssel oder Taktarten zu verändern, denn sie werden von dem \tweak-Befehl während der Interpretation durch automatisches Einfügen von zusätzlichen Kontextelementen getrennt.

Mehrere \tweak-Befehle können vor ein Notationselement gesetzt werden und alle werden interpretiert:

 
c'
  -\tweak style #'dashed-line
  -\tweak dash-fraction #0.2
  -\tweak thickness #3
  -\tweak color #red
  \glissando
f''

[image of music]

Der Strom der musikalischen Ereignisse (engl. music stream), der aus dem Quelltext erstellt wird, und zu dem auch die automatisch eingefügten Elemente gehören, kann betrachtet werden, siehe (extending)Musikalische Funktionen darstellen in Abschnitt ‘Musikalische Funktionen darstellen’ in Extending. Das kann nützlich sein, wenn man herausfinden will, was mit dem \tweak-Befehl verändert werden kann.

Siehe auch

Handbuch zum Lernen: (learning)Optimierungsmethoden in Abschnitt ‘Optimierungsmethoden’ in Handbuch zum Lernen.

Erweitern: (extending)Musikalische Funktionen darstellen in Abschnitt ‘Musikalische Funktionen darstellen’ in Extending.

Bekannte Probleme und Warnungen

Der \tweak-Befehl kann nicht benutzt werden, um die Kontrollpunkte eines von mehreren Bindebögen eines Akkorden zu verändern. Anstelle dessen wird der erste Bogen verändert, der in der Eingabedatei auftritt.


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

5.3.5 \\set versus \\override

@translationof set versus override


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

5.3.6 Alisten verändern

@translationof Modifying alists

Einige vom Benutzer einstellbare Eigenschaften sind intern als alists (Assoziative Listen) dargestellt, die Paare von Schlüsseln und Werten speichern. Die Struktur einer Aliste ist:

 
'((Schlüssel1 . Wert1)
  (Schlüssel2 . Wert2)
  (Schlüssel3 . Wert3)
  …)

Wenn eine Aliste eine Grob-Eigenschaft oder eine Variable der \paper-Umgebung ist, können ihre Schlüssel einzeln verändert werden, ohne andere Schlüssel zu beeinflussen.

Um beispielsweise den Freiraum zwischen benachbarten Systemen in einer Systemgruppe zu verkleinern, kann man die staff-staff-spacing-Eigenschaft des +StaffGrouper-Grobs benutzen. Die Eigenschaft ist eine Aliste mit vier Schlüsseln: : basic-distance (Grund-Abstand), minimum-distance (minimaler Abstand), padding (Verschiebung) und stretchability (Dehnbarkeit). Die Standardwerte dieser Eigenschaft finden sich im Abschnitt „Backend“ der Referenz der Interna (siehe (internals)StaffGrouper in Abschnitt ‘StaffGrouper’ in Referenz der Interna):

 
'((basic-distance . 9)
  (minimum-distance . 7)
  (padding . 1)
  (stretchability . 5))

Eine Möglichkeit, die Systemen dichter zueinander zu zwingen, ist es, der Wert des basic-distance-Schlüssels (9) zu verändern, sodass der den gleichen Wert wie minimum-distance (7) hat. Um einen einzelnen Schlüssel zu verändern, wird ein geschachtelter Aufruf benutzt:

 
% default space between staves
\new PianoStaff <<
  \new Staff { \clef treble c''1 }
  \new Staff { \clef bass   c1   }
>>

% reduced space between staves
\new PianoStaff \with {
  % this is the nested declaration
  \override StaffGrouper.staff-staff-spacing.basic-distance = #7
} <<
  \new Staff { \clef treble c''1 }
  \new Staff { \clef bass   c1   }
>>

[image of music]

Wenn man diese Art des geschachtelten Aufrufs einsetzt, wird der spezifische Schlüssel (basic-distance im obigen Beispiel) verändert, ohne dass sich andere Wert für die gleiche Eigenschaft ändern würden.

Nun sollen die Systeme so dicht wie möglich gesetzt werden, ohne das Überlappungen vorkommen. Die einfachste Möglichkeit, das zu tun, wäre es, alle vier Wert auf 0 zu setzen. Man muss jedoch nicht vier Werte definieren, sondern die Eigenschaft kann mit einem Aufruf als Aliste vollständig verändert werden:

 
\new PianoStaff \with {
  \override StaffGrouper.staff-staff-spacing =
    #'((basic-distance . 0)
       (minimum-distance . 0)
       (padding . 0)
       (stretchability . 0))
} <<
  \new Staff { \clef treble c''1 }
  \new Staff { \clef bass   c1   }
>>

[image of music]

Dabei sollte beachtet werden, dass alle Schlüssel, die bei dieser Weise des Aufrufs nicht explizit aufgelistet sind, auf den Standardwert gesetzt werden, den sie hätten, wenn sie nicht definiert werden. Im Falle von staff-staff-spacing würden alle nicht genannten Schlüsselwerte auf 0 gesetzt (außer stretchability, welche immer den Wert von space hat, wenn sie nicht definiert ist). Somit sind folgende Aufrufe äquivalent:

 
\override StaffGrouper.staff-staff-spacing =
  #'((basic-distance . 7))

\override StaffGrouper.staff-staff-spacing =
  #'((basic-distance . 7)
     (minimum-distance . 0)
     (padding . 0)
     (stretchability . 7))

Eine möglicherweise ungewollte Konsequenz hiervon ist, dass alle Standardwerte, die etwa in einer Initialisierungsdatei zu Beginn einer LilyPond-Partitur geladen werden, nach dem Aufruf rückgängig gemacht werden. Im obigen Beispiel werden die initialisierten Standardwerte für padding und minimum-distance (definiert in ‘scm/define-grobs.scm’) auf den Standard zurückgesetzt, den sie uninitialisiert hätten (0 in beiden Fällen). Wenn eine Eigenschaft oder Variable in Form einer Aliste (jeder Größe) definiert wird, werden immer alle Schlüsselwerte auf den uninitialisierten Zustand zurückgesetzt. Es ist also sicherer, geschachtelte Aufrufe zu benutzen, wenn man nicht bewusst alle Werte zurücksetzen will.

Achtung: Geschachtelte Aufrufe funktionieren nicht mit Kontexteigenschaften (wie etwa beamExceptions, keyAlterations, timeSignatureSettings, usw.) Diese Eigenschaften können nur verändert werden, indem man sie vollständig als Alisten umdefiniert.


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

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

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