lilypond-common-includes/verses_with_chords.ly

170 lines
7.4 KiB
Plaintext

% guile regular expressions aktivieren:
#(use-modules (ice-9 regex))
% parsing line by line
#(define-markup-command (wrap-newline layout props text) (string?)
"Text Zeile für Zeile parsen"
(interpret-markup layout props
#{ \markup { \column {
$(let ((verse-markup-string (string-append "\\line { "
(regexp-substitute/global #f "\n"
text
'pre " } \\line { " 'post )
" \\size-box-to-box ##f ##t \"\" \"Agj\" }" )))
;(ly:parse-string-expression (if (< (list-ref (ly:version) 1) 19) (ly:parser-clone parser) (ly:parser-clone)) verse-markup-string))
(if (< (list-ref (ly:version) 1) 19) (ly:parser-include-string parser verse-markup-string) (ly:parser-include-string verse-markup-string)))
}}#}
)
)
#(define-markup-command (size-box-to-box layout props use-x use-y abox bbox)
(boolean? boolean? markup? markup?)
(let* ((ma (interpret-markup layout props abox))
(mb (interpret-markup layout props bbox))
(ax (ly:stencil-extent ma X))
(ay (ly:stencil-extent ma Y))
(bx (ly:stencil-extent mb X))
(by (ly:stencil-extent mb Y))
(halfdiffabx (* (- (interval-length bx) (interval-length ax)) 0.5)))
(ly:stencil-translate (ly:make-stencil (ly:stencil-expr ma)
(if use-x
(if (< halfdiffabx 0)
(cons
(- (interval-bound ax DOWN) halfdiffabx)
(+ (interval-bound ax UP) halfdiffabx))
bx)
ax)
(if use-y by ay))
(cons (if (and use-x (< halfdiffabx 0)) halfdiffabx 0) 0) )))
#(define-markup-command (size-box-to-box-left-aligned layout props use-x use-y abox bbox)
(boolean? boolean? markup? markup?)
(let* ((ma (interpret-markup layout props abox))
(mb (interpret-markup layout props bbox))
(ax (ly:stencil-extent ma X))
(ay (ly:stencil-extent ma Y))
(bx (ly:stencil-extent mb X))
(by (ly:stencil-extent mb Y)))
(ly:make-stencil (ly:stencil-expr ma)
(if use-x bx ax)
(if use-y by ay))
))
#(define-markup-command (size-box-to-box-style-dependent layout props use-x use-y abox bbox)
(boolean? boolean? markup? markup?)
(interpret-markup layout props
(case songTextChordAlignment
((center) (make-size-box-to-box-markup use-x use-y abox bbox))
((left) (make-size-box-to-box-left-aligned-markup use-x use-y abox bbox)))))
% Akkorde in Strophen transponieren
#(define-markup-list-command (transpose layout props from to markuplist)
(markup? markup? markup-list?)
(interpret-markup-list layout (prepend-alist-chain 'transposition (cons from to) props) markuplist))
#(define-markup-command (chord-alignment-style-dependent layout props chord-with-text) (markup?)
(interpret-markup layout props
(case songTextChordAlignment
((center) (make-center-align-markup chord-with-text))
((left) (make-left-align-markup chord-with-text)))))
% Text über Text mittig darstellen
#(define-markup-command (textup layout props text uptext) (markup? markup?)
"Markup über Text mittig darstellen."
(interpret-markup layout props
#{\markup {
\size-box-to-box-style-dependent ##t ##f
\general-align #X #LEFT \override #`(direction . ,UP) \override #'(baseline-skip . 1.0) \dir-column \chord-alignment-style-dependent {
\pad-to-box #'(0 . 0) #'(0 . 2.0) { #text }
\size-box-to-box ##f ##t #uptext \score { \chords { g4:m a } \layout { \generalLayout } }
}
#text
}
#}
))
#(define-markup-command (anchor-x-between layout props arga argb)
(markup? markup?)
(let* ((la (interval-length (ly:stencil-extent (interpret-markup layout props arga) X)))
(m (interpret-markup layout props (markup #:general-align Y DOWN arga argb (make-size-box-to-box-markup #t #t (markup #:null) arga))))
(l (interval-length (ly:stencil-extent m X))))
(ly:stencil-aligned-to m X (- (/ (* la 2) l) 1))
))
#(define-markup-command (stanza-raw layout props arg)
(markup?)
(interpret-markup layout props
(if (and (string? arg) (string-null? arg))
" "
#{\markup
\score { \new Lyrics { \lyricmode { \set stanza = #arg "" } } \layout { \generalLayout } }
#}
)))
#(define-markup-command (stanza layout props arg)
(markup?)
(interpret-markup layout props
(make-size-box-to-box-markup #f #t (make-stanza-raw-markup arg) (make-stanza-raw-markup "x"))))
% Kompletten Vers mit Akkorden
#(define-markup-command (chordverse layout props stanza verse) (markup? string?)
"Vers mit Akkorden"
(let* ((fromto (chain-assoc-get 'transposition props #f))
(transp (if fromto
(string-append "\\transpose " (car fromto) " " (cdr fromto))
"")))
(interpret-markup layout props
(markup #:override `(baseline-skip . ,songTextLineHeigth) #:anchor-x-between #:stanza stanza
(make-wrap-newline-markup
(regexp-substitute/global #f "\\(( *)([^,()]*)( *),([^)]*)\\)"
(regexp-substitute/global #f "(([^ \n]*\\([^()]*\\)[^ \n]*)+)" verse
'pre " \\concat { " 1 " } " 'post)
'pre "\\textup \\line { \"" 1 "\" " 2 " \"" 3 "\" } \\score { \\transposable " transp " \\chords { s4 " 4 " } \\layout { \\verseChordLayout } }" 'post))
))))
% Kompletter Vers aus dem Akkorde entfernt werden
#(define-markup-command (nochordverse layout props stanza verse) (markup? string?)
"Vers ohne Akkorde"
(interpret-markup layout props
(markup #:override '(baseline-skip . 3.0) #:anchor-x-between #:stanza stanza
#:wrap-newline (regexp-substitute/global #f "\\(([^,]*),([^)]*)\\)" verse 'pre 1 'post )
)
)
)
#(define-markup-command (verseformat layout props verse) (markup?)
"Textformatierung für Strophen"
(interpret-markup layout props
(make-sans-markup (make-fontsize-markup (ly:output-def-lookup layout 'lyric-size) verse))
)
)
#(define-markup-command (group-verses layout props versegroup) (markup-list?)
#:properties ((verse-cols 1)
(verse-vspace 1)
(verse-hspace 1)
(verse-ordering-horizontal #f))
"Gruppiere Strophen in einem Markup auf Wunsch spaltenweise"
(let ((h (make-hash-table verse-cols))
(index 0)
(column-item-count (ceiling (/ (length versegroup) verse-cols))))
(for-each (lambda (el)
(let ((i (if verse-ordering-horizontal
(modulo index verse-cols)
(floor (/ index column-item-count)))))
(hashv-set! h i (cons el (hashv-ref h i (list)))) (set! index (+ index 1))))
versegroup)
(interpret-markup layout props
(make-fill-line-markup (cons (make-verseformat-markup (make-line-markup
(reverse (hash-fold (lambda (key value l)
(cons (make-column-markup
(fold (lambda (v verses)
(cons v (if (null? verses)
verses
(cons (make-vspace-markup verse-vspace) verses))))
(list) value))
(if (null-list? l)
l
(cons (make-hspace-markup verse-hspace) l))))
(list) h))))
(list))))))