Autor Thema: Atemzeichen kleiner setzen  (Gelesen 2115 mal)

asdfg

  • Member
Atemzeichen kleiner setzen
« am: Montag, 12. September 2016, 19:14 »
Ich möchte das Atemzeichen mit \version "2.18.00" an der zweiten Stelle kleiner setzen.

f4 f8 (es8) des2  \breathe bes4. \teeny \breathe \normalsize bes8 des4 f4
Funktioniert nicht. Warum?
Das Atemzeichen wird gleich große gesetzt wie immer.

Und so wird das Atemzeichen und darauffolgende Note kleiner gesetzt.
f4 f8 (es8) des2  \breathe bes4. \teeny \breathe bes8 \normalsize des4 f4
« Letzte Änderung: Montag, 12. September 2016, 20:01 von Akkorde&Melodie »

fugenkomponist

  • Member
Re: Atemzeichen kleiner setzen
« Antwort #1 am: Montag, 12. September 2016, 21:09 »
Bitte gib immer ein kompilierbares Minimalbeispiel an (d. h. eines, welches möglichst klein ist, aber so vollständig, dass eine .ly-Datei keinen weiteren Code enthalten muss, um das Problem zu demonstrieren); damit erleichterst du potenziellen Helfern die Sache, weil sie nicht selbst für ein entsprechendes Beispiel sorgen müssen. Das kann z. B. so aussehen:
\version "2.18.0"

{
  b2 \teeny \breathe \normalsize b
}
Übrigens: Eine Version 2.18.00 gibt es nicht, schreib deshalb lieber 2.18.0 ;)

Die Frage, warum das so nicht funktioniert, ist relativ leicht zu beantworten: zwischen \teeny und \normalsize vergeht keine Zeit (das Atemzeichen passiert am Ende der vorherigen Notendauer und hat verbraucht selbst keine Zeit), weshalb \normalsize die Wirkung von \teeny wieder aufhebt. Den gleichen Effekt hätte\version "2.18.0"

{
  b2 \teeny \normalsize \breathe b
}

Später erst wieder auf \normalsize (oder früher auf \teeny) umzuschalten, hat den von dir erwähnten Effekt, weil hier die Schriftgröße (fontSize) als Kontext-Eigenschaft für alles gesetzt wird, nicht nur als Grob-Eigenschaft font-size für das Atemzeichen (BreathingSign).

Abhilfe schafft also ein \override oder \tweak der font-size von BreathingSign, dabei gibt es drei Möglichkeiten:\version "2.18.0"

{
  % original
  b2 \breathe b
 
  % \once \override ändert den Wert nur für das direkt folgende Auftreten:
  b \once \override BreathingSign.font-size = -3 \breathe b
  b \breathe b
 
  % in diesem Fall geht statt \once \override auch kürzer ein \tweak:
  b \tweak font-size -3 \breathe b
  b \breathe b
 
  % ein \override (ohne \once) bezieht sich auf alle folgenden Vorkommen
  \override BreathingSign.font-size = -3
  b \breathe b
  b \breathe b
}
Die -3 kommt daher, dass \teeny als \set fontSize = -3 definiert ist.

asdfg

  • Member
Re: Atemzeichen kleiner setzen
« Antwort #2 am: Montag, 12. September 2016, 21:25 »
Danke für die Antwort, das ist aber unschön hier dann festen Werte zu benutzen. Wenn \set fontSize = -3 mal mit einem anderen Zahlenwert belegt wird hat das die Änderung keine Auswirkung auf das Atemzeichen.
Könnte man das Atemzeichen nicht einfach mit einer klitzekleinen Zeitdauer belegen?

fugenkomponist

  • Member
