Compare commits
	
		
			55 Commits
		
	
	
		
			tocSubtitl
			...
			47bb7991b8
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 47bb7991b8 | |||
| d94703547c | |||
| f0ffd3f630 | |||
| 8dfbc5ef25 | |||
| 8800341e18 | |||
| d56c11c5ff | |||
| 754682afcf | |||
| 88f0dc9f8f | |||
| e9b904c32c | |||
| fd14138d0b | |||
| a1bc48b824 | |||
| b4690f63bc | |||
| 958efca6aa | |||
| 81a5676965 | |||
| 5ee1a7b6be | |||
| 162d32c53d | |||
| a3c3a67b33 | |||
| 09d3bb7fa1 | |||
| bab581042a | |||
| 3b87476549 | |||
| c4bfc17b89 | |||
| e388559f23 | |||
| e17c544763 | |||
| 3c2f27b477 | |||
| b3d46ff607 | |||
| 0df95f6441 | |||
| 201a54f60a | |||
| 0199813a81 | |||
| bce9ffe763 | |||
| 86943b9316 | |||
| 5884ab9d2c | |||
| 199f515be9 | |||
| 8c7386807b | |||
| 7f7cac99f4 | |||
| 395e959432 | |||
| e72efbd156 | |||
| a0f60bc1c7 | |||
| f5d5e1b020 | |||
| 4f43791541 | |||
|  | 2f906344de | ||
| b23ba5c0dc | |||
| bc769f0831 | |||
| 6975cb1713 | |||
| fbaf7a2c86 | |||
| 8b0fc2d7c9 | |||
| 14e01900c2 | |||
| bf596edb2c | |||
| d6774670f3 | |||
| 260664462d | |||
| 9de2869750 | |||
| f0010c7746 | |||
| bedb2c0e22 | |||
| 33c3d47504 | |||
| 15f37accaa | |||
| c26fddd963 | 
							
								
								
									
										26
									
								
								all_base_includes.ly
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								all_base_includes.ly
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| #(define noStandaloneOutput (if (defined? 'noStandaloneOutput) noStandaloneOutput #f)) | ||||
|  | ||||
| #(if (defined? 'LAYOUT) #f | ||||
|   (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 "eps_file_from_song_dir.ly" | ||||
| \include "title_with_category_images.ly" | ||||
| \include "chord_settings.ly" | ||||
| \include "transposition.ly" | ||||
| \include "verses_with_chords.ly" | ||||
| \include "arrows_in_scores.ly" | ||||
| \include "swing_style.ly" | ||||
| \include "inline_score.ly" | ||||
|  | ||||
| % reset important variables | ||||
| LAYOUT = \layout { \generalLayout } | ||||
| HEADER = {} | ||||
| MUSIC = {} | ||||
| TEXT = \markuplist {""} | ||||
|  | ||||
| verseChords = {} | ||||
| firstVoice = {} | ||||
| global = {} | ||||
							
								
								
									
										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 | ||||
|   } | ||||
| } | ||||
| @@ -1,86 +0,0 @@ | ||||
| %% http://lsr.dsi.unimi.it/LSR/Item?id=336 | ||||
| %% see also http://code.google.com/p/lilypond/issues/detail?id=1228 | ||||
|  | ||||
| %% Usage: | ||||
| %%   \new Staff \with { | ||||
| %%     \override RestCollision.positioning-done = #merge-rests-on-positioning | ||||
| %%   } << \somevoice \\ \othervoice >> | ||||
| %% or (globally): | ||||
| %%   \layout { | ||||
| %%     \context { | ||||
| %%       \Staff | ||||
| %%       \override RestCollision.positioning-done = #merge-rests-on-positioning | ||||
| %%     } | ||||
| %%   } | ||||
| %% | ||||
| %% Limitations: | ||||
| %% - only handles two voices | ||||
| %% - does not handle multi-measure/whole-measure rests | ||||
|  | ||||
| #(define (rest-score r) | ||||
|   (let ((score 0) | ||||
| 	(yoff (ly:grob-property-data r 'Y-offset)) | ||||
| 	(sp (ly:grob-property-data r 'staff-position))) | ||||
|     (if (number? yoff) | ||||
| 	(set! score (+ score 2)) | ||||
| 	(if (eq? yoff 'calculation-in-progress) | ||||
| 	    (set! score (- score 3)))) | ||||
|     (and (number? sp) | ||||
| 	 (<= 0 2 sp) | ||||
| 	 (set! score (+ score 2)) | ||||
| 	 (set! score (- score (abs (- 1 sp))))) | ||||
|     score)) | ||||
|  | ||||
| #(define (merge-rests-on-positioning grob) | ||||
|   (let* ((can-merge #f) | ||||
| 	 (elts (ly:grob-object grob 'elements)) | ||||
| 	 (num-elts (and (ly:grob-array? elts) | ||||
| 			(ly:grob-array-length elts))) | ||||
| 	 (two-voice? (= num-elts 2))) | ||||
|     (if two-voice? | ||||
| 	(let* ((v1-grob (ly:grob-array-ref elts 0)) | ||||
| 	       (v2-grob (ly:grob-array-ref elts 1)) | ||||
| 	       (v1-rest (ly:grob-object v1-grob 'rest)) | ||||
| 	       (v2-rest (ly:grob-object v2-grob 'rest))) | ||||
| 	  (and | ||||
| 	   (ly:grob? v1-rest) | ||||
| 	   (ly:grob? v2-rest) | ||||
| 	   (let* ((v1-duration-log (ly:grob-property v1-rest 'duration-log)) | ||||
| 		  (v2-duration-log (ly:grob-property v2-rest 'duration-log)) | ||||
| 		  (v1-dot (ly:grob-object v1-rest 'dot)) | ||||
| 		  (v2-dot (ly:grob-object v2-rest 'dot)) | ||||
| 		  (v1-dot-count (and (ly:grob? v1-dot) | ||||
| 				     (ly:grob-property v1-dot 'dot-count -1))) | ||||
| 		  (v2-dot-count (and (ly:grob? v2-dot) | ||||
| 				     (ly:grob-property v2-dot 'dot-count -1)))) | ||||
| 	     (set! can-merge | ||||
| 		   (and | ||||
| 		    (number? v1-duration-log) | ||||
| 		    (number? v2-duration-log) | ||||
| 		    (= v1-duration-log v2-duration-log) | ||||
| 		    (eq? v1-dot-count v2-dot-count))) | ||||
| 	     (if can-merge | ||||
| 		 ;; keep the rest that looks best: | ||||
| 		 (let* ((keep-v1? (>= (rest-score v1-rest) | ||||
| 				      (rest-score v2-rest))) | ||||
| 			(rest-to-keep (if keep-v1? v1-rest v2-rest)) | ||||
| 			(dot-to-kill (if keep-v1? v2-dot v1-dot))) | ||||
| 		   ;; uncomment if you're curious of which rest was chosen: | ||||
| 		   ;;(ly:grob-set-property! v1-rest 'color green) | ||||
| 		   ;;(ly:grob-set-property! v2-rest 'color blue) | ||||
| 		   (ly:grob-suicide! (if keep-v1? v2-rest v1-rest)) | ||||
| 		   (if (ly:grob? dot-to-kill) | ||||
| 		       (ly:grob-suicide! dot-to-kill)) | ||||
| 		   (ly:grob-set-property! rest-to-keep 'direction 0) | ||||
| 		   (ly:rest::y-offset-callback rest-to-keep))))))) | ||||
|     (if can-merge | ||||
| 	#t | ||||
| 	(ly:rest-collision::calc-positioning-done grob)))) | ||||
|  | ||||
| generalLayout = \layout { | ||||
|   \generalLayout | ||||
|   \context { | ||||
|     \Staff | ||||
|     \override RestCollision.positioning-done = #merge-rests-on-positioning | ||||
|   } | ||||
| } | ||||
| @@ -1,8 +1,8 @@ | ||||
| \language "deutsch" | ||||
|  | ||||
| \include "default_author_style.ly" | ||||
| \include "styles.ly" | ||||
| \include #(ly:format "styles/~a.ly" songStyle) | ||||
| \include "default_style.ly" | ||||
| \include "default_songinfo_style.ly" | ||||
| \include "footer_with_songinfo.ly" | ||||
|  | ||||
| \include #(if (defined? 'customStyleOverridesFile) customStyleOverridesFile "void.ly") | ||||
|  | ||||
| @@ -14,7 +14,6 @@ | ||||
|   property-defaults.fonts.sans = \songLyricFont | ||||
|   %annotate-spacing = ##t | ||||
|   % spacing stuff | ||||
|   lyric-size = #lyricSize | ||||
|   two-sided = ##t | ||||
|   inner-margin = 1.5\cm | ||||
|   outer-margin = \songMargin | ||||
| @@ -40,6 +39,7 @@ generalLayout = \layout { | ||||
|   \context { | ||||
|     \Staff | ||||
|     \accidentalStyle modern | ||||
|     \consists Merge_rests_engraver | ||||
|   } | ||||
|   \context { | ||||
|     \Score | ||||
| @@ -61,6 +61,11 @@ generalLayout = \layout { | ||||
|     \Voice | ||||
|     % ich will lines breaken wie ich will! | ||||
|     \remove "Forbid_line_break_engraver" | ||||
|     \override NoteHead.layer = 2 | ||||
|     \override Dots.layer = 2 | ||||
|     \override Stem.layer = 2 | ||||
|     \override Flag.layer = 2 | ||||
|     \override Beam.layer = 2 | ||||
|   } | ||||
| } | ||||
|  | ||||
| @@ -72,27 +77,101 @@ textp = \lyricmode { \markup { \raise #1 \musicglyph #"rests.3" } } | ||||
| % zweite Stimme alles grau | ||||
| secondVoiceStyle = { | ||||
|   \override NoteHead.color = #grey | ||||
|   \override Dots.color = #grey | ||||
|   \override Stem.color = #grey | ||||
|   \override Flag.color = #grey | ||||
|   \override Beam.color = #grey | ||||
|   \override NoteHead.layer = 1 | ||||
|   \override Dots.layer = 1 | ||||
|   \override Stem.layer = 1 | ||||
|   \override Flag.layer = 1 | ||||
|   \override Beam.layer = 1 | ||||
| } | ||||
|  | ||||
| firstVoiceStyle = { | ||||
|   \override NoteHead.color = #black | ||||
|   \override Dots.color = #black | ||||
|   \override Stem.color = #black | ||||
|   \override Flag.color = #black | ||||
|   \override Beam.color = #black | ||||
| } | ||||
|  | ||||
| % einzelne Noten innerhalb von \secondVoiceStyle mit schwarzem statt grauem Kopf | ||||
| % Deprecated: einzelne Noten innerhalb von \secondVoiceStyle mit schwarzem statt grauem Kopf | ||||
| schwarzkopf = | ||||
|   #(define-music-function (parser location noten) (ly:music?) | ||||
|   #{ | ||||
|    \revert NoteHead.color | ||||
|    $noten | ||||
|    \override NoteHead.color = #grey | ||||
|   #}) | ||||
|     (begin (ly:warning "\\schwarzkopf brauchts nicht mehr, das kann ersatzlos weg!") noten)) | ||||
|  | ||||
| % hübsche Wiederholungszeichen für den Liedtext | ||||
| repStart = "𝄆" | ||||
| repStop = "𝄇" | ||||
| romanStanza = | ||||
|   #(define-music-function (parser location) () | ||||
|   #{ \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 = | ||||
| #(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 | ||||
|   \applyContext | ||||
|   #(lambda (context) | ||||
|     (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))) | ||||
|         (ly:context-set-property! context 'stanza formattedStanzaNumber))) | ||||
| #} | ||||
| ) | ||||
|  | ||||
| ref = { | ||||
|   \once \override StanzaNumber.layer = 23 % set this to signal that there is a real stanza and no repeat signs | ||||
|   \set stanza = \refString | ||||
| } | ||||
|  | ||||
| % prints a repStart Sign as stanza if the tag 'repeats is kept. | ||||
| % if there was a stanza already set by the stanza function with StanzaNumber.layer = 23 we set that also as stanza. | ||||
| repStartWithTag = \lyricmode { | ||||
|   \tag #'repeats { | ||||
|     \applyContext | ||||
|     #(lambda (context) | ||||
|       (let ((lastStanza (ly:context-property context 'stanza)) | ||||
|             (printLastStanza (= (ly:assoc-get 'layer (ly:context-grob-definition context 'StanzaNumber) 0) 23)) | ||||
|             (stanzaFontSeries (ly:assoc-get 'font-series (ly:context-grob-definition context 'StanzaNumber) 'normal))) | ||||
|       (ly:context-set-property! context 'stanza | ||||
|         (make-concat-markup | ||||
|           (if printLastStanza | ||||
|             (list (make-override-markup `(font-series . ,stanzaFontSeries) lastStanza) (make-hspace-markup 1) repStart) | ||||
|             (list repStart) | ||||
|             ))))) | ||||
|     \once \override StanzaNumber.font-series = #'normal | ||||
|   } | ||||
| } | ||||
|  | ||||
| repStopWithTag = \lyricmode { | ||||
|   \tag #'repeats { | ||||
|     \once \override StanzaNumber.font-series = #'normal | ||||
|     \once \override StanzaNumber.direction = 1 | ||||
|     \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 } #}) | ||||
| @@ -1,5 +1,3 @@ | ||||
| \version "2.18" | ||||
|  | ||||
| #(define song-list '()) | ||||
|  | ||||
| #(define (files-in-directory dirname) | ||||
| @@ -120,7 +118,7 @@ includeSong = | ||||
|      #{ | ||||
|      \bookOutputName #filename | ||||
|      #} | ||||
|     (ly:parser-parse-string (if (< (list-ref (ly:version) 1) 19) (ly:parser-clone parser) (ly:parser-clone)) | ||||
|     (ly:parser-parse-string (ly:parser-clone) | ||||
|       (ly:format "\\include \"~a/~a/~a.ly\"" songPath filename filename)) | ||||
|     (let ((label (gensym "index"))) | ||||
|       (set! additional-page-switch-label-list | ||||
| @@ -155,7 +153,7 @@ imagepage = | ||||
| songs = | ||||
| #(define-void-function (parser location) () | ||||
|  (for-each (lambda (songitems) | ||||
|    (ly:book-add-bookpart! (if (< (list-ref (ly:version) 1) 19) (ly:parser-lookup parser '$current-book) (ly:parser-lookup '$current-book)) | ||||
|    (ly:book-add-bookpart! (ly:parser-lookup '$current-book) | ||||
|     (let ((filename (car songitems)) | ||||
|           (songvars (cdr songitems))) | ||||
|       (if (eq? filename 'emptyPage) | ||||
|   | ||||
							
								
								
									
										2
									
								
								break_paged_output.ily
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								break_paged_output.ily
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| \include "lilypond-book-preamble.ly" | ||||
| #(ly:set-option 'separate-page-formats "pdf") | ||||
| @@ -8,6 +8,16 @@ klamm = #(define-music-function (parser location chords) (ly:music?) | ||||
| 	\set chordNameFunction = #ignatzek-chord-names | ||||
| #}) | ||||
|  | ||||
| repeats-around-chords = | ||||
| #(define-music-function (parser location chords) (ly:music?) | ||||
| #{ | ||||
|   \once \set noChordSymbol = \markup { \normal-text \repStart } | ||||
|   r4 | ||||
| 	$chords | ||||
|   \once \set noChordSymbol = \markup { \normal-text \repStop } | ||||
|   r4 | ||||
| #}) | ||||
|  | ||||
| bchord = | ||||
| #(define-music-function (parser location chords) (ly:music?) | ||||
| #{ | ||||
| @@ -22,6 +32,38 @@ shiftChord = #(define-music-function (parser location xshift chord) (number? ly: | ||||
| 	$chord | ||||
| #}) | ||||
|  | ||||
| shiftChords = #(define-music-function (parser location xshift chords) (number? ly:music?) | ||||
| #{ | ||||
| 	\override ChordName.extra-offset = #`(,xshift . 0) | ||||
| 	$chords | ||||
| #}) | ||||
|  | ||||
| altChord = #(define-music-function (parser location mainchord altchord) (ly:music? ly:music?) | ||||
| (define (chord-namer in-pitches bass inversion context) | ||||
| #{ | ||||
|   \markup { | ||||
|     \translate #'(-0.5 . 0) | ||||
|     \score { | ||||
|       \chords { #mainchord \klamm #altchord } | ||||
|       \layout { | ||||
|         \LAYOUT | ||||
|         \context { | ||||
|           \ChordNames | ||||
|           \override ChordName.extra-spacing-width = #'(0 . 0.3) | ||||
|         } | ||||
|         \context { | ||||
|           \Score | ||||
|           \override SpacingSpanner.spacing-increment = 0 | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| #}) | ||||
| #{ | ||||
|   \once \set chordNameFunction = #chord-namer | ||||
| 	#mainchord | ||||
| #}) | ||||
|  | ||||
| % kleine Mollakkorde und Alteration ausgeschrieben | ||||
| #(define (note-name->german-markup-nosym pitch lowercase?) | ||||
|    (define (pitch-alteration-semitones pitch) (inexact->exact (round (* (ly:pitch-alteration pitch) 2)))) | ||||
| @@ -71,7 +113,7 @@ generalLayout = \layout { | ||||
|     \semiGermanChords | ||||
|     \override ChordName.font-size = \songScoreChordFontSize | ||||
|     \override ChordName.font-series = \songChordFontSeries | ||||
|     \override ChordName.font-family = #'sans | ||||
|     \override ChordName.font-family = #'serif | ||||
|     chordNameLowercaseMinor = ##t | ||||
|     chordChanges = ##t | ||||
|     % eigenen chordRootNamer damit F# = Fis und Gb = Ges (also alteration ausgeschrieben) | ||||
| @@ -79,16 +121,6 @@ generalLayout = \layout { | ||||
|     chordNoteNamer = #bassnote-name->german-markup-nosym | ||||
|     majorSevenSymbol = "maj7" | ||||
|     chordNameExceptions = \chordNameExceptions | ||||
|     % der baseline-skip der Akkorde beeinflusst, wie hoch die Hochstellung ist | ||||
|     \override ChordName.baseline-skip = #1.0 | ||||
|   } | ||||
| } | ||||
|  | ||||
| verseChordLayout = \layout { | ||||
|   \generalLayout | ||||
|   \context { | ||||
|     \ChordNames | ||||
|     \override ChordName.font-size = \songTextChordFontSize | ||||
|   } | ||||
| } | ||||
|  | ||||
| @@ -97,14 +129,42 @@ verseChordLayout = \layout { | ||||
|    (interpret-markup layout props | ||||
|      #{ \markup { \override #'(baseline-skip . 2) | ||||
|           \center-column { | ||||
|             \score { \new ChordNames { #(if (< (list-ref (ly:version) 1) 19) | ||||
|               (ly:parser-include-string parser (string-append "\\chordmode { s4 " chord " }")) | ||||
|               (ly:parser-include-string (string-append "\\chordmode { s4 " chord " }")) | ||||
|               ) } \layout { \generalLayout } } | ||||
|             \override #'(fret-diagram-details . ( | ||||
|                      (barre-type . straight))) { | ||||
|             \fret-diagram-terse #fret | ||||
|             \score { \new ChordNames { | ||||
|               #(ly:parser-include-string (string-append "\\chordmode { s4 " chord " }")) | ||||
|             } \layout { \generalLayout } } | ||||
|             \override #'(fret-diagram-details . ((barre-type . straight))) { | ||||
|               \fret-diagram-terse #fret | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|      #})) | ||||
|  | ||||
| % 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) | ||||
|                 ))))) | ||||
| @@ -1,26 +0,0 @@ | ||||
| \paper { | ||||
|   authorMarkup = | ||||
|     #(make-on-the-fly-markup | ||||
|       (lambda (layout props m) | ||||
|         (let ((name (chain-assoc-get 'author:name props #f)) | ||||
|              (trail_name (chain-assoc-get 'author:trail_name props #f)) | ||||
|              (birth_year (chain-assoc-get 'author:birth_year props #f)) | ||||
|              (death_year (chain-assoc-get 'author:death_year props #f)) | ||||
|              (organization (chain-assoc-get 'author:organization props #f))) | ||||
|           (interpret-markup layout props | ||||
|             (string-append | ||||
|               name | ||||
|               (if trail_name (ly:format " (~a)" trail_name) "") | ||||
|               (if (and birth_year death_year) | ||||
|                 (ly:format ", (~a‒~a)" birth_year death_year) | ||||
|                 (if birth_year | ||||
|                   (ly:format ", (*~a)" birth_year) | ||||
|                   (if death_year (ly:format ", (†~a)" death_year) ""))) | ||||
|               (if organization (ly:format ", ~a" organization) "") | ||||
|           )))) | ||||
|       (make-null-markup) | ||||
|     ) | ||||
|   poetMarkup = \markup { "Worte:" \fromproperty #'author } | ||||
|   composerMarkup = \markup { "Weise:" \fromproperty #'author } | ||||
|   poetAndComposerEqualMarkup = \markup { "Worte und Weise:" \fromproperty #'author } | ||||
| } | ||||
							
								
								
									
										7
									
								
								default_output.ly
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								default_output.ly
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| #(define noDefaultOutput (if (defined? 'noDefaultOutput) noDefaultOutput #f)) | ||||
| HEADER = \bookpart { | ||||
|   \header { | ||||
|     \basicSongInfo | ||||
|   } | ||||
| } | ||||
| \include #(if noDefaultOutput "void.ly" "standalone_output.ly") | ||||
							
								
								
									
										62
									
								
								default_songinfo_style.ly
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								default_songinfo_style.ly
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| \paper { | ||||
|   poetPrefix = "Worte:" | ||||
|   composerPrefix = "Weise:" | ||||
|   compositionPrefix = "Satz:" | ||||
|   poetAndComposerEqualPrefix = "Worte und Weise:" | ||||
|   voicePrefix = "Stimme:" | ||||
|   versePrefix = "Strophe:" | ||||
|   translationPrefix = "Übersetzung:" | ||||
|   interludePrefix = "Zwischenspiel:" | ||||
|   bridgePrefix = "Bridge:" | ||||
|  | ||||
|   authorFormat = | ||||
|     #(lambda (noDetails name trail_name birth_year death_year organization) | ||||
|         (let ((string-present (lambda (str) (and str (not (and (string? str) (string-null? str)))))) | ||||
|               (render_informations (lambda (infolist) (string-append (car infolist) (if (or noDetails (null? (cdr infolist))) "" (string-append " (" (string-join (cdr infolist) ", ") ")")))))) | ||||
|             (if (or (string-present trail_name) (string-present name)) | ||||
|               (render_informations (filter string-present (list | ||||
|                 trail_name | ||||
|                 name | ||||
|                 (if (and (string-present birth_year) (string-present death_year)) | ||||
|                   (ly:format "~a‒~a" birth_year death_year) | ||||
|                   (if (string-present birth_year) | ||||
|                     (ly:format "*~a" birth_year) | ||||
|                     (if (string-present death_year) (ly:format "†~a" death_year) ""))) | ||||
|                 organization | ||||
|               ))) | ||||
|               "" | ||||
|           ))) | ||||
|  | ||||
|   songinfoMarkup = | ||||
|     #(make-on-the-fly-markup | ||||
|       (lambda (layout props m) | ||||
|         (let* ((between-poet-and-composer-markup (chain-assoc-get 'header:between-poet-and-composer-markup props (make-hspace-markup 3))) | ||||
|               (poet-maybe-with-composer (chain-assoc-get 'songinfo:poet-maybe-with-composer props #f)) | ||||
|               (composer (chain-assoc-get 'songinfo:composer props #f)) | ||||
|               (copyright (chain-assoc-get 'songinfo:copyright props #f)) | ||||
|               (infotext (chain-assoc-get 'songinfo:infotext props #f)) | ||||
|               (translation (chain-assoc-get 'songinfo:translation props #f)) | ||||
|               (pronunciation (chain-assoc-get 'songinfo:pronunciation props #f)) | ||||
|               (year_text (chain-assoc-get 'songinfo:year_text props #f)) | ||||
|               (year_melody (chain-assoc-get 'songinfo:year_melody props #f)) | ||||
|               (poet-with-year (if (and poet-maybe-with-composer year_text) (string-append poet-maybe-with-composer ", " year_text) poet-maybe-with-composer)) | ||||
|               (composer-with-year (if (and composer year_melody) (string-append composer ", " year_melody) composer)) | ||||
|               (poet-and-composer-oneliner (if (and poet-with-year composer-with-year) (markup poet-with-year between-poet-and-composer-markup composer-with-year) #f)) | ||||
|               (current-line-width (chain-assoc-get 'line-width props (ly:output-def-lookup layout 'line-width)))) | ||||
|           (stack-lines DOWN 0.0 (chain-assoc-get 'baseline-skip props) | ||||
|             (interpret-markup-list layout props | ||||
|               (append | ||||
|                 (if (and poet-and-composer-oneliner (< (interval-length (ly:stencil-extent (interpret-markup layout props poet-and-composer-oneliner) X)) current-line-width)) | ||||
|                   (list poet-and-composer-oneliner) | ||||
|                   (make-wordwrap-string-internal-markup-list #t (string-append | ||||
|                     (if poet-with-year (string-append "\n\n" poet-with-year) "") | ||||
|                     (if composer-with-year (string-append "\n\n" composer-with-year) "") | ||||
|                   ))) | ||||
|                 (make-wordwrap-string-internal-markup-list #t (string-append | ||||
|                   (if copyright (string-append "\n\n© " copyright) "") | ||||
|                   (if infotext (string-append "\n\n" infotext) "") | ||||
|                   (if translation (string-append "\n\nÜbersetzung: " translation) "") | ||||
|                   (if pronunciation (string-append "\n\nAussprache: " pronunciation) "")))))))) | ||||
|       (make-null-markup) | ||||
|     ) | ||||
| } | ||||
							
								
								
									
										23
									
								
								default_style.ly
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								default_style.ly
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| songFormatAndSize = "a5" | ||||
| songMargin = 5 | ||||
| songInfoFontSize = 0 | ||||
| songInfoLineWidthFraction = 0.9 | ||||
| songTitleSize = 6 | ||||
| songTitleFont = "LilyPond Sans" | ||||
| songChordFont = "LilyPond Sans" | ||||
| songLyricFont = "LilyPond Sans" | ||||
| songChordFontSeries = #'bold | ||||
| songTextChordAlignment = #'left | ||||
| songScoreChordFontSize = 2 | ||||
| songTextChordFontSize = \songScoreChordFontSize | ||||
| songTextChordDistance = 2.8 | ||||
| songTextLineHeigth = 5.8 | ||||
| songTocColumns = 3 | ||||
| globalSize = 15 | ||||
| lyricSize = 1.6 | ||||
| stanzaFormat = "~a." | ||||
| romanStanzaFormat = "~@r." | ||||
| refString = "Ref.:" | ||||
| % hübsche Wiederholungszeichen für den Liedtext | ||||
| repStart = "𝄆" | ||||
| repStop = "𝄇" | ||||
| @@ -1,3 +1,4 @@ | ||||
| #(use-modules (ice-9 receive)) | ||||
| #(define-markup-command (print-songinfo layout props) () | ||||
|   (define (songinfo-from songId key) | ||||
|     (let ((song (if (defined? 'SONG_DATA) (assoc-ref SONG_DATA songId) #f))) | ||||
| @@ -5,60 +6,187 @@ | ||||
|         (assoc-ref song key) | ||||
|         (ly:warning (ly:format "song with id ~a not found" songId))))) | ||||
|  | ||||
|   (define (format-author authorId) | ||||
|   (define (format-author authorId noDetails) | ||||
|     (let ((author (if (defined? 'AUTHOR_DATA) (assoc-ref AUTHOR_DATA authorId) #f))) | ||||
|       (if author | ||||
|         (markup | ||||
|           #:override (cons 'author:name (assoc-ref author "name")) | ||||
|           #:override (cons 'author:trail_name (assoc-ref author "trail_name")) | ||||
|           #:override (cons 'author:birth_year (assoc-ref author "birth_year")) | ||||
|           #:override (cons 'author:death_year (assoc-ref author "death_year")) | ||||
|           #:override (cons 'author:organization (assoc-ref author "organization")) | ||||
|           (ly:output-def-lookup layout 'authorMarkup)) | ||||
|         (ly:warning (ly:format "author with id ~a not found" authorId))))) | ||||
|         ((ly:output-def-lookup layout 'authorFormat) | ||||
|           noDetails | ||||
|           (assoc-ref author "name") | ||||
|           (assoc-ref author "trail_name") | ||||
|           (assoc-ref author "birth_year") | ||||
|           (assoc-ref author "death_year") | ||||
|           (assoc-ref author "organization") | ||||
|         ) | ||||
|         "unbekannt"))) | ||||
|  | ||||
|   (define (format-poet poetId) | ||||
|     (markup #:override (cons 'author (format-author poetId)) (ly:output-def-lookup layout 'poetMarkup))) | ||||
|     (string-append (ly:output-def-lookup layout 'poetPrefix) " " (format-author poetId #f))) | ||||
|  | ||||
|   (define (format-composer composerId) | ||||
|     (markup #:override (cons 'author (format-author composerId)) (ly:output-def-lookup layout 'composerMarkup))) | ||||
|     (string-append (ly:output-def-lookup layout 'composerPrefix) " " (format-author composerId #f))) | ||||
|  | ||||
|   (define (format-poet-and-composer authorId) | ||||
|     (markup #:override (cons 'author (format-author authorId)) (ly:output-def-lookup layout 'poetAndComposerEqualMarkup))) | ||||
|     (string-append (ly:output-def-lookup layout 'poetAndComposerEqualPrefix) " " (format-author authorId #f))) | ||||
|  | ||||
|   (define (find-author-ids-by contributionType authors) | ||||
|     (filter-map (lambda (authordata) (if (member contributionType (cdr authordata)) (car authordata) #f)) authors) | ||||
|   ) | ||||
|  | ||||
|   (define (find-author-id-with-part-numbers contributionType authors) | ||||
|     (filter-map (lambda (authordata) | ||||
|       (let ((contributionNumbers (filter-map (lambda (contribution) (if (and (list? contribution) (equal? contributionType (car contribution))) (cadr contribution) #f)) (cdr authordata))) | ||||
|             (authorId (car authordata))) | ||||
|         (if (null? contributionNumbers) #f (cons authorId contributionNumbers)) | ||||
|       )) authors) | ||||
|   ) | ||||
|  | ||||
|   (define (numbered-contribution-prefix contributionNumbers prefixLookup) | ||||
|     (string-append | ||||
|       (string-join (map (lambda (contributionNumber) (ly:format "~a." contributionNumber)) contributionNumbers) ", ") | ||||
|       " " | ||||
|       (ly:output-def-lookup layout prefixLookup) | ||||
|     ) | ||||
|   ) | ||||
|  | ||||
|   (define referencedAuthors '()) | ||||
|  | ||||
|   (define (format-authors authorIds) | ||||
|     (map (lambda (authorId) | ||||
|       (format-author | ||||
|         authorId | ||||
|         (if (member authorId referencedAuthors) | ||||
|           #t | ||||
|           (begin | ||||
|             (set! referencedAuthors (cons authorId referencedAuthors)) | ||||
|             #f))) | ||||
|     ) authorIds) | ||||
|   ) | ||||
|  | ||||
|   (define (render-contribution-group contributionPrefix authorIds) | ||||
|     (if (null? authorIds) | ||||
|       "" | ||||
|       (string-append contributionPrefix " " (string-join (format-authors authorIds) ", "))) | ||||
|   ) | ||||
|  | ||||
|   (define (render-partial-contribution-group prefixLookup authorData) | ||||
|     (if (null? authorData) | ||||
|       "" | ||||
|       (let ((firstAuthorContributions (cdar authorData))) | ||||
|         (receive (authorDataSame authorDataOther) | ||||
|             (partition (lambda (authorEntry) (equal? (cdr authorEntry) firstAuthorContributions)) authorData) | ||||
|           (string-append | ||||
|             (render-contribution-group (numbered-contribution-prefix firstAuthorContributions prefixLookup) (map car authorDataSame)) | ||||
|             " " | ||||
|             (render-partial-contribution-group prefixLookup authorDataOther) | ||||
|           )))) | ||||
|   ) | ||||
|  | ||||
|   (define (join-present items joiner) | ||||
|     (string-join (filter (lambda (item) (and (string? item) (not (string-null? (string-trim-both item))))) items) joiner) | ||||
|   ) | ||||
|  | ||||
|   (define (poet-and-composer-from-authors authors) | ||||
|     (if authors | ||||
|       (let ( | ||||
|             (poetIds (find-author-ids-by 'text authors)) | ||||
|             (translatorIds (find-author-ids-by 'translation authors)) | ||||
|             (versePoetData (find-author-id-with-part-numbers 'verse authors)) | ||||
|             (composerIds (find-author-ids-by 'melody authors)) | ||||
|             (verseComposerData (find-author-id-with-part-numbers 'meloverse authors)) | ||||
|             (voiceComposerData (find-author-id-with-part-numbers 'voice authors)) | ||||
|             (compositionIds (find-author-ids-by 'composition authors)) | ||||
|             (bridgeIds (find-author-ids-by 'bridge authors)) | ||||
|             (interludeIds (find-author-ids-by 'interlude authors)) | ||||
|             (year_text (chain-assoc-get 'header:year_text props #f)) | ||||
|             (year_translation (chain-assoc-get 'header:year_translation props #f)) | ||||
|             (year_melody (chain-assoc-get 'header:year_melody props #f)) | ||||
|             (year_composition (chain-assoc-get 'header:year_composition props #f)) | ||||
|             ) | ||||
|         (if (and (equal? poetIds composerIds) (null? translatorIds) (null? versePoetData) (null? verseComposerData) (null? voiceComposerData) (null? compositionIds) (null? bridgeIds) (null? interludeIds)) | ||||
|           (list | ||||
|             (join-present (list | ||||
|               (render-contribution-group (ly:output-def-lookup layout 'poetAndComposerEqualPrefix) poetIds) | ||||
|               (if (equal? year_text year_melody) year_text (join-present (list year_text year_melody) "/")) | ||||
|             ) ", ") | ||||
|             #f) | ||||
|           (list | ||||
|             (if (and (null? poetIds) (null? versePoetData) (null? translatorIds)) #f | ||||
|               (string-append | ||||
|                 (ly:output-def-lookup layout 'poetPrefix) | ||||
|                 " " | ||||
|                 (join-present (list | ||||
|                   (join-present (list | ||||
|                     (render-contribution-group "" poetIds) | ||||
|                     year_text | ||||
|                   ) ", ") | ||||
|                   (render-partial-contribution-group 'versePrefix versePoetData) | ||||
|                   (join-present (list | ||||
|                     (render-contribution-group (ly:output-def-lookup layout 'translationPrefix) translatorIds) | ||||
|                     year_translation | ||||
|                   ) ", ") | ||||
|                 ) "; ") | ||||
|               )) | ||||
|             (if (and (null? composerIds) (null? compositionIds) (null? verseComposerData) (null? voiceComposerData) (null? bridgeIds) (null? interludeIds)) #f | ||||
|               (string-append | ||||
|                 (ly:output-def-lookup layout 'composerPrefix) | ||||
|                 " " | ||||
|                 (join-present (list | ||||
|                   (join-present (list | ||||
|                     (render-contribution-group "" composerIds) | ||||
|                     year_melody | ||||
|                   ) ", ") | ||||
|                   (render-partial-contribution-group 'versePrefix verseComposerData) | ||||
|                   (render-partial-contribution-group 'voicePrefix voiceComposerData) | ||||
|                   (join-present (list | ||||
|                     (render-contribution-group (ly:output-def-lookup layout 'compositionPrefix) compositionIds) | ||||
|                     year_composition | ||||
|                   ) ", ") | ||||
|                   (render-contribution-group (ly:output-def-lookup layout 'bridgePrefix) bridgeIds) | ||||
|                   (render-contribution-group (ly:output-def-lookup layout 'interludePrefix) interludeIds) | ||||
|                 ) "; ") | ||||
|               ))))) | ||||
|       (list #f #f) | ||||
|     ) | ||||
|   ) | ||||
|  | ||||
|   (interpret-markup layout props | ||||
|     (if (chain-assoc-get 'page:is-bookpart-last-page props #f) | ||||
|     (let* ((songId (chain-assoc-get 'header:songId props #f)) | ||||
|     (let* ((authors (chain-assoc-get 'header:authors props #f)) | ||||
|            (poet-and-composers (poet-and-composer-from-authors authors)) | ||||
|            (songId (chain-assoc-get 'header:songId props #f)) | ||||
|            (poetId (chain-assoc-get 'header:poetId props (if songId (songinfo-from songId "poet") #f))) | ||||
|            (composerId (chain-assoc-get 'header:composerId props (if songId (songinfo-from songId "composer") #f))) | ||||
|            (poet-and-composer-same (equal? poetId composerId))) | ||||
|       (let ( | ||||
|             (blockwidth (* (chain-assoc-get 'header:songinfo-size-factor props 0.9) (ly:output-def-lookup layout 'line-width))) | ||||
|             (infotext (chain-assoc-get 'header:songinfo props #f)) | ||||
|             (poet (chain-assoc-get 'header:poet props (if poetId (if poet-and-composer-same (format-poet-and-composer poetId) (format-poet poetId)) #f))) | ||||
|             (composer (chain-assoc-get 'header:composer props (if (and composerId (not poet-and-composer-same)) (format-composer composerId) #f))) | ||||
|             (poet-and-composer-stacked (chain-assoc-get 'header:poet-and-composer-stacked props songInfoPoetAndComposerStacked)) | ||||
|             (between-poet-and-composer-markup (chain-assoc-get 'header:between-poet-and-composer-markup props (make-hspace-markup 3))) | ||||
|             (copyright (chain-assoc-get 'header:copyright props #f))) | ||||
|             (markup #:override '(baseline-skip . 3.0) ( | ||||
|                 make-fontsize-markup songInfoFontSize | ||||
|                 (make-sans-markup | ||||
|                 ;%\override #'(line-width . 92) \wordwrap-field #symbol | ||||
|                 (make-column-markup (list | ||||
|                   (make-line-markup | ||||
|                    (list | ||||
|                     (if (and poet (not (and (string? poet) (string-null? poet)))) (markup poet between-poet-and-composer-markup) "") | ||||
|                     (if (and composer (not poet-and-composer-stacked)) composer "")) | ||||
|                   ) | ||||
|                   (if (and composer poet-and-composer-stacked) (make-line-markup (list composer)) "") | ||||
|                   (make-override-markup `(line-width . ,blockwidth) (make-justify-string-markup (string-append | ||||
|                     (if (and copyright (not (and (string? copyright) (string-null? copyright)))) (ly:format "© ~a\n\n" copyright) "") | ||||
|                     (if infotext infotext "") | ||||
|                   ))) | ||||
|                 ))) | ||||
|               ) | ||||
|             ) | ||||
|           )) | ||||
|       (let ((infotext (chain-assoc-get 'header:infotext props (chain-assoc-get 'header:songinfo props #f))) | ||||
|             (poet-maybe-with-composer (chain-assoc-get 'header:poet props (if poetId (if poet-and-composer-same (format-poet-and-composer poetId) (format-poet poetId)) (car poet-and-composers)))) | ||||
|             (composer (chain-assoc-get 'header:composer props (if (and composerId (not poet-and-composer-same)) (format-composer composerId) (cadr poet-and-composers)))) | ||||
|             (copyright (chain-assoc-get 'header:copyright props #f)) | ||||
|             (translation (chain-assoc-get 'header:translation props #f)) | ||||
|             (pronunciation (chain-assoc-get 'header:pronunciation props #f)) | ||||
|             (year_text (if (string? (car poet-and-composers)) #f (chain-assoc-get 'header:year_text props #f))) | ||||
|             (year_melody (if (string? (car poet-and-composers)) #f (chain-assoc-get 'header:year_melody props #f)))) | ||||
|             (markup | ||||
|               #:override (cons 'songinfo:poet-maybe-with-composer | ||||
|                 (if (and poet-maybe-with-composer (not (and (string? poet-maybe-with-composer) (string-null? poet-maybe-with-composer)))) poet-maybe-with-composer #f)) | ||||
|               #:override (cons 'songinfo:composer | ||||
|                 (if (and composer (not (and (string? composer) (string-null? composer)))) composer #f)) | ||||
|               #:override (cons 'songinfo:copyright | ||||
|                 (if (and copyright (not (and (string? copyright) (string-null? copyright)))) copyright #f)) | ||||
|               #:override (cons 'songinfo:infotext | ||||
|                 (if (and infotext (not (and (string? infotext) (string-null? infotext)))) infotext #f)) | ||||
|               #:override (cons 'songinfo:translation | ||||
|                 (if (and translation (not (and (string? translation) (string-null? translation)))) translation #f)) | ||||
|               #:override (cons 'songinfo:pronunciation | ||||
|                 (if (and pronunciation (not (and (string? pronunciation) (string-null? pronunciation)))) pronunciation #f)) | ||||
|               #:override (cons 'songinfo:year_text | ||||
|                 (if (and year_text (not (and (string? year_text) (string-null? year_text)))) year_text #f)) | ||||
|               #:override (cons 'songinfo:year_melody | ||||
|                 (if (and year_melody (not (and (string? year_melody) (string-null? year_melody)))) year_melody #f)) | ||||
|               #:override '(baseline-skip . 3.0) | ||||
|               #:fontsize songInfoFontSize | ||||
|               #:sans | ||||
|               (ly:output-def-lookup layout 'songinfoMarkup) | ||||
|             ))) | ||||
|       (make-null-markup))) | ||||
| ) | ||||
|  | ||||
| @@ -72,6 +200,12 @@ | ||||
|         ) | ||||
|    )))) | ||||
|  | ||||
| #(define-markup-command (fractional-line-width layout props arg)(markup?) | ||||
|   (interpret-markup layout props | ||||
|     (make-override-markup | ||||
|       `(line-width . ,(* (chain-assoc-get 'header:songinfo-size-factor props songInfoLineWidthFraction) (ly:output-def-lookup layout 'line-width))) | ||||
|       arg))) | ||||
|  | ||||
| \paper { | ||||
|   print-first-page-number = ##t | ||||
|   first-page-number = #0 | ||||
| @@ -79,14 +213,14 @@ | ||||
|   oddFooterMarkup = \markup { | ||||
|     \fill-line { | ||||
|       \line { \null } | ||||
|       \line { \general-align #Y #DOWN \print-songinfo } | ||||
|       \line { \general-align #Y #DOWN \fractional-line-width \print-songinfo } | ||||
|       \line { \if \should-print-page-number \print-pagenumber } | ||||
|     } | ||||
|   } | ||||
|   evenFooterMarkup  = \markup { | ||||
|     \fill-line { | ||||
|       \line { \if \should-print-page-number \print-pagenumber } | ||||
|       \line { \general-align #Y #DOWN \print-songinfo } | ||||
|       \line { \general-align #Y #DOWN \fractional-line-width \print-songinfo } | ||||
|       \line { \null } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -1,28 +1,6 @@ | ||||
| \version "2.18" | ||||
|  | ||||
| \version "2.25.8" | ||||
| #(ly:set-option 'relative-includes #t) | ||||
|  | ||||
| \include #(if (< (list-ref (ly:version) 1) 24) "legacy-lilypond-compatibility.ly" "void.ly") | ||||
| #(define noDefaultOutput #t) | ||||
|  | ||||
| #(define noStandaloneOutput (if (defined? 'noStandaloneOutput) noStandaloneOutput #f)) | ||||
|  | ||||
| #(if (defined? 'LAYOUT) #f (load "json_parser.scm")) | ||||
| #(use-modules (json parser)) | ||||
| \include "basic_format_and_style_settings.ly" | ||||
| \include #(if (< (list-ref (ly:version) 1) 25) "legacy-lilypond-compatibility-pre-2.25.ly" "void.ly") | ||||
| \include "eps_file_from_song_dir.ly" | ||||
| \include "title_with_category_images.ly" | ||||
| \include "footer_with_songinfo.ly" | ||||
| \include "auto_rest_merging.ly" | ||||
| \include "chord_settings.ly" | ||||
| \include "transposition.ly" | ||||
| \include "verses_with_chords.ly" | ||||
| \include "arrows_in_scores.ly" | ||||
| \include "swing_style.ly" | ||||
| \include "inline_score.ly" | ||||
|  | ||||
| % reset important variables | ||||
| LAYOUT = \layout { \generalLayout } | ||||
| HEADER = {} | ||||
| MUSIC = {} | ||||
| TEXT = \markuplist {""} | ||||
| \include "all_base_includes.ly" | ||||
| @@ -4,5 +4,5 @@ inline-score = | ||||
| #(define-music-function (music) (ly:music?) | ||||
|    (set! INLINESCOREMUSIC #{ \INLINESCOREMUSIC #music #}) | ||||
|     #{ | ||||
|       \transposable #music | ||||
|       \transposable #TRANSPOSITION #music | ||||
|     #}) | ||||
|   | ||||
| @@ -1,22 +0,0 @@ | ||||
| % guile regular expressions aktivieren: | ||||
| #(use-modules (ice-9 regex)) | ||||
|  | ||||
| #(define ly:make-regex make-regexp) | ||||
| #(define ly:regex-exec regexp-exec) | ||||
| #(define ly:regex-match-substring match:substring) | ||||
| #(define (ly:regex-replace pattern text . replacements) | ||||
|   (apply regexp-substitute/global #f pattern text 'pre (append replacements (list 'post)))) | ||||
|  | ||||
|  | ||||
| % old font handling | ||||
|  | ||||
| #(define (default-pango size) | ||||
|   (make-pango-font-tree | ||||
|     songChordFont | ||||
|     songLyricFont | ||||
|     "Luxi Mono" | ||||
|     (/ size 20))) | ||||
|  | ||||
| \paper { | ||||
|   #(define fonts (default-pango globalSize)) | ||||
| } | ||||
| @@ -1,27 +0,0 @@ | ||||
| % this is to be compatible to older lilypond versions | ||||
| \version "2.18.0" | ||||
|  | ||||
| #(define (on-first-page layout props) | ||||
|   "Whether the markup is printed on the first page of the book." | ||||
|   (= (chain-assoc-get 'page:page-number props -1) | ||||
|      (book-first-page layout props))) | ||||
|  | ||||
| #(define-markup-command (if layout props condition? argument) | ||||
|   (procedure? markup?) | ||||
|   #:category conditionals | ||||
|   (if (condition? layout props) | ||||
|       (interpret-markup layout props argument) | ||||
|       empty-stencil)) | ||||
|  | ||||
| #(define (on-first-page-of-part layout props) | ||||
|   "Whether the markup is printed on the first page of the book part." | ||||
|   (= (chain-assoc-get 'page:page-number props -1) | ||||
|      (ly:output-def-lookup layout 'first-page-number))) | ||||
|  | ||||
| #(define (should-print-page-number layout props) | ||||
|   "Whether the page number should be printed on this page.  This depends | ||||
| on the settings @code{print-@/page-@/numbers} and | ||||
| @code{print-@/first-@/page-@/number} of the @code{\\paper} block." | ||||
|   (and (eq? #t (ly:output-def-lookup layout 'print-page-number)) | ||||
|        (or (not (on-first-page layout props)) | ||||
|            (eq? #t (ly:output-def-lookup layout 'print-first-page-number))))) | ||||
							
								
								
									
										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))) | ||||
							
								
								
									
										8
									
								
								snippet_include.ly
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								snippet_include.ly
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| #(ly:set-option 'relative-includes #t) | ||||
|  | ||||
| #(define noDefaultOutput (if (defined? 'noDefaultOutput) noDefaultOutput #f)) | ||||
|  | ||||
| \include #(if noDefaultOutput "void.ly" "all_base_includes.ly") | ||||
|  | ||||
| #(define AUTHOR_DATA (if (defined? 'AUTHOR_DATA) AUTHOR_DATA (parse-yml-file "../data/authors.yml"))) | ||||
| #(define SONG_DATA (if (defined? 'SONG_DATA) SONG_DATA (parse-yml-file "../data/songs.yml"))) | ||||
| @@ -1,21 +1,36 @@ | ||||
| % set the speed of the midi music | ||||
| #(define midiQuarterNoteSpeed (if (defined? 'midiQuarterNoteSpeed) midiQuarterNoteSpeed 90)) | ||||
|  | ||||
| MUSIC = { \transposable \MUSIC } | ||||
| MUSIC = { \transposable #TRANSPOSITION \MUSIC } | ||||
|  | ||||
| % nur Output wenn noStandaloneOutput auf false steht | ||||
| output = #(if (not noStandaloneOutput) | ||||
| #{ | ||||
|   \bookpart { | ||||
|     \HEADER | ||||
| verselayout = \layout { | ||||
|   \LAYOUT | ||||
|   \context { | ||||
|     \ChordNames | ||||
|     \override ChordName.font-size = \songTextChordFontSize | ||||
|   } | ||||
| } | ||||
| TEXT = \markuplist { | ||||
|   \override #`(transposition . ,TRANSPOSITION) | ||||
|   \override #`(verselayout . ,verselayout) | ||||
|   \override #`(verse-chords . ,#{ \chords { \verseChords } #}) | ||||
|   \override #`(verse-reference-voice . ,#{ \global \firstVoice  #}) | ||||
|   \TEXT | ||||
| } | ||||
|  | ||||
| #(if (not noStandaloneOutput) | ||||
| (begin | ||||
|   (let ((header (ly:book-header HEADER)) (paper (ly:book-paper HEADER))) | ||||
|     (if header (set! $defaultheader header)) | ||||
|     (if paper (set! $defaultpaper paper)) | ||||
|   ) | ||||
|   (add-score #{ | ||||
|     \score { | ||||
|       \MUSIC | ||||
|       \layout { \LAYOUT } | ||||
|     } | ||||
|  | ||||
|     \TEXT | ||||
|  | ||||
|     }#}) | ||||
|   (add-score TEXT) | ||||
|   (add-score #{ | ||||
|     \score { | ||||
|       \unfoldRepeats { \MUSIC \INLINESCOREMUSIC } | ||||
|       \midi { | ||||
| @@ -25,15 +40,5 @@ output = #(if (not noStandaloneOutput) | ||||
|           tempoWholesPerMinute = #(ly:make-moment midiQuarterNoteSpeed 4) | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|  | ||||
|   } | ||||
| #} | ||||
| ) | ||||
|  | ||||
| % if we don't want a standalone output, cause we compile a book, we just have an empty output here, | ||||
| % so lilypond does not generate output for this song | ||||
| \book { | ||||
|   \bookpart { \output } | ||||
| } | ||||
|     }#}) | ||||
| )) | ||||
| @@ -5,7 +5,7 @@ | ||||
|  | ||||
| #(define songStyle | ||||
|   (if (not (defined? 'songStyle)) | ||||
|       (if (not (defined? 'defaultSongStyle)) 'börnel defaultSongStyle) | ||||
|       (if (not (defined? 'defaultSongStyle)) 'default defaultSongStyle) | ||||
|       songStyle)) | ||||
|  | ||||
| #(if (not (boolean? bookStyle)) | ||||
|   | ||||
| @@ -1,15 +0,0 @@ | ||||
| songFormatAndSize = "a6landscape" | ||||
| songMargin = 8 | ||||
| songInfoFontSize = -1.5 | ||||
| songTitleFont = "Britannic T. custom" | ||||
| songChordFont = "TimesNewRomanPS" | ||||
| songLyricFont = "Arial" | ||||
| songChordFontSeries = #'normal | ||||
| songTextChordAlignment = #'left | ||||
| songScoreChordFontSize = 3 | ||||
| songTextChordFontSize = 2 | ||||
| songTextLineHeigth = 5.5 | ||||
| songInfoPoetAndComposerStacked = ##f | ||||
| songTocColumns = 3 | ||||
| globalSize = 15 | ||||
| lyricSize = 1.6 | ||||
| @@ -1,15 +0,0 @@ | ||||
| songFormatAndSize = "b6landscape" | ||||
| songMargin = 5 | ||||
| songInfoFontSize = -3.5 | ||||
| songTitleFont = "Oregano" | ||||
| songChordFont = "TeX Gyre Heros" | ||||
| songLyricFont = "Liberation Sans" | ||||
| songChordFontSeries = #'bold | ||||
| songTextChordAlignment = #'center | ||||
| songScoreChordFontSize = 0 | ||||
| songTextChordFontSize = \songScoreChordFontSize | ||||
| songTextLineHeigth = 5 | ||||
| songInfoPoetAndComposerStacked = ##f | ||||
| songTocColumns = 3 | ||||
| globalSize = 15 | ||||
| lyricSize = 1.6 | ||||
| @@ -1,15 +0,0 @@ | ||||
| songFormatAndSize = "a5" | ||||
| songMargin = 5 | ||||
| songInfoFontSize = 0 | ||||
| songTitleFont = "Fontin Bold" | ||||
| songChordFont = "Fontin" | ||||
| songLyricFont = "FontinSans" | ||||
| songChordFontSeries = #'bold | ||||
| songTextChordAlignment = #'left | ||||
| songScoreChordFontSize = 2 | ||||
| songTextChordFontSize = 2 | ||||
| songTextLineHeigth = 5.3 | ||||
| songInfoPoetAndComposerStacked = ##t | ||||
| songTocColumns = 2 | ||||
| globalSize = 14 | ||||
| lyricSize = 1.6 | ||||
| @@ -4,7 +4,7 @@ | ||||
| \markup { | ||||
|   \override #'(baseline-skip . 3.5) | ||||
|   \center-column { | ||||
|     \override #`(font-name . ,songTitleFont) { \fontsize #6 \fromproperty #'header:title } | ||||
|     \override #`(font-name . ,songTitleFont) { \fontsize #songTitleSize \fromproperty #'header:title } | ||||
|     \large \bold \fromproperty #'header:subtitle | ||||
|     \smaller \bold \fromproperty #'header:subsubtitle | ||||
|   } | ||||
| @@ -35,10 +35,7 @@ | ||||
|            (string-tokenize (chain-assoc-get 'header:categories props "")))) | ||||
|        (make-null-markup)))) | ||||
|  | ||||
| #(define pdf-encode | ||||
|    (if (< (list-ref (ly:version) 1) 24) | ||||
|        ly:encode-string-for-pdf | ||||
|    (@@ (lily framework-ps) pdf-encode))) | ||||
| #(define pdf-encode (@@ (lily framework-ps) pdf-encode)) | ||||
| % PDF tags | ||||
| #(define-markup-command (title-to-pdf-toc layout props title) (string?) | ||||
|      (ly:make-stencil | ||||
|   | ||||
| @@ -167,26 +167,11 @@ | ||||
|                (reverse (map (lambda (m) | ||||
|                                (make-size-box-to-box-markup #f #t m target-size-markup)) | ||||
|                           (cons | ||||
|                            (make-fill-with-pattern-markup 1 RIGHT "." (car revlist) page) | ||||
|                            (make-with-link-symbol-ref-markup 'index:label (make-fill-with-pattern-markup 1 RIGHT "." (car revlist) page)) | ||||
|                            (cdr revlist))))))))) | ||||
|  | ||||
| \paper { | ||||
|   indexTitleMarkup = \markup \column { | ||||
|     \fontsize #5 \sans \bold \fill-line { \null \fromproperty #'index:text \null } | ||||
|     \vspace #.5 | ||||
|     \justify { | ||||
|       Da die allermeisten Lieder unter verschiedenen Namen bekannt sind, | ||||
|       wollen wir euch ein Inhaltsverzeichnis an die Hand geben, mit dem ihr hoffentlich auf verschiedene Arten fündig werdet. | ||||
|       Die Liedtitel, die auch die Überschriften sind, findet ihr normal gedruckt. | ||||
|       Alle weiteren Alternativtitel oder Liedanfänge sind zur Unterscheidung kursiv gedruckt. | ||||
|     } | ||||
|     \vspace #1 | ||||
|   } | ||||
|   categoryTitleMarkup = \markup \column { | ||||
|     \fontsize #5 \sans \bold \fill-line { \null \fromproperty #'index:text \null } | ||||
|     \vspace #1 | ||||
|   } | ||||
|   indexItemMarkup = \markup \with-link-symbol-ref #'index:label { | ||||
|   indexItemMarkup = \markup { | ||||
|     \index-item-with-pattern | ||||
|   } | ||||
|   indexSectionMarkup = \markup \override #'(baseline-skip . 1.5) \left-column { | ||||
| @@ -199,29 +184,7 @@ | ||||
|   } | ||||
|  | ||||
| } | ||||
| %{ | ||||
| #(define-markup-list-command (index layout props) () | ||||
|   ( _i "Outputs an alphabetical sorted index, using the paper | ||||
|   variable @code{indexTitleMarkup} for its title, then the list of | ||||
|   lines built using the @code{indexItem} music function | ||||
|   Usage: @code{\\markuplines \\index}" ) | ||||
|   (cons (interpret-markup layout (cons (list (cons 'index:text "Inhaltsverzeichnis")) props) | ||||
|         (ly:output-def-lookup layout 'indexTitleMarkup)) | ||||
|     (space-lines (chain-assoc-get 'baseline-skip props) | ||||
|         (map (lambda (index-item) | ||||
|          (let ((label (car index-item)) | ||||
|          (index-markup (cadr index-item)) | ||||
|          (text (caddr index-item))) | ||||
|            (interpret-markup | ||||
|              layout | ||||
|              (cons (list (cons 'index:page | ||||
|               (markup #:page-ref label "XXX" "?")) | ||||
|              (cons 'index:text text) | ||||
|              (cons 'index:label label)) | ||||
|              props) | ||||
|              (ly:output-def-lookup layout index-markup)))) | ||||
|        (index-items))))) | ||||
| %} | ||||
|  | ||||
| #(define (prepare-item-markup items layout) | ||||
|    (map (lambda (index-item) | ||||
|          (let ((label (car index-item)) | ||||
| @@ -233,33 +196,18 @@ | ||||
|              (ly:output-def-lookup layout index-markup)))) | ||||
|        (items))) | ||||
|  | ||||
|  | ||||
| #(define-markup-list-command (colindex layout props) () | ||||
|   ( _i "Outputs an alphabetical sorted index, using the paper | ||||
|   variable @code{indexTitleMarkup} for its title, then the list of | ||||
|   lines built using the @code{indexItem} music function | ||||
|   Usage: @code{\\markuplines \\index}" ) | ||||
|       (let ((title (interpret-markup layout (cons (list (cons 'index:text "Inhaltsverzeichnis")) props) | ||||
|         (ly:output-def-lookup layout 'indexTitleMarkup)))) | ||||
|         (cons title | ||||
|   (interpret-markup-list layout props | ||||
|     (make-columnlayout-markup-list songTocColumns 2 | ||||
|       (let ((h (- (ly:output-def-lookup layout 'paper-height) 12))) | ||||
|         (cons (- h (interval-length (ly:stencil-extent title Y))) h)) | ||||
|       (prepare-item-markup index-items layout)))))) | ||||
|  | ||||
| #(define-markup-list-command (categoryindex layout props) () | ||||
|   ( _i "Outputs categorized song titles" ) | ||||
|     (if (null-list? (category-index-items)) | ||||
|         (list) | ||||
|       (let ((title (interpret-markup layout (cons (list (cons 'index:text "Inhaltsverzeichnis nach Kategorien")) props) | ||||
|         (ly:output-def-lookup layout 'categoryTitleMarkup)))) | ||||
|         (cons title | ||||
|   (interpret-markup-list layout props | ||||
|     (make-columnlayout-markup-list songTocColumns 2 | ||||
|       (let ((h (- (ly:output-def-lookup layout 'paper-height) 12))) | ||||
|         (cons (- h (interval-length (ly:stencil-extent title Y))) h)) | ||||
|       (prepare-item-markup category-index-items layout))))))) | ||||
| #(define-markup-list-command (index-in-columns-with-title layout props index-type title-markup) (symbol? markup?) | ||||
|   ( _i "Outputs index alphabetical sorted or in categories" ) | ||||
|     (let ((items (case index-type | ||||
|             ((alphabetical) index-items) | ||||
|             ((categories) category-index-items))) | ||||
|           (title (interpret-markup layout props title-markup))) | ||||
|       (cons title | ||||
|       (interpret-markup-list layout props | ||||
|         (make-columnlayout-markup-list songTocColumns 2 | ||||
|           (let ((h (- (ly:output-def-lookup layout 'paper-height) 12))) | ||||
|             (cons (- h (interval-length (ly:stencil-extent title Y))) h)) | ||||
|           (prepare-item-markup items layout)))))) | ||||
|  | ||||
| indexItem = | ||||
| #(define-music-function (parser location sorttext text) (string? markup?) | ||||
| @@ -271,18 +219,6 @@ indexSection = | ||||
|    "Add a section line to the alphabetical index, using @code{indexSectionMarkup} paper variable markup. This can be used to divide the alphabetical index into different sections, for example one section for each first letter." | ||||
|    (add-index-item! 'indexSectionMarkup text sorttext)) | ||||
|  | ||||
| %{ | ||||
| addTitleToTOC = #(define-music-function (parser location title) (string?) | ||||
|   #{ | ||||
|     \indexItem #title \markup { #title } | ||||
|   #}) | ||||
|  | ||||
| addAltTitleToTOC = #(define-music-function (parser location title) (string?) | ||||
|   #{ | ||||
|     \indexItem #title \markup { \italic #title } | ||||
|   #}) | ||||
| %} | ||||
|  | ||||
| #(define (extract-var-from-module module sym) | ||||
|   (let ((variableref (assoc-ref module sym))) | ||||
|     (if variableref (variable-ref variableref) #f)) | ||||
|   | ||||
| @@ -1,13 +1,22 @@ | ||||
| TRANSPOSITION = ##f | ||||
| TRANSPOSITION = #(cons #f #f) | ||||
|  | ||||
| transposeGlobal = | ||||
| #(define-void-function (from to) (ly:pitch? ly:pitch?) | ||||
|    (set! TRANSPOSITION (cons from to))) | ||||
|  | ||||
| transposable = | ||||
| #(define-music-function (music) (ly:music?) | ||||
|   (if TRANSPOSITION | ||||
| #(define-music-function (fromto music) (pair? ly:music?) | ||||
|   (if (car fromto) | ||||
|     #{ | ||||
|       \transpose #(car TRANSPOSITION) #(cdr TRANSPOSITION) #music | ||||
|       \transpose #(car fromto) #(cdr fromto) #music | ||||
|     #} | ||||
|     music)) | ||||
|  | ||||
| % Akkorde in Strophen transponieren | ||||
| #(define-markup-list-command (transpose layout props from to markuplist) | ||||
|   (markup? markup? markup-list?) | ||||
|  | ||||
|   (define (markup->pitch m) | ||||
|     (ly:assoc-get (string->symbol (markup->string m)) pitchnames)) | ||||
|  | ||||
|   (interpret-markup-list layout (prepend-alist-chain 'transposition (cons (markup->pitch from) (markup->pitch to)) props) markuplist)) | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|      #{ \markup { \column { | ||||
|      $(let ((verse-markup-string ( | ||||
|         string-append "\\line { " | ||||
|           (ly:regex-replace (ly:make-regex "\n") text " } \\line { ") | ||||
|           (ly:regex-replace (ly:make-regex "\r?\n") text " } \\line { ") | ||||
|           " \\size-box-to-box ##f ##t \"\" \"Agj\" }" ))) | ||||
|        (ly:parser-include-string verse-markup-string)) | ||||
|      }}#} | ||||
| @@ -52,11 +52,6 @@ | ||||
|      ((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 | ||||
| @@ -66,17 +61,18 @@ | ||||
| % Text über Text mittig darstellen | ||||
| #(define-markup-command (textup layout props text uptext) (markup? markup?) | ||||
|    "Markup über Text mittig darstellen." | ||||
|    (let ((verselayout (chain-assoc-get 'verselayout props generalLayout))) | ||||
|    (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 } } | ||||
|            \size-box-to-box ##f ##t #uptext \score { \chords { g4:m a } \layout { \verselayout } } | ||||
|          } | ||||
|          #text | ||||
|        } | ||||
|      #} | ||||
|    )) | ||||
|    ))) | ||||
|  | ||||
| #(define-markup-command (anchor-x-between layout props arga argb) | ||||
|    (markup? markup?) | ||||
| @@ -87,52 +83,92 @@ | ||||
|      )) | ||||
|  | ||||
| #(define-markup-command (stanza-raw layout props arg) | ||||
|    (markup?) | ||||
|    (string-or-music?) | ||||
|    (let ((verselayout (chain-assoc-get 'verselayout props generalLayout))) | ||||
|    (interpret-markup layout props | ||||
|      (if (and (string? arg) (string-null? arg)) | ||||
|          " " | ||||
|          #{\markup | ||||
|            \score { \new Lyrics { \lyricmode { \set stanza = #arg "" } } \layout { \generalLayout } } | ||||
|            \score { \new Lyrics { \lyricmode { #(if (ly:music? arg) arg #{ \set stanza = #arg #}) "" } } \layout { \verselayout } } | ||||
|          #} | ||||
|      ))) | ||||
|      )))) | ||||
|  | ||||
| #(define-markup-command (stanza layout props arg) | ||||
|    (markup?) | ||||
|    (string-or-music?) | ||||
|    (interpret-markup layout props | ||||
|      (make-size-box-to-box-markup #f #t (make-stanza-raw-markup arg) (make-stanza-raw-markup "x")))) | ||||
|  | ||||
| #(define (handle-custom-newlines custom-verse-breaks text) | ||||
|   (if (null? custom-verse-breaks) | ||||
|     text | ||||
|     (let make-custom-linebreaks | ||||
|       ((break-words custom-verse-breaks) | ||||
|        (newtext (ly:regex-replace (ly:make-regex "\r?\n") text " "))) | ||||
|       (if (null? break-words) | ||||
|           newtext | ||||
|           (make-custom-linebreaks | ||||
|             (cdr break-words) | ||||
|             (ly:regex-replace | ||||
|               (ly:make-regex | ||||
|                 (string-append | ||||
|                   "(" | ||||
|                   (string-concatenate | ||||
|                     (map | ||||
|                       (lambda (character) | ||||
|                         (let ((escaped_char (ly:regex-quote (string character)))) | ||||
|                              (string-append "(?: *,[^,)]+\\)" escaped_char "|\\(?" escaped_char ")"))) | ||||
|                       (string->list (car break-words)))) | ||||
|                   "(?: *,[^,)]+\\))?)(.*)$")) | ||||
|               newtext | ||||
|               1 "\n" 2)))))) | ||||
|  | ||||
| #(use-modules (lily display-lily)) | ||||
|  | ||||
| % Kompletten Vers mit Akkorden | ||||
| #(define-markup-command (chordverse layout props stanza verse) (markup? string?) | ||||
|    #:properties ((intraverse-vspace 0)) | ||||
| #(define-markup-command (chordverse layout props stanza verse) (string-or-music? string?) | ||||
|    #:properties ( | ||||
|     (intraverse-vspace 0) | ||||
|     (custom-verse-breaks '()) | ||||
|     (transposition (cons #f #f)) | ||||
|     (verselayout generalLayout) | ||||
|     ) | ||||
|    "Vers mit Akkorden" | ||||
|    (let* ((fromto (chain-assoc-get 'transposition props #f)) | ||||
|           (transp (if fromto | ||||
|                     (string-append "\\transpose " (car fromto) " " (cdr fromto)) | ||||
|    (let ((transp (if (car transposition) | ||||
|                     (string-append "\\transpose " (symbol->string (note-name->lily-string (car transposition))) " " (symbol->string (note-name->lily-string (cdr transposition)))) | ||||
|                     ""))) | ||||
|    (interpret-markup layout props | ||||
|      (markup #:override `(baseline-skip . ,(+ intraverse-vspace songTextLineHeigth)) #:anchor-x-between #:stanza stanza | ||||
|        (make-wrap-newline-markup | ||||
|                (ly:regex-replace (ly:make-regex "\\(( *)([^,()]*)( *),([^)]*)\\)") | ||||
|                  (ly:regex-replace (ly:make-regex "(([^ \n]*\\([^()]*,[^()]+\\)[^ \n(]*)+)") verse " \\concat { " 1 " } ") | ||||
|                 "\\textup \\line { \"" 1 "\" " 2 " \"" 3 "\" } \\score { \\transposable " transp " \\chords { s4 " 4 " } \\layout { \\verseChordLayout } }") | ||||
|                  (ly:regex-replace (ly:make-regex "(([^ \n]*\\([^()]*,[^()]+\\)[^ \n(]*)+)") (handle-custom-newlines custom-verse-breaks verse) " \\concat { " 1 " } ") | ||||
|                 "\\textup \\line { \"" 1 "\" " 2 " \"" 3 "\" } \\score { " transp " \\chords { s4 " 4 " } \\layout { \\verselayout } }") | ||||
|                 ) | ||||
|      )))) | ||||
|  | ||||
| % Kompletter Vers aus dem Akkorde entfernt werden | ||||
| #(define-markup-command (nochordverse layout props stanza verse) (markup? string?) | ||||
|    #:properties ((intraverse-vspace 0)) | ||||
| #(define-markup-command (nochordverse layout props stanza verse) (string-or-music? string?) | ||||
|    #:properties ((intraverse-vspace 0)(custom-verse-breaks '())) | ||||
|    "Vers ohne Akkorde" | ||||
|    (interpret-markup layout props | ||||
|      (markup #:override `(baseline-skip . ,(+ intraverse-vspace 3.0)) #:anchor-x-between #:stanza stanza | ||||
|            #:wrap-newline (ly:regex-replace (ly:make-regex "\\(([^,]*),([^)]*)\\)") verse 1) | ||||
|            #:wrap-newline (ly:regex-replace (ly:make-regex "\\(([^,]*),([^)]*)\\)") (handle-custom-newlines custom-verse-breaks verse) 1) | ||||
|      ) | ||||
|    ) | ||||
| ) | ||||
|  | ||||
| #(define-markup-command (verseformat layout props verse) (markup?) | ||||
|    #:properties ((verselayout generalLayout)) | ||||
|    "Textformatierung für Strophen" | ||||
|    (interpret-markup layout props | ||||
|        (make-sans-markup (make-fontsize-markup (ly:output-def-lookup layout 'lyric-size) verse)) | ||||
|      (let* ( | ||||
|          (layout-scale (ly:output-def-lookup layout 'output-scale 1.0)) | ||||
|          (verselayout-scale (ly:output-def-lookup verselayout 'output-scale layout-scale)) | ||||
|          (mag-scale (/ verselayout-scale layout-scale)) | ||||
|          (lyric-context-props (ly:context-def-lookup (ly:assoc-get 'Lyrics (ly:output-find-context-def verselayout 'Lyrics)) 'property-ops)) | ||||
|          (lyric-size (caddr (find (lambda (prop) (and (equal? 'push (car prop)) (equal? 'LyricText (cadr prop)) (equal? 'font-size (cadddr prop)))) lyric-context-props))) | ||||
|        ) | ||||
|        (make-magnify-markup mag-scale (make-sans-markup (make-fontsize-markup lyric-size verse))) | ||||
|      ) | ||||
|    ) | ||||
| ) | ||||
|  | ||||
| @@ -142,26 +178,158 @@ | ||||
|                  (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)))))) | ||||
|    (define (add-markup-between-elements reverses markup-between elements) | ||||
|      ((if reverses fold fold-right) (lambda (element filled-list) | ||||
|               (cons element (if (null? filled-list) '() (cons markup-between filled-list)))) | ||||
|         '() elements)) | ||||
|    (let* ((column-item-count (ceiling (/ (length versegroup) verse-cols))) | ||||
|           (column-data (make-list verse-cols))) | ||||
|     (let columnize-list ((index 0) (items versegroup)) | ||||
|       (if (not (null? items)) | ||||
|         (let* ((column-index (if verse-ordering-horizontal | ||||
|                                  (modulo index verse-cols) | ||||
|                                  (floor (/ index column-item-count)))) | ||||
|                (column-markups (list-ref column-data column-index))) | ||||
|           (list-set! column-data column-index (cons (car items) column-markups)) | ||||
|           (columnize-list (+ index 1) (cdr items))))) | ||||
|     (interpret-markup layout props | ||||
|       (make-fill-line-markup (list (make-verseformat-markup (make-line-markup | ||||
|         (add-markup-between-elements #f | ||||
|           (make-hspace-markup verse-hspace) | ||||
|           (map (lambda (column-markups) | ||||
|               (make-column-markup | ||||
|                 (add-markup-between-elements #t (make-vspace-markup verse-vspace) column-markups))) | ||||
|             column-data))))))))) | ||||
|  | ||||
| #(define-markup-command (pad-left layout props amount arg) | ||||
|   (number? markup?) | ||||
|   (let* ((m (interpret-markup layout props arg)) | ||||
|          (x (ly:stencil-extent m X)) | ||||
|          (y (ly:stencil-extent m Y))) | ||||
|     (ly:stencil-translate | ||||
|       (ly:make-stencil (ly:stencil-expr m) | ||||
|                        (cons (- (car x) amount) (cdr x)) | ||||
|                        y) | ||||
|       `(,amount . 0)))) | ||||
|  | ||||
| #(define-markup-command (pad-right layout props amount arg) | ||||
|   (number? markup?) | ||||
|   (let* ((m (interpret-markup layout props arg)) | ||||
|          (x (ly:stencil-extent m X)) | ||||
|          (y (ly:stencil-extent m Y))) | ||||
|       (ly:make-stencil (ly:stencil-expr m) | ||||
|                        (cons (car x) (+ (cdr x) amount)) | ||||
|                        y))) | ||||
|  | ||||
| #(define-markup-command (score-equal-height layout props reference-height lines) | ||||
|   (number? markup-list?) | ||||
|   #:category music | ||||
|   #:properties ((baseline-skip)) | ||||
|     (stack-stencils Y DOWN baseline-skip | ||||
|       (map | ||||
|         (lambda (line) (ly:make-stencil (ly:stencil-expr line) (ly:stencil-extent line X) `(,(/ reference-height -2.0) . ,(/ reference-height 2.0)))) | ||||
|         (interpret-markup-list layout props lines)))) | ||||
|  | ||||
| #(define-public (custom-lyric-text::print grob) | ||||
|   "Allow interpretation of tildes as lyric tieing marks." | ||||
|   ;; See also similar code in Lyric_performer. | ||||
|   (let ((text (ly:grob-property grob 'text))) | ||||
|  | ||||
|     (grob-interpret-markup grob (if (string? text) | ||||
|                                     (make-pad-right-markup -0.1 (make-tied-lyric-markup text)) | ||||
|                                     text)))) | ||||
|  | ||||
| #(define-markup-command (chordlyrics layout props lyrics) (ly:music?) | ||||
|    #:properties ((verse-chords #{#}) | ||||
|                  (verse-reference-voice #{#}) | ||||
|                  (verse-break-voice #{#}) | ||||
|                  (verse-line-height songTextLineHeigth) | ||||
|                  (verse-text-chord-distance songTextChordDistance) | ||||
|                  (intraverse-vspace 0) | ||||
|                  (transposition (cons #f #f)) | ||||
|                  (verselayout generalLayout)) | ||||
|   "Vers mit Akkorden" | ||||
|   (interpret-markup layout props | ||||
|     #{ | ||||
|       \markup { | ||||
|         \override #`(baseline-skip . ,intraverse-vspace) | ||||
|         \score-equal-height #verse-line-height \score-lines { | ||||
|           \transposable #transposition | ||||
|           << | ||||
|             \new Devnull { #verse-break-voice } | ||||
|             \new NullVoice = "dummyvoice" { #verse-reference-voice } | ||||
|             #(music-clone verse-chords) | ||||
|             \new Lyrics \lyricsto "dummyvoice" { #lyrics } | ||||
|           >> | ||||
|           \layout { | ||||
|             \verselayout | ||||
|             ragged-right = ##t | ||||
|             \context { | ||||
|               \Lyrics | ||||
|               \override VerticalAxisGroup.nonstaff-relatedstaff-spacing.basic-distance = #verse-text-chord-distance | ||||
|               \override LyricText.parent-alignment-X = #LEFT | ||||
|               \override LyricText.self-alignment-X = #LEFT | ||||
|               \override LyricText.word-space = 0.8 | ||||
|               \override LyricSpace.minimum-distance = 0.8 | ||||
|               \override LyricText.stencil = #custom-lyric-text::print | ||||
|             } | ||||
|             \context { | ||||
|               \ChordNames | ||||
|               \override VerticalAxisGroup.staff-affinity = ##f | ||||
|               \override ChordName.extra-spacing-width = #'(-0.1 . 0.1) | ||||
|               \consists \Ensure_first_chord_after_line_break_printed_engraver | ||||
|             } | ||||
|             \context { | ||||
|               \Score | ||||
|               \override PaperColumn.keep-inside-line = ##f | ||||
|              % \override SpacingSpanner.strict-note-spacing = ##t | ||||
|               \override SpacingSpanner.uniform-stretching = ##t | ||||
|               \override SpacingSpanner.spacing-increment = 0 | ||||
|               \remove Bar_number_engraver | ||||
|               \remove Mark_engraver | ||||
|               \remove Volta_engraver | ||||
|               \remove Parenthesis_engraver | ||||
|             } | ||||
|             \context { | ||||
|               \Staff | ||||
|               \remove Staff_symbol_engraver | ||||
|               \remove Clef_engraver | ||||
|               \remove Time_signature_engraver | ||||
|               \remove Bar_engraver | ||||
|               \remove Separating_line_group_engraver | ||||
|               \omit KeySignature | ||||
|               \omit KeyCancellation | ||||
|             } | ||||
|             \context { | ||||
|               \Voice | ||||
|               \remove Stem_engraver | ||||
|               \remove Rest_engraver | ||||
|               \remove Multi_measure_rest_engraver | ||||
|               \remove Phrasing_slur_engraver | ||||
|               \remove Slur_engraver | ||||
|               \remove Tie_engraver | ||||
|               \remove Dynamic_engraver | ||||
|               \remove Note_heads_engraver | ||||
|             } | ||||
|             \context { | ||||
|               \NullVoice | ||||
|               \consists Rest_engraver | ||||
|               \omit Rest | ||||
|              % \undo \omit NoteHead | ||||
|              % \hide NoteHead | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     #} | ||||
|   ) | ||||
| ) | ||||
|  | ||||
| #(define-markup-command (nochordlyrics layout props lyrics) (ly:music?) | ||||
|     "Vers ohne Akkorde" | ||||
|   (interpret-markup layout props | ||||
|     (markup | ||||
|       #:override `(verse-chords . ,#{#}) | ||||
|       #:override `(verse-line-height . ,(- songTextLineHeigth 2)) | ||||
|       #:chordlyrics lyrics)) | ||||
| ) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user