Deutschsprachiges LilyPond-Forum

Allgemeine Fragen und Probleme => Fragen und Probleme aller Art => Thema gestartet von: erich am Dienstag, 5. Mai 2020, 14:30

Titel: stencil mit Farbe
Beitrag von: erich am Dienstag, 5. Mai 2020, 14:30
Hallo allen!

Nachdem mir Manuela auf die Sprünge geholfen hat, möchte ich nun auch noch die Farbe des Kopfes wählen können:

Die Definition für den Kopf lautet :

testKopf =
  \override Staff.Clef.stencil =
#(lambda (grob)
     (ly:stencil-translate-axis           
  (ly:stencil-translate-axis
  (ly:stencil-scale
    (grob-interpret-markup grob
           
      (markup #:override '(filled . #t)
         
          #:path 0 testkopf))
    -0.18
    0.18)
    6.0 X)
        0.2 Y)
        )
   
testkopf =
#'(
   (moveto 3.773 12.859)
   (curveto 0.332 12.301 -0.902 9.32 1.016 6.199)
   (curveto 2.938 3.074 7.285 0.992 10.734 1.543)
   (curveto 14.184 2.09 15.43 5.066 13.5 8.203)
   (curveto 11.57 11.344 7.219 13.418 3.773 12.859)
   (closepath)
   )

und wird mit dem Script

\version "2.20.0"
\include "/home/erich/Test/testKopf.ly"
\score {
  \new Staff \with {\testKopf
                    \remove "Time_signature_engraver"}
  \new Voice {s}
}

ausgegeben.

Wie kann ich nun die Farbe für den Kopf festsetzen?

