Mit Textmarker in Noten zeichnen

Begonnen von thomas, Donnerstag, 23. März 2023, 16:25

« vorheriges - nächstes »

thomas

Hallo,

ich möchte Taktartwechsel, Tonartwechsel, Wiederholungen, Dal Segnos, Codas, usw. farblich markieren.

Im alten Forum habe ich das schon mal gefragt, und dabei folgende Lösung bekommen.
\version "2.20.0"

#(define* (emphasize-in-color color padding #:optional (y-padding 0) dir)
  (lambda (grob)
(let* ((stil (ly:grob-property grob 'stencil))
       (x-ext (ly:stencil-extent stil X))
       (y-ext (ly:stencil-extent stil Y))
       (item-break-dir
         (if (ly:item? grob)
             (ly:item-break-dir grob)
             #f))
       (stil-proc
         (lambda (stl)
           (ly:stencil-add
             (stencil-with-color
               (make-filled-box-stencil
                 (interval-widen x-ext padding)
                 (interval-widen y-ext (+ y-padding padding)))
               color)
             stl))))
       
  (ly:grob-set-property! grob 'layer -100)
  (ly:grob-set-property! grob 'stencil
    (if (or (or (not dir) (zero? dir))
            (and dir (equal? item-break-dir dir)))
        (stil-proc stil)
        stil)))))
{
c'1
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 0)
\repeat volta 2 {
  c'1
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 0)
}
c'1
\bar "|."
}

Mit dem Parameter "dir" kann man die Sichtbarkeit am Zeilenumbruch und Zeilenmitte einstellen.

Am Wiederholungsende ist "dir=0" gut.

Am Wiederholungsanfang ist "dir=0" gut, wenn die Wiederholung in die Zeilenmitte fällt. Wenn die Wiederholung aber am Zeilenanfang ist, wird auch der letzte Taktstrich in der Zeile davor markiert.
Mit "dir=1" wird zwar nur der Wiederholungs-Taktstrich am Zeilenanfang markiert. Wenn die Wiederholung jetzt aber in die Zeilenmitte fällt, wird der Taktstrich nicht mehr markiert.

Kann man die Wiederholungsanfangs-Taktstriche automatisch markieren, sowohl am Zeilenanfang als auch in der Zeilenmitte aber nicht am Zeilenende?

Gruß Thomas

PS:

Ich habe hier nochmal alle Kombinationen zusammengefasst:
\version "2.20.0"

#(define* (emphasize-in-color color padding #:optional (y-padding 0) dir)
  (lambda (grob)
(let* ((stil (ly:grob-property grob 'stencil))
       (x-ext (ly:stencil-extent stil X))
       (y-ext (ly:stencil-extent stil Y))
       (item-break-dir
         (if (ly:item? grob)
             (ly:item-break-dir grob)
             #f))
       (stil-proc
         (lambda (stl)
           (ly:stencil-add
             (stencil-with-color
               (make-filled-box-stencil
                 (interval-widen x-ext padding)
                 (interval-widen y-ext (+ y-padding padding)))
               color)
             stl))))
       
  (ly:grob-set-property! grob 'layer -100)
  (ly:grob-set-property! grob 'stencil
    (if (or (or (not dir) (zero? dir))
            (and dir (equal? item-break-dir dir)))
        (stil-proc stil)
        stil)))))


{
c'1
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 0)
\repeat volta 2 {
  c'1
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 0)
}
c'1
\bar "|."
}

\markup "Wiederholungsanfang"
{

c'1^"dir 0 \\noBreak" \noBreak
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 0)
\repeat volta 2 { c'1 }
    c'1^"dir 0 \\break" \break
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 0)
\repeat volta 2 { c'1 }
    c'1^"dir 1 \\noBreak" \noBreak
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 1)
\repeat volta 2 { c'1 }
    c'1^"dir 1 \\break" \break
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 1)
\repeat volta 2 { c'1 }
    c'1^"dir -1 \\noBreak" \noBreak
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 -1)
\repeat volta 2 { c'1 }
    c'1^"dir -1 \\break" \break
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 -1)
\repeat volta 2 { c'1 }
    c'1
\bar "|."

}
\markup "Wiederholungsende"

{
c'1
\repeat volta 2 {c'1^"dir 0 \\noBreak" } \noBreak
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 0)
c'1
\repeat volta 2 {    c'1^"dir 0 \\break" } \break
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 0)
c'1
\repeat volta 2 {    c'1^"dir 1 \\noBreak" } \noBreak
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 1)
c'1
\repeat volta 2 {    c'1^"dir 1 \\break" } \break
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 1)
c'1
\repeat volta 2 {    c'1^"dir -1 \\noBreak" } \noBreak
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 -1)
c'1
\repeat volta 2 {    c'1^"dir -1 \\break" } \break
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 -1)
c'1
\bar "|."
}

Du darfst diesen Dateianhang nicht ansehen.



juergen74

Hallo,

"dir = 2" entspricht jetzt "Anfang und Mitte". Den Ausdruck "or (not dir)" habe ich nicht berücksichtigt, das wäre nur relevant wenn auch "dir = ##f" zulässig sein soll (oder habe ich da einen Denkfehler?).

\version "2.24.0"

#(define* (emphasize-in-color color padding #:optional (y-padding 0) dir)
   (lambda (grob)
     (let* ((stil (ly:grob-property grob 'stencil))
            (x-ext (ly:stencil-extent stil X))
            (y-ext (ly:stencil-extent stil Y))
            (item-break-dir
             (if (ly:item? grob)
                 (ly:item-break-dir grob)
                 #f))
            (stil-proc
             (lambda (stl)
               (ly:stencil-add
                (stencil-with-color
                 (make-filled-box-stencil
                  (interval-widen x-ext padding)
                  (interval-widen y-ext (+ y-padding padding)))
                 color)
                stl))))

       (ly:grob-set-property! grob 'layer -100)

       ; dir -1  => end only
       ; dir  0  => always
       ; dir  1  => start only
       ; dir  2  => start and center
       ; else    => never
       (ly:grob-set-property! grob 'stencil
         (case dir
           ((-1) (if(= item-break-dir -1)
                    (stil-proc stil)
                    stil))
           ((0)  (stil-proc stil))
           ((1) (if (= item-break-dir 1)
                    (stil-proc stil)
                    stil))
           ((2) (if (= item-break-dir -1)
                    stil
                    (stil-proc stil)))           
           (else stil))))))


   {
   c'1
   \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 2)
   \repeat volta 2 {
   c'1
   \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 2)
   }
   c'1
   \bar "|."
   }

   \markup "Wiederholungsanfang"
   {

   c'1^"dir 2 \\noBreak" \noBreak
   \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 2)
   \repeat volta 2 { c'1 }
   c'1^"dir 2 \\break" \break
   \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 2)
   \repeat volta 2 { c'1 }
   c'1^"dir 2 \\noBreak" \noBreak
   \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 2)
   \repeat volta 2 { c'1 }
   c'1^"dir 2 \\break" \break
   \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 2)
   \repeat volta 2 { c'1 }
   c'1^"dir 2 \\noBreak" \noBreak
   \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 2)
   \repeat volta 2 { c'1 }
   c'1^"dir 2 \\break" \break
   \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 2)
   \repeat volta 2 { c'1 }
   c'1
   \bar "|."

   }
   \markup "Wiederholungsende"

   {
   c'1
   \repeat volta 2 {c'1^"dir 0 \\noBreak" } \noBreak
   \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 0)
   c'1
   \repeat volta 2 {    c'1^"dir 0 \\break" } \break
   \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 0)
   c'1
   \repeat volta 2 {    c'1^"dir 1 \\noBreak" } \noBreak
   \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 1)
   c'1
   \repeat volta 2 {    c'1^"dir 1 \\break" } \break
   \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 1)
   c'1
   \repeat volta 2 {    c'1^"dir -1 \\noBreak" } \noBreak
   \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 -1)
   c'1
   \repeat volta 2 {    c'1^"dir -1 \\break" } \break
   \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 -1)
   c'1
  \repeat volta 2 {    c'1^"dir 2 \\noBreak" } \noBreak
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 -2)
  c'1
  \repeat volta 2 {    c'1^"dir 2 \\break" } \break
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-color red 0.2 1 2)
  c'1
  \bar "|."
}

ZitatWenn die Wiederholung aber am Zeilenanfang ist, wird auch der letzte Taktstrich in der Zeile davor markiert.
Das Wiederholungszeichen wird "umgebrochen" und die Funktion emphasize-in-color zweimal aufgerufen. Einmal für "|" und einmal für ".|:". Mit dir = 0 werden dann beide Zeichen farblich markiert.

Wenn benötigt könnte man über (ly:grob-property grob 'glyph-name) einzelne Zeichen direkt bearbeiten.

Grüße, Jürgen.




thomas

Dass der Taktstrich am Ende nicht mehr markiert wird, funktioniert. Danke.


Nächstes Problem:
Kann man bei \bar "S.|:" erreichen, dass das Segno in einer anderen Farbe markiert wird, als die Wiederholung? (Ohne Bildbearbeitung)
Du darfst diesen Dateianhang nicht ansehen.

ZitatWenn benötigt könnte man über (ly:grob-property grob 'glyph-name) einzelne Zeichen direkt bearbeiten.
Kann das dabei helfen?

juergen74

Hallo!
\version "2.24.0"


#(define* (emphasize-in-two-colors c1 c2 center-offset padding #:optional (y-padding 0) dir)
   (lambda (grob)
     (let* ((stil (ly:grob-property grob 'stencil))
            (x-ext (ly:stencil-extent stil X))
            (y-ext (ly:stencil-extent stil Y))
            (item-break-dir
             (if (ly:item? grob)
                 (ly:item-break-dir grob)
                 #f))           
            (stil-proc empty-stencil))

       (set! stil-proc
             (lambda (stl)
               (ly:stencil-add
                (stencil-with-color
                 (make-filled-box-stencil
                  (cons (- (car x-ext) padding) center-offset)
                  (interval-widen y-ext  y-padding))
                 c1)
                (ly:stencil-add
                 (stencil-with-color
                  (make-filled-box-stencil
                   (cons center-offset (+ (cdr x-ext) padding))
                   (interval-widen (ly:bar-line::calc-bar-extent grob) y-padding))
                  c2)
                 stl))))

       (ly:grob-set-property! grob 'layer -100)

       ; dir -1  => end only
       ; dir  0  => always
       ; dir  1  => start only
       ; dir  2  => start and center
       ; else    => never
       (ly:grob-set-property! grob 'stencil
         (case dir
           ((-1) (if(= item-break-dir -1)
                    (stil-proc stil)
                    stil))
           ((0)  (stil-proc stil))
           ((1) (if (= item-break-dir 1)
                    (stil-proc stil)
                    stil))
           ((2) (if (= item-break-dir -1)
                    stil
                    (stil-proc stil)))
           (else stil))))))

\relative c' {
  c1
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-two-colors  green red -0.2 0.5 0.5 2)
  \bar "S.|:"
  c1
  \once \override Staff.BarLine.after-line-breaking = #(emphasize-in-two-colors  red red -0.2 0.5 0.5 2)
  \bar ":|."
  c1
}

So richtig schön ist das aber nicht. Zu viel hart codiert...
Der Parameter nach den beiden Farben dient dazu den Farbübergang auf der x-Achse zu verschieben. Könnte vielleicht direkt mit "bar-line::compound-bar-line" in "bar-lines.scm" berechnet werden.

Aber:
ZitatNächstes Problem:
Wieviele Probleme kommen denn noch?  ;)

Vielleicht kannst du ja nochmal in einem Beispiel zusammenfassen, was du alles wie benötigst(?) Vermutlich willst du auch nicht jedes Symbol einzeln mit "\once \override ..." formatieren? Und für jeden Sonderfall eine eigene Funktion ist auch nicht sinnvoll.

Alternativ direkt ein "Highlight-Engraver"?
\version "2.24.0"

#(define (highlightEngraver context)
   (make-engraver
    (acknowledgers

     ((bar-line-interface engraver grob source-engraver)
      (ly:grob-set-property! grob 'before-line-breaking
        (lambda (g)


          (ly:grob-set-property! g 'stencil
            (ly:stencil-in-color
             (ly:bar-line::print g)
             "red" )))))

     ((coda-mark-interface engraver grob source-engraver)
      (ly:grob-set-property! grob 'stencil
        (ly:stencil-in-color
         (ly:text-interface::print grob)
         "orange" )))

     ((clef-interface engraver grob source-engraver)
      (ly:grob-set-property! grob 'stencil
        (ly:stencil-in-color
         (ly:clef::print grob)
         "turquoise" )))
     ((clef-modifier-interface engraver grob source-engraver)
      (ly:grob-set-property! grob 'stencil
        (ly:stencil-in-color
         (ly:text-interface::print grob)
         "turquoise" )))


     ((key-signature-interface engraver grob source-engraver)
      (ly:grob-set-property! grob 'stencil
        (ly:stencil-in-color
         (ly:key-signature-interface::print grob)
         "cyan" )))

     ((rehearsal-mark-interface engraver grob source-engraver)
      (ly:grob-set-property! grob 'stencil
        (ly:stencil-in-color
         (ly:text-interface::print grob)
         "green" )))

     ((segno-mark-interface engraver grob source-engraver)
      (ly:grob-set-property! grob 'stencil
        (ly:stencil-in-color
         (ly:text-interface::print grob)
         "magenta" )))

     ((section-label-interface engraver grob source-engraver)
      (ly:grob-set-property! grob 'stencil
        (ly:stencil-in-color
         (ly:text-interface::print grob)
         "green" )))

     ;  ((text-interface engraver grob source-engraver)
     ;   (ly:grob-set-property! grob 'stencil
     ;     (ly:stencil-in-color
     ;      (ly:text-interface::print grob)
     ;      "green" )))

     ((time-signature-interface engraver grob source-engraver)
      (ly:grob-set-property! grob 'stencil
        (ly:stencil-in-color
         (ly:time-signature::print grob)
         "grey" )))

     ((accidental-interface engraver grob source-engraver)
      (ly:grob-set-property! grob 'stencil
        (ly:stencil-in-color
         (ly:accidental-interface::print grob)
         "blue" ))))))

\layout {
  \context {
    \Score
    \consists #highlightEngraver
  }
}
music = \fixed c' {
  \key e \major
  f1
  \repeat segno 2 {
    g1
    \alternative {
      \volta 1 { \repeat unfold 4 { a2 } }
      \volta 2 \volta #'() {

        \section
        \sectionLabel "Coda"
      }
    }
  }
  b1
  \fine
}
\score {  \music }
\score { \unfoldRepeats \music }


Grüße, Jürgen.