Deutsches Lilypond Forum (Archiv)

Allgemein => Fragen zu Funktionen => Thema gestartet von: Heinz am Freitag, 5. August 2011, 17:23

Titel: Tagline vertikal an Score-Ende verschieben?
Beitrag von: Heinz am Freitag, 5. August 2011, 17:23
Liebe Lilyponders,

gibt es eine Möglichkeit, ein Textfeld (wie Titel, piece etc.) standardmäßig ans Ende eines \score-Blockes zu "kleben"?
Ich möchte gerne einen kleinen markup-Block, der Angaben zu Dichter und Komponist enthält, immer nach den Noten erscheinen lassen und mehrere Lieder zu einem Buch zusammenbringen.

Zunächst probierte ich, den Text einfach an die letzte Note zu kleben; dann mit einem \mark. Da das irgendwie nicht besonders elegant ist, habe ich auf toplevel-Ebene \score und \markup hintereinandergebracht. Da gibt´s aber mit der Abstandsregelung Schwierigkeiten, weil das Ganze so flexibel sein soll, daß der Text immer optisch zu den Noten gehört. Also eher dicht am Lied, eher weiter zum nächsten Titel. Außerdem darf kein Seitenumbruch dazwischenkommen.

Nun dachte ich an \tagline, das ja immer am Ende eines Stückes erscheint. Allerdings im Fußzeilenbereich. Kann man die Position dieses Feldes beeinflussen, oder habt Ihr sonst eine Idee?

Fragt
Heinz.
Titel: Re: Tagline vertikal an Score-Ende verschieben?
Beitrag von: ding-dong am Freitag, 5. August 2011, 23:06
das sollte doch mit \markup \noPageBreak oder bookpart, ev. auch \vspace zu machen sein, oder!?

dann gibt's ja auch die vertical spacing-funktionen, mit denen die abstände zwischen einem score und markup geregelt werden können.

(bist du unter 2.14.…?)
Titel: Re: Tagline vertikal an Score-Ende verschieben?
Beitrag von: harm6 am Samstag, 6. August 2011, 00:31
Hallo Heinz,

ding-dong hat völlig recht, insbesondere in 2.14.x.
Aber da ich ja Spaß am tüfteln habe ;D ...

Vorbild ist comper's underBarLine aus diesem thread (https://liarchiv.joonet.de/index.php?topic=605.msg3313#msg3313). Dabei wird das markup an den letzten Taktstrich geklebt.
Ich hab' dann noch lastLine als Funktion dazugeschrieben.

\version "2.14.2"

% https://liarchiv.joonet.de/index.php?topic=605.msg3313#msg3313

#(define ((underBarLine markup) grob)
  (ly:stencil-combine-at-edge (ly:bar-line::print grob)
    Y DOWN (grob-interpret-markup grob markup) 0 0))
   
schlussMarkupOne = \markup \with-dimensions #'(0 . 0) #'(-10 . 5)
        \right-align \tiny
          \fill-line {\null "poet1 (16xx- 17xx)" "composer1 (1685-1750)" \null}

lastLine =
#(define-music-function (parse location str-one str-two) (string? string?)
#{
#(define ((underBarLine markup) grob)
  (ly:stencil-combine-at-edge (ly:bar-line::print grob)
    Y DOWN (grob-interpret-markup grob markup) 0 0))   

#(define schlussMarkup
(markup #:with-dimensions '(0 . 0) '(-10 . 5)
        #:right-align
        #:tiny
        #:fill-line ("" $str-one $str-two "")
        ))
         
    \once \override Staff.BarLine #'stencil = #(underBarLine schlussMarkup)
#})

\paper {
        ragged-right = ##f
        print-all-headers = ##t
}

%------------------- Test ------------------------------------------------------

one =   
\relative c'' {
        a1 \break
        b
\once \override Staff.BarLine #'stencil = #(underBarLine schlussMarkupOne)
}


two =   
\relative c'' {
        c1 \break
        d
\lastLine #"poet2 (??- !!!)"  #"composer2 (bla-blub)"
}

\score {
        \new Staff = "one"{
        <<
        \one
        >>
        }
        \header {
        title = "title 1"
        subtitle = "subtitle1"
        subsubtitle = "subsubtitle1"
        composer = "composer1"
        arranger = "arranger1"
        poet = "poet1"
        }
        \layout { }
}

\score {
        \new Staff = "two" {
        <<
        \two
        >>
        }
        \header {
        title = "title 2"
        subtitle = "subtitle2"
        subsubtitle = "subsubtitle2"
        composer = "composer2"
        arranger = "arranger2"
        poet = "poet2"     
        }
        \layout { }
}

