Autor Thema: LyricExtender mit weniger als einer bestimmten Länge verstecken  (Gelesen 1646 mal)

complanar

  • Member
LyricExtender mit weniger als einer bestimmten Länge verstecken
« am: Donnerstag, 26. April 2012, 12:11 »
Hallo ihr,

ich habe folgendes Problem. Mir sind oft die LyricExtender ein bisschen zu lang wenn die Noten eng aufeinanderfolgen. Daher habe ich in meinem Stylesheet die Mindestlänge auf 0 gestellt:
\override LyricExtender #'minimum-length = #0
Das funktioniert auch prima. Wenn die Noten eng beieinander sind, dann wird wie gewünscht kein Extender mehr ausgegeben.

Allerdings kommt es jetzt manchmal vor (und das ist ja eigentlich auch ganz logisch), das der LyricExtender je nach Noten- und Silbenabstand sehr kurz ist (manchmal nur wie ein Punkt) und das irritiert natürlich beim Notenlesen, weil man denken könnte der Satz ist zu Ende.

Gibt es stattdessen, eine Möglichkeit, die Länge des Extenders zuerst zu überprüfen, bevor man den ausgibt?
Ich denke, dazu müsste man die Funktion des Stencils überschreiben.

Grüße, Holger

harm6

  • Member
Re: LyricExtender mit weniger als einer bestimmten Länge verstecken
« Antwort #1 am: Freitag, 27. April 2012, 01:08 »
Hallo Holger,

ich hab' mal folgendes entworfen. Die display-Befehle kannst Du ja wieder rausnehmen.

\version "2.14.2"

limitingLyricExtender =
#(define-music-function (parser location factor)(number?)
#{
        \override LyricExtender #'stencil =
          #(lambda (grob)
            (let ((stil (ly:lyric-extender::print grob)))
              (if (ly:stencil? stil)
                 (let* ((lngth (interval-length (ly:stencil-extent stil X)))
                        (minimum-length (ly:grob-property grob 'minimum-length))
                        (limit (* minimum-length $factor)))
                       
                 (newline)(display "lngth___________")(display lngth)
                 (newline)(display "minimum-length__")(display minimum-length)
                 (newline)(display "limit___________")(display limit)
                 (newline)
                 
                 (if (< lngth limit)
                    #f
                    stil)))))
#})

\layout {
    \context {
      \Score
      \override NonMusicalPaperColumn #'line-break-permission = ##f
    }
}


music = \relative c'' {
        \repeat unfold 9 {
        c4~ c d~ d
        }
}

words = \lyricmode {
        \limitingLyricExtender #0.2
        \repeat unfold 9 {
        foooo __ baz __
        }
}

\score {
        <<
        \new Staff \new Voice = "voice" \music
        \new Lyrics \lyricsto "voice" \words
        >>
}

HTH,
  Harm

complanar

  • Member
Re: LyricExtender mit weniger als einer bestimmten Länge verstecken
« Antwort #2 am: Freitag, 27. April 2012, 15:01 »
Vielen Dank, das ist fast das, was ich gesucht habe.
Ich habe den Rest allein hinbekommen. Eigentlich wollte ich auf einen festen Wert begrenzen und nicht aus einen Faktor, aber die kleine Änderung hab ich hinbekommen. Ich hab die Änderung in partiturweit im Layout-Block eingetragen.

Vielen Dank, du bist fantastisch! So schwierig wars ja gar nicht, nur sind solche Sachen irgendwie schlecht dokumentiert und ich wusste nicht so direkt, wie ich das anpacken soll.