Autor Thema: Stencil für BarLine am Zeilenumbruch ändern  (Gelesen 2601 mal)

infranator

  • Member
Stencil für BarLine am Zeilenumbruch ändern
« am: Mittwoch, 2. April 2014, 21:14 »
Hallo Leute,

bisher habe ich oft folgendes Snippet für die Kombination von Coda und Umbruch verwendet:
http://lsr.di.unimi.it/LSR/Item?id=190
Vom Ergebnis her schön, aber ein ganz schönes Rumgefummel.

Jetzt habe ich mal probiert den Barline stencil zu überschreiben, was eigentlich ganz gut funktioniert.

\version "2.18.0"
dcAlFine =
\once \override Staff.BarLine #'stencil =
#(lambda (grob)
   (ly:stencil-combine-at-edge
    (ly:bar-line::print grob)
    X RIGHT
    (grob-interpret-markup grob #{
      \markup
      \with-dimensions #'(0 . 6) #'(0 . 0)
      \whiteout {
        \raise #0.7 {
          \line {
            \hspace #1.2
            \center-column \italic {
              "D.C."
              \line { al \bold fine }
            }
          }
        }
      }
      #})
    0))

\layout {
  \context {
    \Score
    \override StaffSymbol #'layer = #-2
    \override TextScript #'layer = #-1
  }
}

{
  s1*4 \dcAlFine
  \break
  \bar "||"
  s1*4
}

Das Problem ist, dass bei Wiederholungszeichen am Anfang der nächsten Zeile, der Text nochmal gesetzt wird.
Gibt es eine Möglichkeit das zu verhindern?
Viele Grüße,
infranator

harm6

  • Member
Re: Stencil für BarLine am Zeilenumbruch ändern
« Antwort #1 am: Mittwoch, 2. April 2014, 22:25 »
Hallo,

das Problem beteht darin, daß beim Zeilen wechsel zwei stencils entstehen. Der eine wird ans Zeilenende, der andere an den Anfang der neuen Zeile gedruckt.
(Passiert übrigens immer in dieser Situation! Je nach Taktstrichart ist es allerdings ein empty-stencil, also nicht sichtbar.)

Mittels ly:item-break-dir sind die beiden aber unterscheidbar und auch einzeln ansprechbar.

Oder Du definierst gleich neue Taktstricharten :)

Im Code unten ist beides:

\version "2.18.0"

%\paper { ragged-right = ##t }

\layout {
  \context {
    \Score
    \override StaffSymbol #'layer = #-2
    \override TextScript #'layer = #-1
  }
}

mrkp =
\markup {
  \with-dimensions #'(0.298 . 6) #'(0 . 0)
  \whiteout {
    \raise #0.7 {
      \line {
        \hspace #1.2
        \center-column \italic {
          "D.C."
          \line { al \bold fine }
        }
      }
    }
  }
}

#(define (make-my-dcAlFine-bar-line grob extent)
   (grob-interpret-markup grob mrkp))

#(add-bar-glyph-print-procedure "m" make-my-dcAlFine-bar-line)

#(define-bar-line "m" "m" #f  " ")
#(define-bar-line "||m" "||m" #f  "||")
#(define-bar-line "||m-r" "||m" ".|:"  "")


dcAlFine =
\once \override Staff.BarLine #'stencil =
  #(lambda (grob)
     (ly:stencil-combine-at-edge
      (ly:bar-line::print grob)
      X RIGHT
      (grob-interpret-markup grob #{
        \markup
        \with-dimensions #'(0 . 6) #'(0 . 0)
        \whiteout {
          \raise #0.7 {
            \line {
              \hspace #1.2
              \center-column \italic {
                "D.C."
                \line { al \bold fine }
              }
            }
          }
        }
        #})
      0))

dcAlFine-rev =
\once \override Staff.BarLine #'stencil =
  #(lambda (grob)
    (let ((stil (ly:bar-line::print grob))
          (break-dir (ly:item-break-dir grob)))
    (if (= -1 break-dir)
        (ly:stencil-combine-at-edge
          stil
          X RIGHT
          (grob-interpret-markup grob #{
             \markup
             \with-dimensions #'(0 . 6) #'(0 . 0)
             \whiteout {
               \raise #0.7 {
                 \line {
                   \hspace #1.2
                   \center-column \italic {
                     "D.C."
                     \line { al \bold fine }
                   }
                 }
               }
             }
             #})
          0)
        stil)))

{ s1*4 \break \dcAlFine \bar "||" s1*4 }

{ s1*4 \break \bar "||m" s1*4 }

\new StaffGroup
<<
{ s1*4 \break \bar "||m-r" s1*4 }
{ s1*4  s1*4 }
>>

{ s1*4 \break \dcAlFine-rev \bar ".|:" s1*4 }

Natürlich gibt es ein Problem hier. Denn der eingefügte Text erscheint in einer StaffGroup mit zwei Systemen auch zwei mal, nicht unbedingt was man haben will.
Eine gute Lösung hab' ich da aber auch nicht.


Gruß,
  Harm

infranator

  • Member
Re: Stencil für BarLine am Zeilenumbruch ändern
« Antwort #2 am: Donnerstag, 3. April 2014, 12:16 »
Wow vielen Dank!
Damit bin ich mehr als zufrieden, auf die Art schreibe ich "d.c." sowieso nur in einfachen Leadsheets.
Außerdem hat sich damit noch eine andere Frage von mir geklärt. Nämlich wie man Doppelstriche mit \bar "[|:" kombiniert.

#(define-bar-line "[|:-||" "||" "[|:"  "")
{
  s1
  \break
  \bar "[|:-||"
  s1
}

Wieder etwas Licht ins dunkle gebracht ;-)