Im ersten Score wird das Schlußmarkup einzeln definiert, im zweiten Score wird die Funktion benutzt.
Die Abstände können bei with-dimensions eingeregelt werden. (Es bestehen Kollisionsmöglichkeiten).

Gruß,
 Harm
Titel: Re: Tagline vertikal an Score-Ende verschieben?
Beitrag von: hosios am Samstag, 6. August 2011, 17:08
Hi,

ich möchte die Gelegenheit ausnützen um zu fragen wie man den vertikalen space zwischen composer und arranger ändern kann., damit die weiter zusammen kommen.
Titel: Re: Tagline vertikal an Score-Ende verschieben?
Beitrag von: Heinz am Samstag, 6. August 2011, 17:19
Hallo Harm,

ganz herzlichen Dank für die tolle Lösung! Habe ich mal kurz probiert und will es noch ausführlich testen.
Die Lösung von ding-dong hatte ich in etwa probiert, bin dann allerdings relativ unflexibel, da sich ja die spacing-Funktionen logischerweise immer auf alle z. B. "score-markup-spacing" - Kombinationen beziehen.
Insofern kommt mir die lastLine-Funktion sehr entgegen.

Vielen Dank nochmal!

Gruß,
Heinz.
Titel: Re: Tagline vertikal an Score-Ende verschieben?
Beitrag von: harm6 am Samstag, 6. August 2011, 18:58
@hosios

Ich kenne keine Möglichkeit den Abstand zwischen composer und arranger zu beeinflussen, aber man kann ein fake basteln.

\version "2.14.2"

\paper { ragged-right = ##f }

\header {
composer = \markup \override #'(baseline-skip . 2) \right-column  {"composer xxyyzz" "arranger1"}
}
\relative c'' { b1 }

Gruß,
  Harm
Titel: Re: Tagline vertikal an Score-Ende verschieben?
Beitrag von: ding-dong am Samstag, 6. August 2011, 23:47
Die Lösung von ding-dong hatte ich in etwa probiert, bin dann allerdings relativ unflexibel, da sich ja die spacing-Funktionen logischerweise immer auf alle z. B. "score-markup-spacing" - Kombinationen beziehen.
Insofern kommt mir die lastLine-Funktion sehr entgegen.
pro book oder bookpart (oder eben auf dem top-level). wenn das nicht genügt, kann man zusätzliche markups verwenden!

zudem kann man eine variable

paperA = {\paper {spacing-definitionen = …}

definieren um sie an gegebener stelle wieder zu verwenden! (gilt ebenso für \layout und \with)

vielleicht könnte auch ein kleines beispiel zu mehr klarheit wo ein problem besteht verhelten!?

gruss
ding-dong
Titel: Re: Tagline vertikal an Score-Ende verschieben?
Beitrag von: hosios am Sonntag, 7. August 2011, 04:01
Super.

Danke Harm. Genau was ich wollte.

Paul
Titel: Re: Tagline vertikal an Score-Ende verschieben?
Beitrag von: Heinz am Donnerstag, 14. Februar 2013, 11:14
Ich bin dabei, 2.14-Dateien upzugraden (auf 2.16.2).
Dabei gibt es hierbei etliche Fehlermeldungen:

\version "2.14.2"
%\version "2.16.2"

% https://liarchiv.joonet.de/index.php?topic=605.msg3313#msg3313

#(define ((underBarLine markup) grob)
  (ly:stencil-combine-at-edge (ly:bar-line::print grob)
    Y DOWN (grob-interpret-markup grob markup) 0 0))
   
schlussMarkupOne = \markup \with-dimensions #'(0 . 0) #'(-10 . 5)
        \right-align \tiny
          \fill-line {\null "poet1 (16xx- 17xx)" "composer1 (1685-1750)" \null}

lastLine =
#(define-music-function (parse location str-one str-two) (string? string?)
#{
#(define ((underBarLine markup) grob)
  (ly:stencil-combine-at-edge (ly:bar-line::print grob)
    Y DOWN (grob-interpret-markup grob markup) 0 0))   

#(define schlussMarkup
(markup #:with-dimensions '(0 . 0) '(-10 . 5)
        #:right-align
        #:tiny
        #:fill-line ("" $str-one $str-two "")
        ))
         
    \once \override Staff.BarLine #'stencil = #(underBarLine schlussMarkup)
#})

\paper {
        ragged-right = ##f
        print-all-headers = ##t
}

%------------------- Test ------------------------------------------------------

one =   
\relative c'' {
        a1 \break
        b
\once \override Staff.BarLine #'stencil = #(underBarLine schlussMarkupOne)
}


two =   
\relative c'' {
        c1 \break
        d
\lastLine #"poet2 (??- !!!)"  #"composer2 (bla-blub)"
}

