Notenzeilen rechtsbündig

Begonnen von stefanhuglfing, Freitag, 26. Januar 2018, 19:26

« vorheriges - nächstes »

stefanhuglfing

Ich habe mehrere Notenzeilen, vor denen ein Text steht und möchte,
dass die Noten nach dem Text beginnen und bis an den rechten Seitenrand gehen.

mit    ragged-right = ##f    geht es über den Rand hinaus:

\version "2.19.54"

\paper { indent = 0 ragged-right = ##f }

\markup
{
  "Alle singen:"
  \score { \new Staff { \relative c' { g2 c e    d8 c b a   g2 d' f  }}}
}


und  ohne    ragged-right = ##f    ist es zu kurz

Ich könnte das so hintricksen, wie ich es hier:

https://lilypondforum.de/index.php/topic,228.0.html

gelernt habe. Aber das wäre bei mehreren Zeilen aufwändig und wird wahrscheinlich doch nicht einheitlich.
Kann man das irgendwie automatisieren?

harm6

Hallo,

kommen auch mehrzeilige scores vor?
Wenn ja, wo sollen die anderen Zeilen beginnen?

Gruß,
  Harm

stefanhuglfing

#2
Zitat von: harm6 am Freitag, 26. Januar 2018, 20:46
wo sollen die anderen Zeilen beginnen?

daran habe ich noch gar nicht gedacht.
Ab der zweiten Zeile sollten sie am linken Seitenrand beginnen.

Ich könnte für die weiteren Zeilen einen neuen \score beginnen:

\version "2.19.54"

\paper { indent = 0 }

\markup
{
  "Alle singen:"
  \score { \new Staff { \relative c'
   {
    \newSpacingSection
    \override Score.SpacingSpanner.base-shortest-duration = #(ly:make-moment 1/8)
    \override Score.SpacingSpanner.spacing-increment = #0.9
    g2 c      e d8 c b a    g2 d'       f e8 d b a   
    g2 g'     g4 f r2      e2 d4 c   d1
   } }}
}

\score { \new Staff { \relative c'
   {     
    g2 c      e d8 c b a    g2 d' f r
    g,2 d'    f e8 d b a    g2 g'
    g4 f r2   e2 d4 d       c1
   }                                 }}
   
\layout {}

aber das wäre nur eine Notlösung.

harm6

Ich würde den instrumentName benutzen, ragged-right = ##f und den indent vom instrumentName ableiten.
Führt zu:


\version "2.19.65"

#(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))

