Autor Thema: Text rechts neben Notenzeile  (Gelesen 2580 mal)

l3u

  • Member
Text rechts neben Notenzeile
« am: Sonntag, 17. Juli 2011, 08:29 »
Hallo :-)

Ich würde gern eine längere Anweisung ("D. S. al Fine, dann Trio") rechts neben eine Notenzeile setzen, nach der dann ein Zeilenumbruch kommt. Dafür soll diese Notenzeile dann (um die Breite des Textes) kürzer sein. Idealerweise soll die Angabe zwei- oder dreizeilig sein. Geht das? Und wenn ja: wie?

Vielen Dank schonmal für die Hilfe :-)

ding-dong

  • Member
Re: Text rechts neben Notenzeile
« Antwort #1 am: Sonntag, 17. Juli 2011, 09:49 »
ich habe mal so was geschrieben:
  \stopStaff
  \cadenzaOn
  \textLengthOn
  \override TextScript #'padding = #-4                 
  \override TextScript #'staff-padding = #'()           
  \override TextScript #'outside-staff-priority = ##f   
  s1
  ^\markup {
    \override #'(line-width . 20)
    \tiny
    \fill-line {
      \column {
        \line \vcenter {
          "dal  " \musicglyph #"scripts.segno" "al " \musicglyph #"scripts.coda" \null
        }
        \line {\null "poi segue" \null}
        \line {" … " " … " " … " }
  } } }
  \bar ""
  \break
  \cadenzaOff
  \startStaff
je nach textzeilenanzahl mussst du das padding anpassen.

gruss
ding-dong

l3u

  • Member
Re: Text rechts neben Notenzeile
« Antwort #2 am: Sonntag, 17. Juli 2011, 10:58 »
Hat mir sehr viel geholfen, der folgende Code macht genau, was ich will:

