Autor Thema: Wiederholungszeichen am Anfang mit roter Farbe setzen  (Gelesen 1449 mal)

erich

  • Member
Wiederholungszeichen am Anfang mit roter Farbe setzen
« am: Dienstag, 17. Juli 2012, 15:50 »
Musizierende kennen das Problem: Wo beginnt doch die Wiederholung? Man nimmt einen Bleistift und hebt die Stellen hervor. Ich möchte in den Stimmen das Zeichen am Anfang einer Wiederholung  in roter Farbe setzen; dieses lässt sich weitgehend durch die Anweisung:
\once \override Staff.BarLine #'color = #red   
erreichen; aber leider nicht überall, wie mir scheint. Das Problem tritt auf bei dem Versuch \bar ":|.|:" zu trennen in \bar ":|" \bar "|:", um dann nur das zweite Zeichen in roter Farbe zu setzen.

Mir ist dazu nur die Möglichkeit \bar ":|" \once \override Staff.BarLine #'color = #red \grace{s} \bar "|:" eingefallen. Dadurch entsteht aber zwischen den beiden Zeichen ein kleiner Zwischenraum. Kennt jemand eine bessere Lösung für dieses Problem?

Beispiel:

{\version "2.14"
\relative c'{ c1 \bar ":|.|:" d
e1
\bar ":|" \once \override Staff.BarLine #'color = #red \grace{s} \bar "|:"
f1}}

harm6

  • Member
Re: Wiederholungszeichen am Anfang mit roter Farbe setzen
« Antwort #1 am: Dienstag, 17. Juli 2012, 19:42 »
Hallo erich,

willkommen im Forum.


Zum Problem:

Erst mal etwas Hintergrund:
Zur Zeit macht LilyPond aus der Anweisung \bar ":|.|:" einen Stencil. Diesen kann man aber nicht zur Hälfte einfärben. Der entsprechende Code ist in den .cc-Dateien weggeschlossen und damit nicht für den Benutzer zugänglich.
Ich schrieb "zur Zeit", denn Marc Hohl, Arnold und ich, wir versuchen die BarLines aus der Versenkung in C++ herauszuholen, also nach scheme zu portieren, und als zweiten Schritt die ganze Erstellung der BarLines zu ändern, sodaß jeder Benutzer-definierte Code akzeptiert werden kann.
Wenn es Dich interessiert, die Portierung C++ -> scheme kann man hier verfolgen. Das neue (und noch stark zu verbessernde user-interface) habe ich erstmalig hier gepostet.
Das ganze wird aber noch eine Weile dauern bis es reif ist in den source-code implementiert zu werden.

Teilweiser work-around:
Im Moment ist die einzige Möglichkeit Dein Ziel zu erreichen, eine Neu-konstruktion des BarLine-stencil.

Schau mal wie Dir das Ergebnis gefällt. Der Haken ist, daß es mit SpanBars nicht funktioniert (massive Verschiebungen!).
Falls Dir ansonsten irgendwelche Details nicht gefallen, so könnte ich sie ja ändern.

\version "2.14.2"
                     
#(define (make-simple-bar-line grob width extent rounded)
   (let* ((height (interval-length extent))
          (blot-diameter (if rounded
                             (ly:output-def-lookup (ly:grob-layout grob) 'blot-diameter)
                             0)))
   (ly:round-filled-box (cons 0 width)
                           extent
                           blot-diameter)))
     
