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.