#(define-markup-command (indented-score layout props txt input-score)
  (markup? markup?)
  #:properties ((padding 1))
  "Returns a proper intended score-markup, with instrumentName set to txt."
  (let* ((instr-txt
           #{ \markup \concat { #txt \hspace #padding } #})
         (txt-stil (interpret-markup layout props instr-txt))
         (text-stil-length (interval-length (ly:stencil-extent txt-stil X)))
         (output-scale (ly:output-def-lookup layout 'output-scale))
         ;; maybe overkill using `lists-map' to get the score.
         ;; better be paranoid, though.
         (new-output
           (lists-map
             (lambda (x)
               (if (ly:score? x)
                   (let*
                     ((score-layout (car (ly:score-output-defs x)))
                      (score-music (ly:score-music x))
                      (new-score
                        #{
                          \score {
                            $score-music
                            \layout {
                             $score-layout
                              \context {
                                \Staff
                                \override InstrumentName.X-offset =
                                  #(lambda (grob)
                                    ;; mmhh -- why a correction by 0.3?
                                    ;; where does it come from?
                                    (+ (system-start-text::calc-x-offset grob)
                                       0.3))
                                %% N.b. This will set instrumentName in every
                                %% Staff to the same value.
                                %% Previously set instrumentNames are kept,
                                %% the indent will be taken from the provided
                                %% txt, though.
                                instrumentName = $instr-txt
                              }
                              indent = $(* output-scale text-stil-length)
                              ragged-right = ##f
                            }
                          }
                        #}))
                     new-score)
                   x))
             input-score)))
  (interpret-markup layout props new-output)))
 
%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLES
%%%%%%%%%%%%%%%%%%%%%%%%%%
 
scI =
\markup
  \score {
    \new Staff
      \relative c' {
      g2 c e    d8 c b a   g2 d' f1
      \break
      g2 g'     g4 f r2      e2 d4 c   d1
      }
  \layout { \context { \Score \omit BarNumber } }
  }
 
scII =
  \markup
    \score {
      \new Staff \relative c' { g2 c e    d8 c b a   g2 d' f  }
    }

%% http://lsr.di.unimi.it/LSR/Item?id=862
staffSize = #(define-music-function (new-size) (number?)
  #{
    \set fontSize = #new-size
    \override StaffSymbol.staff-space = #(magstep new-size)
    \override StaffSymbol.thickness = #(magstep new-size)
  #})
   
scIII =
  \markup
    \score {
      \new Staff
        \with { \staffSize #-3 }
        \relative c' { g2 c e    d8 c b a   g2 d' f  }
    }

lorem =
"Lorem ipsum dolor sit amet, consectetur adipisicing
elit, sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua.  Ut enim ad minim veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat."

\markup
  \column {
  \pad-around #4 \box \fill-line { "two-line-score" }
 
    \indented-score
      "Alle singen es:"
      %% better insist on the default
      \override #'(baseline-skip . 3)
      \scI
 
    \pad-around #4 \box \fill-line { "one-line-score" }
   
    \indented-score
      \ellipse \undertie "Alle singen es:"
      \scII
   
    \pad-around #4 \box \fill-line { "two-line-score" }
   
    \override #'(padding . 5)
    \indented-score
      \with-color #black
      \box
      \override #'(line-width . 60)
      \justify-string
      #lorem
      \with-color #cyan
      \override #'(baseline-skip . 3)
      \scI
   
    \pad-around #4 \box \fill-line { "one-line-score" }
   
    \override #'(padding . 3)
    \indented-score
      \with-color #black
      \box
      \override #'(baseline-skip . 2)
      \override #'(line-width . 50)
      \justify-string
      #lorem
      \with-color #blue
      \scIII
  }


HTH,
  Harm

Be-3

Zitat von: harm6 am Samstag, 27. Januar 2018, 16:18
                                    ;; mmhh -- why a correction by 0.3?
                                    ;; where does it come from?
                                    (+ (system-start-text::calc-x-offset grob)
                                       0.3))

Hallo Harm,

die rätselhaften 0.3 sind der InstrumentName.padding-Wert (default: 0.3), der zwischen Instrumentennamen und Staff eingeschoben wird und deshalb den Text um 0.3 weiter nach außen verschiebt als gedacht.
Wenn man InstrumentName.padding auf #0 setzt, braucht man keine solche Korrektur, wenn man InstrumentName.padding auf #5 setzt, muß die Korrektur 5 statt 0.3 betragen.

Oder eigentlich wird anders herum ein Schuh draus: Deine text-stil-length ist genau um InstrumentName.padding zu kurz, denn der "Platzverbrauch" des Instrumentennamens ist Textlänge plus Padding.

Viele Grüße
Torsten

harm6

Hallo Torsten,

vielen Dank für den Hinweis. Ich werd' morgen einen verbesserten Code einstellen.

Eigentlich hatte ich versucht völlig auf den markup-mode zu verzichten. Habe aber keine Möglichkeit gefunden in einem score-layout auf den Platzverbrauch eines instrumentNames im Staff-context zuzugreifen um dann den indent danach zu berechnen. Zumindest bislang und mit vertretbarem Aufwand.
Falls Du da weiter weißt wär ich ganz Ohr ;)

Besten Dank nochmal,
  Harm

harm6

Hier der verbesserte code (ohne Beispiele).
Das InstrumentName-grob wird um den padding-Wert verschoben. Um mehr Abstand zwischen dem Text des InstrumentNames und dem Anfang der Noten zu bekommen (ohne den Text zu verschieben) verwende man das padding-markup-property.


\version "2.19.65"

#(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))

#(define-markup-command (indented-score layout props txt input-score)
  (markup? markup?)
  #:properties ((padding 1))
  "Returns a proper intended score-markup, with instrumentName set to txt."
  (let* ((instr-txt
           #{ \markup \concat { #txt \hspace #padding } #})
         (txt-stil (interpret-markup layout props instr-txt))
         (text-stil-length (interval-length (ly:stencil-extent txt-stil X)))
         (output-scale (ly:output-def-lookup layout 'output-scale))
         ;; maybe overkill using `lists-map' to get the score.
         ;; better be paranoid, though.
         (new-output
           (lists-map
             (lambda (x)
               (if (ly:score? x)
                   (let*
                     ((score-layout (car (ly:score-output-defs x)))
                      (score-music (ly:score-music x))
                      (new-score
                        #{
                          \score {
                            $score-music
                            \layout {
                              $score-layout
                              \context {
                                \Staff
                                \override InstrumentName.X-offset =
                                  #(lambda (grob)
                                    (let ((padding
                                            (ly:grob-property grob 'padding)))
                                    (+ (system-start-text::calc-x-offset grob)
                                       padding)))
                                %% N.b. This will set instrumentName in every
                                %% Staff to the same value.
                                %% Previously set instrumentNames are kept,
                                %% the indent will be taken from the provided
                                %% txt, though.
                                instrumentName = $instr-txt
                              }
                              indent = $(* output-scale text-stil-length)
                              ragged-right = ##f
                            }
                          }
                        #}))
                     new-score)
                   x))
             input-score)))
  (interpret-markup layout props new-output)))


Gruß,
  Harm

stefanhuglfing

Danke, funktioniert (auch wenn ich kaum was verstehe)!