stencil mit Farbe

Begonnen von erich, Dienstag, 5. Mai 2020, 14:30

« vorheriges - nächstes »

erich

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

Manuela

#1
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 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))
   )
Danke für eure Hilfe
viele Grüße
-- Manuela

Manuela

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
Danke für eure Hilfe
viele Grüße
-- Manuela

erich

#3
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


Manuela

Danke für deinen Beitrag.

Postscript ist eine interessante Möglichkeit, deren Syntax ich kaum kenne. Da werde ich mich mal schlau machen.
Danke für eure Hilfe
viele Grüße
-- Manuela

erich

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

Manuela

Danke für eure Hilfe
viele Grüße
-- Manuela

harm6

\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