Compare commits
9 Commits
set-spacin
...
f0ffd3f630
Author | SHA1 | Date | |
---|---|---|---|
f0ffd3f630 | |||
8dfbc5ef25 | |||
8800341e18 | |||
d56c11c5ff | |||
754682afcf | |||
88f0dc9f8f | |||
e9b904c32c | |||
fd14138d0b | |||
a1bc48b824 |
@ -1,7 +1,10 @@
|
|||||||
#(define noStandaloneOutput (if (defined? 'noStandaloneOutput) noStandaloneOutput #f))
|
#(define noStandaloneOutput (if (defined? 'noStandaloneOutput) noStandaloneOutput #f))
|
||||||
|
|
||||||
#(if (defined? 'LAYOUT) #f (load "json_parser.scm"))
|
#(if (defined? 'LAYOUT) #f
|
||||||
#(use-modules (json parser))
|
(let ((scmdir (string-append (dirname (current-filename)) file-name-separator-string "scm" file-name-separator-string)))
|
||||||
|
(load (string-append scmdir "json_parser.scm"))
|
||||||
|
(load (string-append scmdir "resolve_inherits.scm"))
|
||||||
|
(load (string-append scmdir "yaml_parser.scm"))))
|
||||||
\include "basic_format_and_style_settings.ly"
|
\include "basic_format_and_style_settings.ly"
|
||||||
\include "eps_file_from_song_dir.ly"
|
\include "eps_file_from_song_dir.ly"
|
||||||
\include "title_with_category_images.ly"
|
\include "title_with_category_images.ly"
|
||||||
|
44
appendix.ly
Normal file
44
appendix.ly
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
appendix =
|
||||||
|
#(define-void-function (parser location title) (markup?)
|
||||||
|
(define (appendix-item->markup layout props appendix-item)
|
||||||
|
(interpret-markup layout props
|
||||||
|
(markup
|
||||||
|
#:override (cons 'appendixItem:heading (assoc-ref appendix-item "heading"))
|
||||||
|
#:override (cons 'appendixItem:text (assoc-ref appendix-item "text"))
|
||||||
|
(ly:output-def-lookup layout 'appendixItemMarkup))))
|
||||||
|
(ly:book-add-bookpart! (ly:parser-lookup '$current-book)
|
||||||
|
#{
|
||||||
|
\bookpart {
|
||||||
|
\markup { #title }
|
||||||
|
#(for-each
|
||||||
|
(lambda (item)
|
||||||
|
(add-score (ly:make-page-label-marker (string->symbol (car item))))
|
||||||
|
(add-text
|
||||||
|
(make-on-the-fly-markup
|
||||||
|
(lambda (layout props arg) (appendix-item->markup layout props (cdr item)))
|
||||||
|
(make-null-markup)))
|
||||||
|
)
|
||||||
|
(reverse APPENDIX_DATA))
|
||||||
|
}
|
||||||
|
#}))
|
||||||
|
|
||||||
|
#(define-markup-command (appendix-ref layout props label) (symbol?)
|
||||||
|
"call page-ref to appendix-item"
|
||||||
|
(interpret-markup layout props
|
||||||
|
(markup #:with-link label
|
||||||
|
#:override (cons 'appendixPage (make-page-ref-markup label "XXX" "?"))
|
||||||
|
(ly:output-def-lookup layout 'appendixReferenceMarkup))))
|
||||||
|
|
||||||
|
\paper {
|
||||||
|
appendixItemMarkup = \markup {
|
||||||
|
\left-column {
|
||||||
|
\line { \large \bold \fromproperty #'appendixItem:heading }
|
||||||
|
\vspace #0.2
|
||||||
|
\sans \wordwrap-field #'appendixItem:text
|
||||||
|
\vspace #0.7
|
||||||
|
}
|
||||||
|
}
|
||||||
|
appendixReferenceMarkup = \markup {
|
||||||
|
\fromproperty #'appendixPage
|
||||||
|
}
|
||||||
|
}
|
@ -105,13 +105,21 @@ romanStanza =
|
|||||||
#(define-music-function (parser location) ()
|
#(define-music-function (parser location) ()
|
||||||
#{ \override StanzaNumber.style = #'roman #})
|
#{ \override StanzaNumber.style = #'roman #})
|
||||||
|
|
||||||
|
override-stanza =
|
||||||
|
#(define-music-function (parser location stanzanumber) (number?)
|
||||||
|
#{
|
||||||
|
\once \override StanzaNumber.forced-spacing = #stanzanumber % misuse property "forced-spacing" to override the stanzanumber
|
||||||
|
#}
|
||||||
|
)
|
||||||
|
|
||||||
stanza =
|
stanza =
|
||||||
#(define-music-function (parser location stanzanumber) (number?)
|
#(define-music-function (parser location stanzanumber) (number?)
|
||||||
#{
|
#{
|
||||||
\once \override StanzaNumber.layer = 23 % set this to signal that there is a real stanza and no repeat signs
|
\once \override StanzaNumber.layer = 23 % set this to signal that there is a real stanza and no repeat signs
|
||||||
\applyContext
|
\applyContext
|
||||||
#(lambda (context)
|
#(lambda (context)
|
||||||
(let* ((stanzastyle (ly:assoc-get 'style (ly:context-grob-definition context 'StanzaNumber)))
|
(let* ((stanzanumber (ly:assoc-get 'forced-spacing (ly:context-grob-definition context 'StanzaNumber) stanzanumber))
|
||||||
|
(stanzastyle (ly:assoc-get 'style (ly:context-grob-definition context 'StanzaNumber)))
|
||||||
(formattedStanzaNumber (format #f (if (eq? stanzastyle 'roman) romanStanzaFormat stanzaFormat) stanzanumber)))
|
(formattedStanzaNumber (format #f (if (eq? stanzastyle 'roman) romanStanzaFormat stanzaFormat) stanzanumber)))
|
||||||
(ly:context-set-property! context 'stanza formattedStanzaNumber)))
|
(ly:context-set-property! context 'stanza formattedStanzaNumber)))
|
||||||
#}
|
#}
|
||||||
@ -147,4 +155,23 @@ repStopWithTag = \lyricmode {
|
|||||||
\once \override StanzaNumber.direction = 1
|
\once \override StanzaNumber.direction = 1
|
||||||
\set stanza = \markup { \repStop }
|
\set stanza = \markup { \repStop }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rightHyphen = \lyricmode {
|
||||||
|
\once \override StanzaNumber.font-series = #'normal
|
||||||
|
\once \override StanzaNumber.direction = 1
|
||||||
|
\set stanza = "-"
|
||||||
|
}
|
||||||
|
|
||||||
|
leftHyphen = \lyricmode {
|
||||||
|
\once \override StanzaNumber.font-series = #'normal
|
||||||
|
\set stanza = "-"
|
||||||
|
}
|
||||||
|
|
||||||
|
multiVerseSkips =
|
||||||
|
#(define-music-function (parser location skips) (number?)
|
||||||
|
#{ \tag #'multiVerse { \repeat unfold #skips { \skip4 } } #})
|
||||||
|
|
||||||
|
alt =
|
||||||
|
#(define-music-function (parser location a b) (ly:music? ly:music?)
|
||||||
|
#{ \tag #'firstVerse { #a } \tag #'multiVerse { #b } #})
|
@ -138,3 +138,33 @@ generalLayout = \layout {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#}))
|
#}))
|
||||||
|
|
||||||
|
% If you add this engraver to ChordNames Context chords get only printed on chordchanges and if its the first chord after line break.
|
||||||
|
Ensure_first_chord_after_line_break_printed_engraver =
|
||||||
|
#(lambda (ctx)
|
||||||
|
(define last-system-column-rank 0)
|
||||||
|
(make-engraver
|
||||||
|
(acknowledgers
|
||||||
|
((chord-name-interface this-engraver grob source-engraver)
|
||||||
|
(ly:grob-set-property! grob 'after-line-breaking
|
||||||
|
(lambda (grob)
|
||||||
|
(let ((current-system-column-rank (car (ly:grob-spanned-column-rank-interval (ly:grob-system grob)))))
|
||||||
|
(if (and
|
||||||
|
(ly:context-property ctx 'chordChanges #f)
|
||||||
|
(ly:grob-property grob 'begin-of-line-visible #f)
|
||||||
|
(not (= last-system-column-rank current-system-column-rank)))
|
||||||
|
; the current chord handling implementation in lilypond uses 'begin-of-line-visible to mark repeated chords
|
||||||
|
(ly:grob-set-property! grob 'begin-of-line-visible #f))
|
||||||
|
(set! last-system-column-rank current-system-column-rank)
|
||||||
|
(ly:chord-name::after-line-breaking grob)
|
||||||
|
)))))))
|
||||||
|
|
||||||
|
% If you add this engraver to ChordNames Context chords get only printed on chordchanges and not at newline.
|
||||||
|
Ignoring_newline_chord_changes_engraver =
|
||||||
|
#(lambda (ctx)
|
||||||
|
(make-engraver
|
||||||
|
(acknowledgers
|
||||||
|
((chord-name-interface this-engraver grob source-engraver)
|
||||||
|
(when (and (ly:context-property ctx 'chordChanges #f) (ly:grob-property grob 'begin-of-line-visible #f))
|
||||||
|
(ly:grob-suicide! grob)
|
||||||
|
)))))
|
22
scm/resolve_inherits.scm
Normal file
22
scm/resolve_inherits.scm
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
(define (resolve-inherit-entry-in-list alist entry)
|
||||||
|
(let* ((key (car entry))
|
||||||
|
(attributes (cdr entry))
|
||||||
|
(inherits (assoc-ref attributes "inherits")))
|
||||||
|
(if inherits
|
||||||
|
(let* ((alist-without-entry (alist-delete key alist))
|
||||||
|
(inherit-entry (assoc inherits alist-without-entry))
|
||||||
|
(inherits-attributes (if inherit-entry (alist-copy (cdr (resolve-inherit-entry-in-list alist-without-entry inherit-entry)))))
|
||||||
|
(override-attributes (alist-delete "inherits" attributes)))
|
||||||
|
(if inherit-entry
|
||||||
|
(begin
|
||||||
|
(for-each (lambda (attribute) (assoc-set! inherits-attributes (car attribute) (cdr attribute))) override-attributes)
|
||||||
|
(cons key inherits-attributes)
|
||||||
|
)
|
||||||
|
(ly:error "~a can not inherit from ~a" key inherits))
|
||||||
|
)
|
||||||
|
entry
|
||||||
|
)))
|
||||||
|
|
||||||
|
(define (resolve-inherits alist)
|
||||||
|
(map (lambda (entry) (resolve-inherit-entry-in-list alist entry)) alist)
|
||||||
|
)
|
10
scm/yaml_parser.scm
Normal file
10
scm/yaml_parser.scm
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
(use-modules (ice-9 popen) (ice-9 textual-ports) (json parser))
|
||||||
|
|
||||||
|
(define (yml-file->scm filename)
|
||||||
|
(let* ((python_cmd (string-append "import sys, yaml, json; print(json.dumps(yaml.safe_load(open('" filename "'))))"))
|
||||||
|
(pipe (open-pipe* OPEN_READ "python" "-c" python_cmd))
|
||||||
|
(json (get-string-all pipe)))
|
||||||
|
(close-pipe pipe)
|
||||||
|
(json-string->scm json)))
|
||||||
|
|
||||||
|
(define (parse-yml-file filename) (resolve-inherits (yml-file->scm filename)))
|
@ -277,6 +277,7 @@
|
|||||||
\ChordNames
|
\ChordNames
|
||||||
\override VerticalAxisGroup.staff-affinity = ##f
|
\override VerticalAxisGroup.staff-affinity = ##f
|
||||||
\override ChordName.extra-spacing-width = #'(-0.1 . 0.1)
|
\override ChordName.extra-spacing-width = #'(-0.1 . 0.1)
|
||||||
|
\consists \Ensure_first_chord_after_line_break_printed_engraver
|
||||||
}
|
}
|
||||||
\context {
|
\context {
|
||||||
\Score
|
\Score
|
||||||
|
Reference in New Issue
Block a user