Re: Atemzeichen kleiner setzen
« Antwort #3 am: Montag, 12. September 2016, 22:10 »
Danke für die Antwort, das ist aber unschön hier dann festen Werte zu benutzen. Wenn \set fontSize = -3 mal mit einem anderen Zahlenwert belegt wird hat das die Änderung keine Auswirkung auf das Atemzeichen.
Ich verstehe deinen Einwand ehrlich gesagt nicht: Du scheinst ja ansonsten auch mit \teeny zufrieden zu sein, welches nunmal einen festen Zahlenwert hat, der sich auch in zukünftigen LilyPond-Versionen sicher nicht ändern wird. Falls du aber eine Möglichkeit zur globalen Änderung haben willst, aber dir der \override ohne \once nicht ausreicht, solltest du sowieso eine eigene Funktion schreiben, dann ist es auch nicht komplizierter als mit \teeny. Ok, theoretisch könnte man \teeny überschreiben, aber ich würde dringend davon abraten, so an LilyPond-eigenen Funktionen ohne große Not was zu ändern statt eine eigene Funktion zu verwenden.
Zitat
Könnte man das Atemzeichen nicht einfach mit einer klitzekleinen Zeitdauer belegen?
Nein. \breathe erzeugt ein BreathingEvent, welches (anders als z. b. NoteEvent) kein rhythmic-event ist. Außerdem: Wo soll man die Zeit hernehmen? Das müsste dann ähnlich wie ein Vorschlag behandelt werden, aber nicht mit tatsächlichen Vorschlägen kollidieren. Das wäre schon ein extrem tiefer Eingriff in LilyPonds Struktur ohne echten Mehrwert.

harm6

  • Member
Re: Atemzeichen kleiner setzen
« Antwort #4 am: Montag, 12. September 2016, 23:13 »
Eine Funktion, die BreathingSign.font-size setzt aber trotzdem auch auf Änderungen von fontSize reagiert könnte so aussehen:

\version "2.19.47"

foo =
#(define-music-function (nmbr)(number?)
#{
  \applyOutput Score.BreathingSign
    #(lambda (grob in-ctx ctx)
      (ly:grob-set-property! grob 'font-size
        (+ (ly:context-property ctx 'fontSize 0) nmbr)))
#})

{ r1 \breathe r \foo #-3 \breathe r }
{ \set Score.fontSize = #-6 r1 \breathe r \foo #-3 \breathe r }
{ \set Score.fontSize = #6 r1 \breathe r \foo #-3 \breathe r }

Braucht allerdings eine neuere devel-Version.

Gruß,
  Harm

Manuela

  • Member
Re: Atemzeichen kleiner setzen
« Antwort #5 am: Dienstag, 13. September 2016, 07:13 »
Und wie kommt man darauf, dass man die Fontsize des Contextes verwenden muss und nicht die des Grobs? Ich hätte etwas in der Art von

(ly:grob-property grob 'font-size)
anstatt

(ly:context-property ctx 'fontSize 0)
versucht und wäre damit auf die Nase gefallen.

Ich hätte überhaupt etwas ganz anderes versucht, nämlich

\override BreathingSign.stencil = #(lambda (grob) ... )
Woher weiß man, dass applyOut verwendet werden muss?
« Letzte Änderung: Dienstag, 13. September 2016, 07:25 von Manuela »

harm6

  • Member
Re: Atemzeichen kleiner setzen
« Antwort #6 am: Dienstag, 13. September 2016, 10:32 »
Wenn man erreichen will, daß sich die veränderte font-size eines grobs mit veränderter genereller fontSize anpasst, so muß man in einer Funktion offensichtlich auf beide Werte Zugriff erlangen. Das eine ist aber ein grob-property das andere ein context-property.
Es gibt nur wenige Möglichkeiten dafür, darunter applyOutput, engraver selbst sowie ly:context-pushpop-property.

Zu applyOutput:
http://lilypond.org/doc/v2.19/Documentation/extending-big-page#running-a-function-on-all-layout-objects

Zu engraver:
Es gibt Doku im CG, aber das ist wirklich nichts für starter. Falls Du Dich damit beschäftigen willst, so studiere die Beispiele in den regression-tests, sowie auf den mailing-lists und hier im Forum.

ly:context-pushpop-property wird sehr selten verwendet, da kann ich Dir nur raten, such nach Beispielen auf den mailing-lists.
Ist aber auch wirklich mit Vorsicht zu genießen...


Gruß,
  Harm



Manuela

  • Member
Re: Atemzeichen kleiner setzen
« Antwort #7 am: Dienstag, 13. September 2016, 10:46 »
Wenn man erreichen will, daß sich die veränderte font-size eines grobs mit veränderter genereller fontSize anpasst, so muß man in einer Funktion offensichtlich auf beide Werte Zugriff erlangen. Das eine ist aber ein grob-property das andere ein context-property.

Ok da habe ich nicht genau genug gelesen. font-size <> fontSize, und es sollen beide Werte berücksichtigt werden.