LyricExtender

Begonnen von chf, Sonntag, 11. April 2021, 18:00

« vorheriges - nächstes »

chf


Liebe Freunde,

gibt es zur Verlängerung des LyricExtender

\override LyricExtender #'minimum-length = #10

auch das Gegenteil? Ich brauchte eine Verkürzung...

Gruß
Christa

harm6

Geh ich recht in der Annahme, daß Du nicht die Länge des LyricExtender verändern willst, sondern den horizontalen Abstand zwischen dem Ende des LyricExtenders und der assozierten NoteColumn beeinflussen möchtest?

Falls, ja:
(1)
Implementiert sind nur die properties left-padding und right-padding.
Diese beziehen sich aber auf das jeweils vorangegangene bzw folgende Element in den Lyrics.
Insbesondere für right-padding sind dann für gewöhnlich recht hohe Werte nötig, die auch noch bei jeder layout-Änderung angepasst werden müssen:

<<
  \new Voice { b1~ b b }
  \new Lyrics \lyricsto "" {   
    \once \override LyricExtender.left-padding = 2
    \once \override LyricExtender.right-padding = 8
    foo __ bar
  }
>>


(2)
Schön wäre shorten-pair zu haben, wie bei der Hairpin. Geht mit einem neuen stencil:

\version "2.22.0"

#(define harm:lyric-extender::print
  (lambda (grob)
  "Post-processes the stencil by applying the @code{shorten-pair} property."
    (let* ((stil (ly:lyric-extender::print grob))
           (stil-x-ext (ly:stencil-extent stil X))
           (stil-y-ext (ly:stencil-extent stil Y))
           (shorten-pair (ly:grob-property grob 'shorten-pair '(0 . 0)))
           (new-stil-x-ext
             (cons
               (+ (car stil-x-ext) (car shorten-pair))
               (- (cdr stil-x-ext) (cdr shorten-pair)))))
   
      (define (lists-map function ls)
      "Apply @var{function} to @var{ls} and all of it sublists.
      First it recurses over the children, then the function is applied to
      @var{ls}."
          (if (list? ls)
              (set! ls (map (lambda (y) (lists-map function y)) ls))
              ls)
          (function ls))
 
 
      (ly:make-stencil
        (lists-map
           (lambda (l)
             (if (and (list? l) (eq? (car l) 'round-filled-box))
                 (list
                   'round-filled-box
                   (- (list-ref l 1) (car shorten-pair))
                   (- (list-ref l 2) (cdr shorten-pair))
                   (list-ref l 3)
                   (list-ref l 4)
                   (list-ref l 5))
                 l))
          (ly:stencil-expr stil))       
         new-stil-x-ext
         stil-y-ext))))
 
\score {
  <<
    \new Voice { b1~ b b b1~ b b }
    \new Lyrics \lyricsto "" {         
      \once \override LyricExtender.shorten-pair = #'(0 . 2)
      foo __ bar buzz \tweak shorten-pair #'(2 . -1) __ blubb
    }
  >>
  \layout {
  \context {
      \Lyrics
      \override LyricExtender.stencil = #harm:lyric-extender::print
    }
  }
}


HTH,
  Harm

chf

Hallo Harm,

es ist offensichtlich viel komplizierter, als ich dachte...

\version "2.20.0"
\relative c'' {
  r8 gis fis e fis ([e] cis [b] cis4 r a'4. gis8 cis [gis fis e~]e [
  \once \override TextScript.extra-offset = #'(0 . -1) dis_\markup "cht."])
}
\addlyrics {\small Es ist voll -- bra __ cht. }

%in der Partitur arbeite ich mit \lyricmode  / lyricsto


Lilypond arbeitet ja wunderbar mit Silben, aber die hier verlangte Trennung macht ein Problem.
Ich habe mir sagen lassen, dass diese Notation durchaus gebräuchlich ist - ich kannte das nicht.Nun dachte ich, der Strich könnte einfach eine Note früher enden.

So muss ich wohl Trennstriche manuell einsetzen... Oder???
Danke bis hierher
Christa



kilgore

Hallo chf,

Eigentlich müsste das Melisma erst am Ende des Wortes kommen. "Vollbracht" hat schließlich nur zwei Silben. Hier ein paar Varianten:


\version "2.20.0"

%Variante 1 - eigentlich richtig so
\relative c'' {
  r8 gis fis e fis ([e] cis [b] cis4 r a'4. gis8 cis [gis fis e~]e [
   dis])
}
\addlyrics {\small Es ist voll -- bracht. __ }

%Variante 2 - naja, etwas komisch weil die letzte Silbentrennung eigentlich nur eine Silbe umfasst
%und der Slur nicht ganz weit genug geht.
\relative c'' {
  r8 gis fis e fis ([e] cis [b] cis4 r a'4. gis8 cis [gis fis e~]e) [
   dis]
}
\addlyrics {\small Es ist voll -- bra -- cht. }

%Variante 3 - Kompromisslösung :) Da würde Harm's Lösung mit right-padding vielleicht gut.
\relative c'' {
  r8 gis fis e fis ([e] cis [b] cis4 r a'4. gis8 cis [gis fis e~]e [
   \once \override TextScript.extra-offset = #'( 1 . -1.5 )
   dis])_"(cht.)"
}
\addlyrics {\small Es ist voll -- bracht. __
           
            }



Ich denke, jede(r) Sänger(in) weisst auch, dass man bei "-bracht" den Vokal aushält, und nicht das "cht"  ;)

Gruß
kil

chf

Hallo kilgore,

wie gesagt - die Aussage eines mit "allen Wassern gewaschenen" Musikers und Verlegers steht für die scheinbar falsche Variante...
Aber dein Vorschlag endet klassisch an der letzten Note und vor "cht"

kilgore

Naja, das (mienes Wissens) aktuellste Fachbuch für Notation ist bei diesem Thema eindeutig. (Behind Bars von Elaine Gould)
Bild im Anhang...

chf

Das Buch habe ich auch...
Ich versuche, dem Wunsch des Komponisten zu entsprechen - natürlich nur, wenn's geht.

harm6

Warum nicht:

\version "2.20.0"

\relative c'' {
  r8 gis fis e fis([ e] cis[ b] cis4 r a'4. gis8 cis[ gis fis e~] e[ dis])
}
\addlyrics {
  \small
  Es ist voll -- \set ignoreMelismata = ##t bra __ \repeat unfold 11 _ cht.
  \unset ignoreMelismata
}


wenn der Komponist es wirklich so haben möchte...

Aber kilgore's Variante 1 ist vorzuziehen.

Gruß,
  Harm

chf

Danke, Harm.

Mich hat's auch befremdet, aber den Argumenten aus erfahrenem Mund konnte ich schlecht widersprechen.
Den Komponisten wird's freuen.

Gruß
Christa

harm6

Ich würde Elaine Gould jetzt nicht unbedingt als unerfahren einordnen wollen :)

Gruß,
  Harm

chf

#10
Ein solcher Gedanke sei ferne von mir!!!
Das Buch ist mir zur Hand - empfohlen von jenem erfahrenen Menschen...