Allgemein > Fragen zu Funktionen

Lyrics: Strophen-Nummern in jeder Notenzeile

<< < (3/3)

Joei:
cool – wird gleich ausprobiert, lieb(e) Harm(in)  :o 8) ::) ! Joei

Joei:
ok.. ausprobiert - funktioniert einwandfrei.

Jetzt sind mir die Zeilennummern aber noch zu weit links. Hab versucht selber Überlegungen anzustellen:

Die Zeilennummern sind ja "instrumentNames" - müssten ergo auch Text sein können, und dann hätte ich einfach eine Zeilennummern mit führenden Leerzeichen genommen "   1.".
Dafür habe ich den Variablentyp für den instr-name auf char? gesetzt:


--- Code: ---#(define-scheme-function (instr-name move)(char? number?)
--- Ende Code ---

und im Musikquelltext dann


--- Code: ---\new Lyrics
      \with {
        \numberLyrics "1" 3.5
  }

--- Ende Code ---

Weder konnte Lily das interpretieren:


--- Code: ---Fehler: kein solcher Kontextmodus       
        \numberLyrics "1" 3.5
--- Ende Code ---

noch konnte die Variable was mit den führenden Leerzeichen anfangen:


--- Code: ---Fehler: falscher Typ für Argument 1; character erwartet, "  2" gefunden
        \numberLyrics "  2" 3.5
--- Ende Code ---

Muss ich die Variablen anders angeben?

Hier das geänderte Beispiel (einzige Änderungen sind die oben beschriebenen, hier nur als kompilierbares Beispiel)


--- Code: ---\version "2.19.44"

%% REMARK:
%% Using instrument-names _and_ setting an invisible stanza with a certain
%% extent at line-begin to avoid collisions

%% Thanks to David Nalesnik
%% http://lists.gnu.org/archive/html/lilypond-user/2016-07/msg00028.html

#(define create-stanza-number-grob-engraver
;; puts out a StanzaNumber for every LyricText-grob
  (lambda (context)
    (let ((stanza (ly:context-property context 'stanza)))
      `((acknowledgers
          (lyric-syllable-interface .
            ,(lambda (engraver grob source-engraver)
              (let ((new-stanza-grob
                      (ly:engraver-make-grob engraver 'StanzaNumber '())))
              (ly:grob-set-property! new-stanza-grob 'text stanza)))))))))

#(define (at-line-beginning? grob)
   (let* ((col (ly:item-get-column grob))
          (ln (ly:grob-object col 'left-neighbor))
          (col-to-check (if (ly:grob? ln) ln col)))
     (and (eq? #t (ly:grob-property col-to-check 'non-musical))
          (= 1 (ly:item-break-dir col-to-check)))))

#(define (keep-at-line-begin grob)
   (if (and (ly:item? grob) (not (at-line-beginning? grob)))
       (ly:grob-suicide! grob)
       grob))

keepLineStartStanzaNumbers =
\layout {
  \context {
  \Lyrics
  \override StanzaNumber.after-line-breaking =
    #keep-at-line-begin
  }
}

numberLyrics =
#(define-scheme-function (instr-name move)(char? number?)
" instr-name was number?"     
"Return a context-modification setting @code{stanza} and consisting
@code{create-stanza-number-grob-engraver}, as well as @code{instrumentName} and
@code{shortInstrumentName}.
The latter prints the numbering using @var{instr-name}, the first is used to
push the lyrics to the right, using @var{move}.
"
#{
  \with {
    %stanza = \markup \italic #(format #f "~a." nmbr)
    stanza = \markup \combine \null \translate #(cons move  0) \null
    \consists #create-stanza-number-grob-engraver
instrumentName = #(format #f "~a." instr-name)
shortInstrumentName = #(format #f "~a." instr-name)
  }
#})

%%%%%%%%%%%%%%%%%%%%%%%%%%
%% modifiziertes EXAMPLE %
%%%%%%%%%%%%%%%%%%%%%%%%%%

\score {
  <<
    \new Staff { \key cis \major \repeat unfold 6 {  c''4 d'' e'' } }
    \new Lyrics
      \with {
        \numberLyrics "1" 3.5
  }
      \lyricmode {
        \repeat unfold 6 {  foo -- bar -- buzz }
      }
     
    \new Lyrics 
      \with {
        \numberLyrics "  2" 3.5
  }
      \lyricmode {
        \repeat unfold 6 {  very-very-long-syllable bur -- buuuzz }
      }
     
    \new Lyrics 
      \with {
        \numberLyrics "3" 3.9
  }
      \lyricmode {
        \repeat unfold 6 {  fuu -- bla -- blibbb }
      }
  >>
  \layout {
    \keepLineStartStanzaNumbers
    \context {
      \Lyrics
      \override InstrumentName.X-offset = 2
    }
  }
}
--- Ende Code ---

Die Variable "move" sollte den Text verschieben, richtig? Da habe ich keinerlei Effekt merken können :(

Dank&Gruß Joei

Joei:
oh gott wie dämlich  :o


--- Code: ---    \override InstrumentName.X-offset = 3
--- Ende Code ---
im  Layout-Block war die Lösung. (Wobei mich mein Denkfehler oben trotzdem wurmt.)

ABER:  die Nutzung von \numberLyrics zieht das Notenbild extrem auseinander:
Harms Beispiel ohne \numberLyrics


und mit:


Joei

Navigation

[0] Themen-Index

[*] Vorherige Sete

Zur normalen Ansicht wechseln