Gruß
Erich
Titel: Antw:stencil mit Farbe
Beitrag von: Manuela am Dienstag, 5. Mai 2020, 16:36
testKopf =
\override Staff.Clef.stencil =
#(lambda (grob)
   (ly:stencil-in-color
    (ly:stencil-translate-axis
     (ly:stencil-translate-axis
      (ly:stencil-scale
       (grob-interpret-markup grob
         (markup #:override '(filled . #t)
           #:path 0 testkopf))
       -0.18
       0.18)
      6.0 X)
     0.2 Y)
    1 0 1)
   )


Anzugeben sind die drei Werte für R, G, B als Bruchteile von 1. Ein bisschen umständlich.

Falls du X11-Farben (http://lilypond.org/doc/v2.20/Documentation/notation/list-of-colors.en.html) verwenden willst, kannst du etwa folgendes machen:
#(define kopf-color (x11-color 'yellow))

testKopf =
\override Staff.Clef.stencil =
#(lambda (grob)
   (ly:stencil-in-color
    (ly:stencil-translate-axis
     (ly:stencil-translate-axis
      (ly:stencil-scale
       (grob-interpret-markup grob
         (markup #:override '(filled . #t)
           #:path 0 testkopf))
       -0.18
       0.18)
      6.0 X)
     0.2 Y)
    (first kopf-color) (second kopf-color) (third kopf-color))
   )
Titel: Antw:stencil mit Farbe
Beitrag von: Manuela am Dienstag, 5. Mai 2020, 19:00
Eine andere Variante wäre noch
\score {
  \new Staff \with {
    \override Clef.color = #green
    \testKopf
    \remove "Time_signature_engraver"
  }
  \new Voice {s}
}


wobei natürlich die "ungefärbte"  Version des Codes verwendet werden muss
Titel: Antw:stencil mit Farbe
Beitrag von: erich am Mittwoch, 6. Mai 2020, 08:01
Hallo Manuela,

vielen Dank für Deine Hilfe. Ich bin jedoch zu einer schon früher verwendeten Möglichkeit zurückgekehrt.
Ich halte es für einfacher, alles in PostScript zu formulieren:
-  Farben können bequem formuliert werden
-  Figuren können bequem übereinander positioniert werden

Das Script für den Kopf,  hier um den kleineren überlagerten erweitert

\version "2.20.0"

headClef = \markup \postscript #"
.1 .1 scale
8 15 translate
gsave
newpath
0 setgray
1 0 0 -1 0 13 6 array astore concat gsave
3.773 12.859 moveto
0.332 12.301 -0.902 9.32 1.016 6.199 curveto
2.938 3.074 7.285 0.992 10.734 1.543 curveto
14.184 2.09 15.43 5.066 13.5 8.203 curveto
11.57 11.344 7.219 13.418 3.773 12.859 curveto
closepath
3.773 12.859 moveto
fill
1 0 0 1 2.5 3.5 6 array astore concat gsave
newpath
1 setgray
2.449 7.609 moveto
0.168 7.207 -0.668 5.199 0.578 3.121 curveto
1.82 1.039 4.68 -0.328 6.965 0.066 curveto
9.246 0.461 10.094 2.469 8.84 4.559 curveto
7.59 6.648 4.73 8.008 2.449 7.609 curveto
closepath
2.449 7.609 moveto fill
grestore "


und die Verwendung zeigt dann das Script

\version "2.20.0"
\include "/home/erich/Test2/headClef.ly"
\score {
  \new Staff \with {\remove "Time_signature_engraver"
                    clefGlyph = ##f}
  \new Voice {\override Staff.Clef #'stencil = #ly:text-interface::print
              \override Staff.Clef #'text = \headClef
              s}
}


Vielleicht hilft dieses auch anderen, darum beschreibe ich es hier.
Gruß
Erich

Titel: Antw:stencil mit Farbe
Beitrag von: Manuela am Mittwoch, 6. Mai 2020, 09:59
Danke für deinen Beitrag.

Postscript ist eine interessante Möglichkeit, deren Syntax ich kaum kenne. Da werde ich mich mal schlau machen.
Titel: Antw:stencil mit Farbe
Beitrag von: erich am Mittwoch, 6. Mai 2020, 17:50
Hallo Manuela

Zitat
Postscript ist eine interessante Möglichkeit, deren Syntax ich kaum kenne.

kurz zur Ergänzung:
Ich kenne die Syntax auch nicht so genau; ich konstruiere die Darstellung in Inkscape und übersetze dann nach PostScript. Soll ich das mal ausführlicher darstellen?

Gruß
Erich
Titel: Antw:stencil mit Farbe
Beitrag von: Manuela am Donnerstag, 7. Mai 2020, 18:40
Bitte drum  :)
Titel: Antw:stencil mit Farbe
Beitrag von: harm6 am Donnerstag, 7. Mai 2020, 22:17
\postscript als markup hat so seine Eigenheiten, z.B.
\markup \box \postscript #"0.15 setlinewidth 0 0 moveto 10 0 lineto stroke"

Es wird keine Ausdehnung gesetzt!
Das hat massive Nachteile!

Auch bezweifel ich das Farben wirklich bequemer gesetzt werden. Denn man muß eine neue Syntax lernen.
Manuelas \override Clef.color = #green ist LilyPond-default-Syntax, warum etwas anderes?
Im übrigen gibt es auch das with-color-markup oder stencil-with-color.
All diese Befehle könnte man ebenso bequem eingesetzt haben.

Natürlich ist es tatsächlich leicht den mit einem Programm wie inkscape erstellten postscript-code einfach reinzukopieren.
Aber fertig ist man damit ja noch nicht. Siehe oben zu den Nachteilen.
Tatsächlich habe ich in Erichs Code eine Note statt des spacers eingesetzt: Sie verschwand auf nimmer wiedersehen.
Ich habe keine Ahnung wie das passieren kann und auch nicht die Energie nachzuforschen...

Aber meine Erfahrung ist das nativer postscript in markup stets mit äußerster Vorsicht zu genießen ist.


Gruß,
  Harm

P.S.
Statt (ly:stencil-translate-axis (ly:stencil-translate-axis stencil X ... ) Y ... ) gibt es a
(ly:stencil-translate stencil '(x . y))

Wenn ich code sehe der postscript verwendet aber noch zusätzlich ein äußeres scale sowie Versetzungen in X- und Y-Achse, dann erscheint mir das Ganze nicht ausgereift...

Sorry