#(define (make-thick-bar-line grob width extent rounded)
   (let* ((staff-line-thickness (ly:staff-symbol-line-thickness grob))
          (fatline (* (ly:grob-property grob 'thick-thickness 1) staff-line-thickness)))
   (make-simple-bar-line grob fatline extent rounded)))
   
#(define (make-colon-bar-line grob)
   (let* ((dot (ly:font-get-glyph (ly:grob-default-font grob) "dots.dot"))
          (staff-symbol (ly:grob-object grob 'staff-symbol))
          (line-count (ly:grob-property staff-symbol 'line-count 0))
          (staff-space (ly:staff-symbol-staff-space grob))
          (dist (cond ((odd? line-count) 1)
                      ((= line-count 0) 1)
                      ((< staff-space 2) (* 2 staff-space))
                      (else (* 0.5 staff-space))))
          (colon empty-stencil))
     (set! colon (ly:stencil-add colon dot))
     (set! colon (ly:stencil-translate-axis colon dist Y))
     (set! colon (ly:stencil-add colon dot))
     (set! colon (ly:stencil-translate-axis colon (/ dist -2) Y))
     colon))
   
#(define (repeat-left grob kern width extent rounded)
 (ly:stencil-combine-at-edge
   (ly:stencil-combine-at-edge
      (make-colon-bar-line grob)
      X RIGHT
        (make-simple-bar-line grob width extent rounded)
        kern)
    X RIGHT
    (make-thick-bar-line grob width extent rounded)
    kern))
     
#(define (repeat-right grob kern width extent rounded)
  (ly:stencil-scale
    (repeat-left grob kern width extent rounded)
       -1 1))
       
#(define (double-repeat-color-right grob)
    (let* ((staff-line (ly:output-def-lookup (ly:grob-layout grob) 'line-thickness))
           (kern (* (ly:grob-property grob 'kern) staff-line))
           (width (* (ly:grob-property grob 'hair-thickness) staff-line))
           (extent (ly:grob-property grob 'bar-extent)))
           
 (ly:stencil-combine-at-edge
      (repeat-left grob kern width extent #t)
      X RIGHT
      (ly:stencil-in-color
        (repeat-right grob kern width extent #t)
        1 0 0)
      kern)))
     
#(define (double-repeat-color-left grob)
  (ly:stencil-scale
     (double-repeat-color-right grob )
     -1 1))
     
repeatBarColorRight =
\once \override Staff.BarLine #'stencil = #double-repeat-color-right
   
repeatBarColorLeft =
\once \override Staff.BarLine #'stencil = #double-repeat-color-left
     

\relative c' {
        c1
        d
        \repeatBarColorRight
        e
        f
        \repeatBarColorLeft
        g
}

HTH,
  Harm
« Letzte Änderung: Dienstag, 17. Juli 2012, 19:45 von harm6 »

erich

  • Member
Re: Wiederholungszeichen am Anfang mit roter Farbe setzen
« Antwort #2 am: Donnerstag, 19. Juli 2012, 12:53 »
Hallo Harm!

Vielen Dank für den Willkommensgruß und die Antwort auf meine Frage;
das ist zumindest ein work-around mit dem ich arbeiten kann!

Ich hatte mir die Lösung jedoch ganz anders vorgestellt; denn das Einfügen von \grace{s} führt zumimdest dazu,
dass die Widerholungsphrasen getrennt werden jedoch mit einem sichtbaren Abstand.  Mir schwebte vor, ein Dummy der
Länge Null einzufügen; denn wenn man \grace{s} fortlässt, wird \bar ":|" nicht dargestellt

Man kann in LilyPond schreiben:

\version "2.14.2"
\score {
  \new Voice {
      c'1
     \displayMusic{ \set Score.repeatCommands = #'(end-repeat dummy start-repeat ) }
      d'1
  }
}
{c'1
\set Score.repeatCommands = #'(end-repeat dummy start-repeat)
d'}

und erhält dann einerseits eine korrekte Darstellung in schwarzer Farbe.

Für das MusikObjet erhält man:
(make-music
  'SequentialMusic
  'elements
  (list (make-music
          'ContextSpeccedMusic
          'context-type
          'Score
          'element
          (make-music
            'PropertySet
            'value
            (list 'end-repeat
                  'dummy
                  'start-repeat)
            'symbol
            'repeatCommands))))

Meine Frage ist nun: kann man dummy zu einer Funktion erweitern, die eine Farbumstellung bewirkt?

MfG
Erich


harm6

  • Member
Re: Wiederholungszeichen am Anfang mit roter Farbe setzen
« Antwort #3 am: Donnerstag, 19. Juli 2012, 15:29 »
Hallo Erich,

die für \set Score.repeatCommands akzeptablen Argumente (d.h. diejenigen, die auch ausgewertet werden) sind in repeat-acknowledge-engraver.cc weggeschlossen und damit nicht zugänglich.
Die Datei repeat-acknowledge-engraver.cc hast Du nur dann auf dem Rechner, falls Du LilyPond selbst kompilierst. Online hier.
Siehe Zeilen 80ff.

Insoweit sehe ich da im Moment keine Chance für Deine Idee.

Zur Illustration:
Wenn Du den log-output des folgenden Codes betrachtest siehst Du, daß before-line-breaking die glyphen "|:" und ":|" zwar existieren, aber zu ":|:" verschmolzen werden. After-line-breaking ist nur noch ":|:" vorhanden.
Der Versuch before-line-breaking die Farbe anzugeben bleibt erfolglos.

{
        c'1
       
        \once \override Staff.BarLine #'before-line-breaking =
          #(lambda (grob)
            (let ((glyph-name (ly:grob-property grob 'glyph-name)))
            (if (string=? glyph-name "|:")
               (ly:grob-set-property! grob 'color red)
               #f)
            (newline)(display "before-line-breaking-glyph-name ")(display glyph-name)))
           
        \once \override Staff.BarLine #'after-line-breaking =
          #(lambda (grob)
            (let ((glyph-name (ly:grob-property grob 'glyph-name)))
            (newline)(display "after-line-breaking-glyph-name  ")(display glyph-name)))
           
        \set Score.repeatCommands = #'(end-repeat dummy start-repeat)
        d'
}

log:
GNU LilyPond 2.14.2
»barline-color-test.ly« wird verarbeitet
Analysieren...
Interpretation der Musik...
Vorverarbeitung der grafischen Elemente...
before-line-breaking-glyph-name :|:
before-line-breaking-glyph-name :|
before-line-breaking-glyph-name |:
Ideale Seitenanzahl wird gefunden...
Musik wird auf eine Seite angepasst...
Systeme erstellen...
after-line-breaking-glyph-name  :|:
Layout nach »barline-color-test.ps« ausgeben...
Konvertierung nach »./barline-color-test.pdf«...
Erfolg: Kompilation erfolgreich beendet


HTH,
  Harm