\score {
        \new Staff = "one"{
        <<
        \one
        >>
        }
        \header {
        title = "title 1"
        subtitle = "subtitle1"
        subsubtitle = "subsubtitle1"
        composer = "composer1"
        arranger = "arranger1"
        poet = "poet1"
        }
        \layout { }
}

\score {
        \new Staff = "two" {
        <<
        \two
        >>
        }
        \header {
        title = "title 2"
        subtitle = "subtitle2"
        subsubtitle = "subsubtitle2"
        composer = "composer2"
        arranger = "arranger2"
        poet = "poet2"     
        }
        \layout { }
}


Hat sich die Syntax da enorm verändert? Ich komme leider nicht selber dahinter...

Freue mich über sachdienliche Hinweise :)

Gruß, Heinz.
Titel: Re: Tagline vertikal an Score-Ende verschieben?
Beitrag von: harm6 am Donnerstag, 14. Februar 2013, 12:08
Hallo Heinz,

die größte Änderung liegt in der Verwendung von #{ ... #} in Musikfunktionen.

Der Aufruf einer Variablen braucht nicht mehr immer ein vorangestelltes $-Zeichen. Die Konvertierung via convert-ly funktioniert für diesen Fall aber problemlos.
Eine Folge dieser Änderung ist aber auch, daß weitere scheme-Definitionen innerhalb von #{ ... #} nicht mehr so einfach zulässig sind, sondern außerhalb bzw vorangestellt werden müssen. Diese Änderung ist nur gut und richtig, denn die alte Methode bedeutete, daß man in einem ly-file nach scheme wechslet, dann in lilypond in scheme nach LilyPond, dann in LilyPond in scheme in Lilypond nach scheme. Diese Gemengelage ist jetzt um einen Schritt verkürzt.
Eine weitere Änderung ist, daß ly:stencil-combine-at-edge nur noch fünf Argumente hat, vormals sechs. Ob das irgendwo dokumentiert ist, weiß ich nicht. Falls ja so ist es an mir vorbeigegangen, ich habe es jedenfalls auf die harte Tour herausgefunden.
Bei den zuletzt genannten Änderungen scheitert convert-ly, sodaß manuelles upgraden erforderlich ist.

Der Code stellt sich nun so dar:

\version "2.16.1"

% https://liarchiv.joonet.de/index.php?topic=605.msg3313#msg3313

#(define ((underBarLine markup) grob)
  (ly:stencil-combine-at-edge (ly:bar-line::print grob)
    Y DOWN (grob-interpret-markup grob markup) 0))

schlussMarkupOne = \markup \with-dimensions #'(0 . 0) #'(-10 . 5)
                        \right-align \tiny
                          \fill-line {\null "poet1 (16xx- 17xx)" "composer1 (1685-1750)" \null}

lastLine =
#(define-music-function (parser location str-one str-two) (string? string?)

   (define ((underBarLine markup) grob)
     (ly:stencil-combine-at-edge (ly:bar-line::print grob)
       Y DOWN (grob-interpret-markup grob markup) 0))

   (define schlussMarkup
     (markup #:with-dimensions '(0 . 0) '(-10 . 5)
             #:right-align
             #:tiny
             #:fill-line ("" str-one str-two "")))

#{
    \once \override Staff.BarLine #'stencil = #(underBarLine schlussMarkup)
#})

\paper {
        ragged-right = ##f
        print-all-headers = ##t
}

%------------------- Test ------------------------------------------------------

one =
\relative c'' {
        a1 \break
        b
\once \override Staff.BarLine #'stencil = #(underBarLine schlussMarkupOne)
}


two =
\relative c'' {
        c1 \break
        d
\lastLine #"poet2 (??- !!!)"  #"composer2 (bla-blub)"
}

\score {
        \new Staff = "one"{
        <<
        \one
        >>
        }
        \header {
                title = "title 1"
                subtitle = "subtitle1"
                subsubtitle = "subsubtitle1"
                composer = "composer1"
                arranger = "arranger1"
                poet = "poet1"
        }
        \layout { }
}

\score {
        \new Staff = "two" {
        <<
        \two
        >>
        }
        \header {
                title = "title 2"
                subtitle = "subtitle2"
                subsubtitle = "subsubtitle2"
                composer = "composer2"
                arranger = "arranger2"
                poet = "poet2"
        }
        \layout { }
}

HTH,
  Harm
Titel: Re: Tagline vertikal an Score-Ende verschieben?
Beitrag von: Heinz am Donnerstag, 14. Februar 2013, 18:49
Hallo, Harm!

Vielen Dank, super! Hat geklappt. Hätte es leider nie und nimmer hingekriegt...

Gruß und guten Abend,
Heinz