Deutsches Lilypond Forum (Archiv)
Allgemein => Fragen zu Funktionen => Thema gestartet von: Manuela am Freitag, 29. Juli 2016, 21:30
-
Mit #(set-global-staff-size 18) kann man die Größe von Noten, Notenlinienabständen etc. global festlegen. Nun ist es so, dass mir das Druckbild ein wenig zu "fett" erscheint, ich möchte gerne die Linien eine Spur zarter ausgedruckt haben.
Ich vermute, dass es dafür eine Variable gibt, line-thickness oder so ähnlich. Leider habe ich nichts konkrektes gefunden.
-
Ganz so einfach ist es nicht: Einige Linienstärken hängen (mit einem per override veränderbaren Faktor) von StaffSymbol.thickness ab, so z. B. Hälse, Bögen, Glissandi, Textspanner, Crescendogabeln, Ottavaklammern, … Andere wiederum brauchen eigene Einstellungen, z. B. Taktstriche und Anfangsstriche, Balken, Wiederholungsklammern, Striche im Liedtext. Diese sind teilweise Vielfache von staffspace (z. B. bei Balken), teilweise Vielfache vom Standardwert von StaffSymbol.thickness (ohne dass sie sich mitskalieren, wenn von diesem Standardwert abgewichen wird). Die Standardwerte und was wovon abhängt, findet man in der Internals Reference.
\version "2.19.46"
\language "deutsch"
\layout {
\context {
\Staff
\override StaffSymbol.thickness = 5
\override BarLine.hair-thickness = 8
\override BarLine.thick-thickness = 20
\override Beam.beam-thickness = 2
}
\context {
\Lyrics
\override LyricHyphen.thickness = 5
\override LyricExtender.thickness = 5
}
\context {
\Score
\override VoltaBracket.thickness = 5
\override SystemStartBar.thickness = 8
\override SystemStartBracket.thickness = 1
}
}
\new StaffGroup <<
\relative {
c' d e( f~) f g a \glissando c,
f8\< g a h c16\!\startTextSpan d e f g4\stopTextSpan
\bar "|."
\ottava 1
\repeat volta 2 { g a h c \ottava 0 }
\alternative { d1 e }
}
\addlyrics {
i -- i i __
}
\relative {
\repeat unfold 6 c1
}
>>
-
Ganz so einfach ist es nicht: .... Diese sind teilweise Vielfache von staffspace (z. B. bei Balken), teilweise Vielfache vom Standardwert von StaffSymbol.thickness (ohne dass sie sich mitskalieren, wenn von diesem Standardwert abgewichen wird). Die Standardwerte und was wovon abhängt, findet man in der Internals Reference.
Das hatte ich befürchtet, danke für die Info.
Könnte man nicht sowas definieren:
#(define my-line-factor 0.9)
\layout {
\context {
\Staff
\override BarLine.hair-thickness = #(* my-line-factor BarLine.hair-thickness)
...
Es scheitert natürlich daran, dass ich nicht weiß, wie ich den aktuellen Wert BarLine.hair-thicknes als Scheme-Variable referenzieren kann.
-
#(define my-line-factor 0.9)
\layout {
\context {
\Staff
\override BarLine.hair-thickness = #(* my-line-factor BarLine.hair-thickness)
...
Es scheitert natürlich daran, dass ich nicht weiß, wie ich den aktuellen Wert BarLine.hair-thicknes als Scheme-Variable referenzieren kann.
An dieser Stelle noch gar nicht: Versuche wie \override VoltaBracket.thickness =
#(lambda (grob)
(let ((thickness (ly:grob-property grob 'thickness)))
(* thickness factor)))scheitern daran, dass 'thickness noch nicht bekannt ist (es gibt eine Fehlermeldung, dass eine Multiplikation mit calculation-in-progress nicht möglich ist). Das Problem ist hier auch, anders als ich dachte, nicht, dass thickness nichts mit (lambda (grob) …) anfangen könnte, wie folgendes (unsinniges) Beispiel demonstriert:
\override VoltaBracket.thickness =
#(lambda (grob)
(ly:grob-set-property! grob 'color red)
5)Das setzt tatsächlich die thickness auf 5 und die Farbe auf rot. Grundsätzlich ist also eine solche Funktion an dieser Stelle möglich.
Stattdessen musst du before-line-breaking bemühen:
\version "2.19.46"
#(define factor 2.5)
#(define scale-hair-and-thick-thickness
(lambda (grob)
(let ((hair-thickness (ly:grob-property grob 'hair-thickness))
(thick-thickness (ly:grob-property grob 'thick-thickness)))
(ly:grob-set-property! grob 'hair-thickness (* hair-thickness factor))
(ly:grob-set-property! grob 'thick-thickness (* thick-thickness factor)))))
#(define scale-thickness
(lambda (grob)
(let ((thickness (ly:grob-property grob 'thickness)))
(ly:grob-set-property! grob 'thickness (* thickness factor)))))
\layout {
\context {
\Staff
\override BarLine.before-line-breaking = #scale-hair-and-thick-thickness
}
\context {
\Score
\override VoltaBracket.before-line-breaking = #scale-thickness
}
}
\relative {
c' d e f
g2 g
\repeat volta 2 {
a4 a a a
}
\alternative { g1 g }
}Ich hab hier mal die beiden Funktionen ausgelagert, damit sie wiederverwendbar sind.
-
Warum man "before-line-breaking" bemühen muss, leuchtet mir aufs erste Hinsehen nicht ein, dazu blicke ich mich einfach zu wenig durch :(
Und was ist mit den Grobs, die kein line-breaking haben, wie slurs und beams? Oder sind das keine Grobs, sondern stencils? *confused*
-
Warum man "before-line-breaking" bemühen muss, leuchtet mir aufs erste Hinsehen nicht ein, dazu blicke ich mich einfach zu wenig durch :(
Leuchtet dir denn ein, warum man das nicht in thickness selbst machen kann?
Und was ist mit den Grobs, die kein line-breaking haben, wie slurs und beams? Oder sind das keine Grobs, sondern stencils? *confused*
Die ganze Sache hat erstmal nichts damit zu tun, ob ein Grob durch nen Zeilenumbruch beeinflusst werden kann; before-line-breaking und after-line-breaking sind Teil des grob-interfaces, also setzbar für alle Grobs, die dieses Interface erfüllen (und das sind soweit ich weiß alle). Diese grob properties können quasi auf beliebige Funktionen gesetzt werden, die irgendwas anstellen (in der Regel natürlich mit dem Grob, muss aber nicht zwingend sein). Die Namen kommen nur daher, wann diese Funktionen aufgerufen werden*. Manche Sachen können logischerweise erst nach dem Berechnen der Zeilenumbrüche passieren (wie z. B. das Verschieben der Einzelteile eines Spanners (OttavaBracket, Slur, …)), andere müssen davor passieren (so eben auch das Setzen der thickness; vermutlich, weil die Breite der Taktstriche ja im Extremfall schon beeinflusst, wie viele Takte man in einer Zeile unterbringen kann).
*gefährliches Halbwissen, die Internals Reference ist da nicht sehr ausführlich, aber das ist so das, was ich mal gehört hab.
Edit: Zum Thema grob/stencil: Ein Grob ist ein Objekt (meistens sichtbar, daher der Name graphical object, es gibt aber Ausnahmen wie z. B. NoteCollision). Das existiert erstmal als abstraktes Konstrukt. Es hat Eigenschaften wie eine Position, eine Größe, eine Farbe. Und einen stencil. Der stencil ist dann erst die Form, die tatsächlich zu Papier gebracht wird. Im Fall von NoteHead ist das z. B. standardmäßig ein Notenkopf aus dem Feta-Font (welcher, ist abhängig von der Eigenschaft duration-log), der stencil kann aber mit einem override Überschrieben werden.
-
fugenkomponist, ganz herzlichen Dank für deine Hilfe und deine Bemühungen. Ich glaube, mein Hirn ist momentan ein wenig widerspenstig ;), außerdem hat diese Sache nicht unbedingt höchste Priorität. Wenn es nicht relativ einfach geht, werde ich nicht wochenlang Zeit in dieses Problem investieren. In ein paar Monaten kenne ich mich möglicherweise gut genug aus, um eine Lösung zu finden.
Mein Halbwissen ist jedenfalls wahnsinnig gefährlich, Lilypond sollte sich wirklich in acht nehmen ;D
Update: ich habe zu kompliziert gedacht, es genügt, StaffSymbol.thickness zu ändern, viele Dicken richten sich danach.