Autor Thema: Systeme farbig hinterlegen: Problem mit scheme  (Gelesen 1280 mal)

Pusteblumi

  • Member
Systeme farbig hinterlegen: Problem mit scheme
« am: Donnerstag, 27. November 2014, 00:25 »
Hallo miteinander,

ich sitze vor einem kniffeligen Problem:

Ich möchte gerne für Analysezwecke die Noten stellenweise farbig hinterlegen. Hier ein erster Versuch:
\version "2.18.0"

{
  << { R1 c'2 g' c' r R1 }
     \\
     {
       \override Voice.ClusterSpanner.color = #(rgb-color 0.5 0.6 1)
       \override Voice.ClusterSpanner.layer = #-1
       \makeClusters { s1 c'2 g' c' s s1 }
     }
     \\
     {
       \override Voice.ClusterSpanner.color = #(rgb-color 1.0 0.9 0.5)
       \override Voice.ClusterSpanner.layer = #-2
       \makeClusters { s1 <g c'''> q4 q2. s1 }
     }
  >>
}


Die blaue Linie, die die Notenköpfe verbindet, besteht aus zweckentfremdeten Clustern. Damit sie die Noten und Notenlinien nicht verdeckt, ist sie in die Ebene "-1" verschoben.

Auch der gelbe Hintergrund besteht aus einem Cluster in Ebene "-2". Das kann aber auch Nachteile haben.
Praktischer wäre für mich eine scheme-Funktion, die ich (leicht modifiziert) aus dem Lilypond Snippet 726 "Coloring staves" übernommen habe:
\version "2.18.0"

bgColor =
#(define-music-function (parser location y-lower y-upper color) (number? number? string?)
   #{\stopStaff
     \override Staff.StaffSymbol $'stencil =
     $(lambda (grob)
        (let* ((staff (ly:staff-symbol::print grob))
               (X-ext (ly:stencil-extent staff X))
               (Y-ext (ly:stencil-extent staff Y)))
          (set! Y-ext (cons
                       (- (car Y-ext) y-lower)
                       (+ (cdr Y-ext) y-upper)))
          (ly:grob-set-property! grob 'layer -10)
          (ly:stencil-add
           (ly:make-stencil (list 'color (eval-string color)
                              (ly:stencil-expr (ly:round-filled-box X-ext Y-ext 0))
                              X-ext Y-ext))
           staff)))
     \startStaff
   #})

{
  << { R1
       \bgColor #3 #3 "(rgb-color 1.0 0.9 0.5)" c'2 g' c'
       \bgColor #0 #0 "white" r R1 }
     \\
     {
       \override Voice.ClusterSpanner.color = #(rgb-color 0.5 0.6 1)
       \override Voice.ClusterSpanner.layer = #-1
       \makeClusters { s1 c'2 g' c' s s1 }
     }
  >>
}

Hier kommt das Problem:
Die Notenlinien und das gelbe Rechteck liegen in derselben Ebene, und es ist jetzt nicht mehr möglich, den blauen Cluster dazwischen zu platzieren.

Ich bin mit scheme hoffnungslos überfordert... Soweit ich verstanden habe, fügt die Funktion zum ursprünglichen StaffSymbol zusätzlich ein farbiges Rechteck hinzu.
Ist es möglich, die scheme-Funktion so zu ändern, dass StaffSymbol und Rechteck in verschiedenen Ebenen abgelegt werden?


Danke im Voraus!

Viele Grüße,
Klaus