\stopStaff
\textLengthOn
\once \override TextScript #'staff-padding = #'()
\once \override TextScript #'padding = #-3.2
\once \override TextScript #'outside-staff-priority = ##f
s1 ^\markup { \column { \line { "D. S. al A, B, A," } \line { \lower #0.6 "dann  " \musicglyph #"scripts.coda" } } }
\textLengthOff
\startStaff
\bar ""

Vielen Dank :-)
« Letzte Änderung: Sonntag, 17. Juli 2011, 11:26 von l3u »

l3u

  • Member
Re: Text rechts neben Notenzeile
« Antwort #3 am: Sonntag, 17. Juli 2011, 11:26 »
Da ich den Code vermutlich öfters brauchen werde, hab ich mir überlegt, daß man ja dafür eigentlich eine Funktion schreiben könnte, die man dann einfach immer wieder benutzen kann. Es gibt im Prinzip nur zwei Variablen: den padding-Wert, den man je nach Inhalt anpassen muß und den Inhalt von \markup{}.

Eine Funktion zu schreiben, der ich eine Variable übergebe (für den padding-Wert) hab ich hinbekommen … allerdings verstehe ich nicht ganz, wie ich einer Funktion einen ganzen Markup-Block (also in diesem Fall '\column { \line { "D. S. al Fine," } \line { "dann Trio" } }') übergeben kann … das geht doch sicher irgendwie, oder?!

ding-dong

  • Member
Re: Text rechts neben Notenzeile
« Antwort #4 am: Sonntag, 17. Juli 2011, 17:11 »
Zitat
Eine Funktion zu schreiben, der ich eine Variable übergebe (für den padding-Wert) hab ich hinbekommen … allerdings verstehe ich nicht ganz, wie ich einer Funktion einen ganzen Markup-Block (also in diesem Fall '\column { \line { "D. S. al Fine," } \line { "dann Trio" } }') übergeben kann … das geht doch sicher irgendwie, oder?!

weiss ich nicht - aber da das \markup sowieso in jedem stück wieder etwas verschieden sein wird, würde ich ein \markup mit den ersten paar zeilen (und dem padding) erstellen und ein \markup, das den gestoppten Staff wieder resetted. das \markup selbst wäre dann ganz normal dazwischen:

stopMyStaff = { … }
% oder
stopMyStaff = #(define-music-function (parser location pad) (number?)
  #{ … #})
startMyStaff = { …  }

% und dann:

\stopMyStaff
s1 - \markup "is doch schön so?!"
\startMyStaff

l3u

  • Member
Re: Text rechts neben Notenzeile
« Antwort #5 am: Montag, 18. Juli 2011, 10:00 »
So ginge das natürlich auch. Gute Idee!

harm6

  • Member
Re: Text rechts neben Notenzeile
« Antwort #6 am: Dienstag, 19. Juli 2011, 02:21 »
Hallo zusammen,

wie ding-dong schon anmerkte ist das markup jedesmal ein anderes. Insofern ist eine Funktion nur dann sinnvoll, wenn sie die Bestandteile des markup sinnvoll ausliest und verarbeitet.

Als ersten Schritt habe ich dazu ein neues markup-command entworfen: musicglyph-string
Dieses command kann automatisch auslesen, ob es sich um normalen Text handelt (der wird kursiv dargestellt) oder um ein glyph (diese Fähigkeit ist allerdings im Moment auf Script glyphs beschränkt)
Voraussetzung ist eine Syntax, die die glyhpen durch einrahmende Tiefstriche kenntlich macht. Das ganze muß ein String sein, also "-Zeichen am Anfang und Ende, sowie das #-Zeichen zuvor. Falls das letzte Zeichen ein glyph sein soll, ist es sinnvoll mit einem Tiefstrich abzuschließen (ich weiß zwar nicht so genau warum das so ist, aber der output wird meiner Erfahrung nach zentrierter in der weiteren Verarbeitung.)

z.B.:  \markup {\musicglyph-string #"dal_scripts.segno_al_scripts.coda_" }

\version "2.14.1"
#(set-global-staff-size 15)
\paper {
        indent = 50
        short-indent = 50
        ragged-right = ##t
}

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

%---------------------- markup-command musicglyph-string  ----------------------       
       
#(define-markup-command (musicglyph-string layout props str) (string?)
  (interpret-markup layout props
   (make-line-markup
    (map (lambda (s)
          (if (and (>= (string-length s ) 8)  (equal? "scripts." (substring s 0 8)))
              (markup  (#:musicglyph s))
              (markup  #:vcenter #:tiny #:italic s #:hspace 1)
           ))
         (string-split str #\_)
   ))))

%------------------- Test ------------------------------------------------------
   
   \relative c'' {
           \set Staff.instrumentName = \markup { \smaller\smaller
               \center-column {
                       "new markup-command  "
                       "musicglyph-string"
               }
           }
           
        a1^\markup { \musicglyph-string #"dal_scripts.segno_al_scripts.coda_" }
}

Als zweiten Schritt habe ich das markup-command musicglyph-string-center-column definiert.
Dieses comand verarbeitet eine String-Liste mittels  musicglyph-string und center-column.

z.B.:  \markup {
           \override #'(line-width . 0) {
                   \musicglyph-string-center-column #'(
                   "dal_scripts.segno_al_scripts.coda_"
                   "poi segue"
                   "…_…_…"
                   "aaa"
                          )
               }
        }

Damit wird die Funktion rightLineTextOne möglich, mit den Variablen padding und markup.

%---------------------- markup-command musicglyph-string-center-column ---------
       
#(define-markup-command (musicglyph-string-center-column layout props arg) (list?)   
   (let* (
    (list-length (length arg))
    (MARKUP (if (<= list-length 1)
                  (markup
                    (#:fill-line
                      (#:musicglyph-string (list-ref arg 0))))
                (if (= list-length 2)
                      (markup
                          (#:fill-line
                            (#:center-column
             (#:musicglyph-string (list-ref arg 0)
              #:musicglyph-string (list-ref arg 1)))))
    (if (<= list-length 3)
                          (markup
                            (#:fill-line
                              (#:center-column
                          (#:musicglyph-string (list-ref arg 0)
                           #:musicglyph-string (list-ref arg 1)
                           #:musicglyph-string (list-ref arg 2)))))
              (markup
                (#:fill-line
                  (#:center-column
      (#:musicglyph-string (list-ref arg 0)
       #:musicglyph-string (list-ref arg 1)
       #:musicglyph-string (list-ref arg 2)
       #:musicglyph-string (list-ref arg 3)))))))))
        (MARKUP-Stencil (interpret-markup layout props MARKUP))
        (newMARKUP (ly:stencil-translate-axis MARKUP-Stencil 1.5 X))
    )
    newMARKUP
     ))
 
%------------------- Test ------------------------------------------------------   
     
\relative c'' {
           \set Staff.instrumentName = \markup {\smaller\smaller
               \center-column {
                       "new markup-command  "
                       "musicglyph-string-center-column  "
               }
           }
           
        a1^\markup {
        \override #'(line-width . 0) {
                \musicglyph-string-center-column #'(
                "dal_scripts.segno_al_scripts.coda_"
                "poi segue"
                "…_…_…"
                "aaa"
                       )
            }
        }
}

%----------------------- Funktion rightLineTextOne -----------------------------

rightLineTextOne =
#(define-music-function (parser location padding markup )(number? list?)
#{   
  \stopStaff
  \cadenzaOn
  \textLengthOn
  \override TextScript #'padding = $padding             
  \override TextScript #'staff-padding = #'()           
  \override TextScript #'outside-staff-priority = ##f
  s1
  ^\markup \override #'(line-width . 10) {
  \hspace #'3
  \musicglyph-string-center-column #$markup
  \hspace #'1
  }
  \bar ""
  \cadenzaOff
  \startStaff
 
#})     

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

\relative c' {
           \set Staff.instrumentName = \markup {\smaller\smaller
               \center-column {
                       "Funktion rightLineTextOne mit"
                       "new markup-command  "
                       "musicglyph-string-center-column  "
               }
           }
           
        a1 b c d e f g b a, b c d e f
        \rightLineTextOne #'-4 #'(
               "dal_scripts.segno_al_scripts.coda_"
               "poi segue"
               " …_…_… "
               )
\break
        a1
}

Als dritten Schritt dachte ich mir, es wäre doch schön die padding-Variable zu eliminieren und die Verschiebung automatisch berechnen zu lassen. Und so habe ich das markup-command musicglyph-string-center-column-offset geschrieben.
Damit gelingt die Funktion rightLineText mit nur noch der markup-Variablen.

%--------------- markup-command musicglyph-string-center-column-offset ---------
       
#(define-markup-command (musicglyph-string-center-column-offset layout props arg) (list?)   
   (let* (
    (list-length (length arg))
    (MARKUP (if (<= list-length 1)
                  (markup
                    (#:fill-line
                      (#:musicglyph-string (list-ref arg 0))))
                (if (= list-length 2)
                      (markup
                          (#:fill-line
                            (#:center-column
             (#:musicglyph-string (list-ref arg 0)
              #:musicglyph-string (list-ref arg 1)))))
    (if (<= list-length 3)
                          (markup
                            (#:fill-line
                              (#:center-column
                          (#:musicglyph-string (list-ref arg 0)
                           #:musicglyph-string (list-ref arg 1)
                           #:musicglyph-string (list-ref arg 2)))))
              (markup
                (#:fill-line
                  (#:center-column
      (#:musicglyph-string (list-ref arg 0)
       #:musicglyph-string (list-ref arg 1)
       #:musicglyph-string (list-ref arg 2)
       #:musicglyph-string (list-ref arg 3)))))))))
        (MARKUP-Stencil (interpret-markup layout props MARKUP))
        (MARKUP-Ext (ly:stencil-extent MARKUP-Stencil Y))
        (MARKUP-Height (interval-length MARKUP-Ext))
        (alignY (if (<= list-length 1)
            (/ 6 (sqrt (sqrt (sqrt (sqrt (sqrt MARKUP-Height))))))
            (if (= list-length 2)
                (/ 7.5 (sqrt (sqrt (sqrt (sqrt (sqrt MARKUP-Height))))))
                (if (= list-length 3)
                    (/ 9 (sqrt (sqrt (sqrt (sqrt (sqrt MARKUP-Height))))))
        (/ 10.5 (sqrt (sqrt (sqrt (sqrt (sqrt (sqrt MARKUP-Height)))))))))))
        (newMARKUP (ly:stencil-translate MARKUP-Stencil (cons 0.9 alignY) ))
    )
    newMARKUP
     ))

%------------------- Test ------------------------------------------------------     
     
    \relative c'' {
           \set Staff.instrumentName = \markup {\smaller\smaller
               \center-column {
                       "new markup-command  "
                       "musicglyph-string-center-column-offset  "
               }
           }
           
            a1^\markup {
                \override #'(line-width . 0) {\null
                \musicglyph-string-center-column-offset #'(
                "dal_scripts.segno_al_scripts.coda_"
                "poi segue"
                " …_…_… "
                "aaa"
                       )
                }
            }
    } 
 
%----------------------- Funktion rightLineText --------------------------------   
   
rightLineText =
#(define-music-function (parser location markup)(list?)
#{   
  \stopStaff
  \cadenzaOn
  \textLengthOn
  \override TextScript #'padding = #-6             
  \override TextScript #'staff-padding = #'()           
  \override TextScript #'outside-staff-priority = ##f
  s1
  ^\markup \override #'(line-width . 10) {
          \hspace #'3
  \musicglyph-string-center-column-offset #$markup
  \hspace #'1
  }
  \bar ""
  \cadenzaOff
  \startStaff
 
#})     

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

\relative c' {
           \set Staff.instrumentName = \markup {\smaller\smaller
               \center-column {
                       "Funktion rightLineText mit"
                       "new markup-command  "
                       "musicglyph-string-center-column-offset  "
               }
           }

        a1 b c d e f g b a, b c d e f
       
   %\once\override TextScript #'extra-offset = #'(0 . -10)
   
        \rightLineText #'(
               "dal_scripts.segno_al_scripts.coda_"
               "poi segue"
               "…_…_…"
               "aaa"
               )
\break
  a1
}

Anmerkungen:
Ich war leider nicht in der Lage eine Schleife so zu programmieren, daß eine String-Liste nacheinander abgearbeitet wird. So sind einige Definitionen etwas sperrig geworden.
musicglyph-string-center-column und musicglyph-string-center-column-offset verarbeiten bis zu vier Listenplätze also vier Zeilen. Man kann zwar längere Listen angeben und es kommt auch keine Warnmeldung, aber alles, was über Platz vier hinausgeht wird nicht dargestellt.
Da ich rightLineText noch nicht so wirklich ausgiebig getestet habe, bin ich auch noch ein wenig skeptisch, ob sie wirklich immer ein zufriedenstellendes Ergebnis liefert. Falls nicht, muß man entweder mit \once\override TextScript #'extra-offset = ...  nachhelfen oder rightLineTextOne verwenden.

HTH

Gruß,
  Harm

P.S. Ich habe den Code oben aufgeteilt, um ihn besser kommentieren zu können. Im Anhang ist er komplett als ein file.

ding-dong

  • Member
Re: Text rechts neben Notenzeile
« Antwort #7 am: Dienstag, 19. Juli 2011, 06:44 »
 8) super - vielen dank!

ding-dong

ps: ich hoffe, das kommt auch ins LSR!