Compare commits
	
		
			26 Commits
		
	
	
		
			f5d5e1b020
			...
			set-spacin
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 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 | 
@@ -5,7 +5,6 @@
 | 
				
			|||||||
\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"
 | 
				
			||||||
\include "auto_rest_merging.ly"
 | 
					 | 
				
			||||||
\include "chord_settings.ly"
 | 
					\include "chord_settings.ly"
 | 
				
			||||||
\include "transposition.ly"
 | 
					\include "transposition.ly"
 | 
				
			||||||
\include "verses_with_chords.ly"
 | 
					\include "verses_with_chords.ly"
 | 
				
			||||||
@@ -18,3 +17,7 @@ LAYOUT = \layout { \generalLayout }
 | 
				
			|||||||
HEADER = {}
 | 
					HEADER = {}
 | 
				
			||||||
MUSIC = {}
 | 
					MUSIC = {}
 | 
				
			||||||
TEXT = \markuplist {""}
 | 
					TEXT = \markuplist {""}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					verseChords = {}
 | 
				
			||||||
 | 
					firstVoice = {}
 | 
				
			||||||
 | 
					global = {}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -14,7 +14,6 @@
 | 
				
			|||||||
  property-defaults.fonts.sans = \songLyricFont
 | 
					  property-defaults.fonts.sans = \songLyricFont
 | 
				
			||||||
  %annotate-spacing = ##t
 | 
					  %annotate-spacing = ##t
 | 
				
			||||||
  % spacing stuff
 | 
					  % spacing stuff
 | 
				
			||||||
  lyric-size = #lyricSize
 | 
					 | 
				
			||||||
  two-sided = ##t
 | 
					  two-sided = ##t
 | 
				
			||||||
  inner-margin = 1.5\cm
 | 
					  inner-margin = 1.5\cm
 | 
				
			||||||
  outer-margin = \songMargin
 | 
					  outer-margin = \songMargin
 | 
				
			||||||
@@ -40,6 +39,7 @@ generalLayout = \layout {
 | 
				
			|||||||
  \context {
 | 
					  \context {
 | 
				
			||||||
    \Staff
 | 
					    \Staff
 | 
				
			||||||
    \accidentalStyle modern
 | 
					    \accidentalStyle modern
 | 
				
			||||||
 | 
					    \consists Merge_rests_engraver
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  \context {
 | 
					  \context {
 | 
				
			||||||
    \Score
 | 
					    \Score
 | 
				
			||||||
@@ -61,6 +61,11 @@ generalLayout = \layout {
 | 
				
			|||||||
    \Voice
 | 
					    \Voice
 | 
				
			||||||
    % ich will lines breaken wie ich will!
 | 
					    % ich will lines breaken wie ich will!
 | 
				
			||||||
    \remove "Forbid_line_break_engraver"
 | 
					    \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,29 +77,74 @@ textp = \lyricmode { \markup { \raise #1 \musicglyph #"rests.3" } }
 | 
				
			|||||||
% zweite Stimme alles grau
 | 
					% zweite Stimme alles grau
 | 
				
			||||||
secondVoiceStyle = {
 | 
					secondVoiceStyle = {
 | 
				
			||||||
  \override NoteHead.color = #grey
 | 
					  \override NoteHead.color = #grey
 | 
				
			||||||
 | 
					  \override Dots.color = #grey
 | 
				
			||||||
  \override Stem.color = #grey
 | 
					  \override Stem.color = #grey
 | 
				
			||||||
  \override Flag.color = #grey
 | 
					  \override Flag.color = #grey
 | 
				
			||||||
  \override Beam.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 = {
 | 
					firstVoiceStyle = {
 | 
				
			||||||
  \override NoteHead.color = #black
 | 
					  \override NoteHead.color = #black
 | 
				
			||||||
 | 
					  \override Dots.color = #black
 | 
				
			||||||
  \override Stem.color = #black
 | 
					  \override Stem.color = #black
 | 
				
			||||||
  \override Flag.color = #black
 | 
					  \override Flag.color = #black
 | 
				
			||||||
  \override Beam.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 =
 | 
					schwarzkopf =
 | 
				
			||||||
  #(define-music-function (parser location noten) (ly:music?)
 | 
					  #(define-music-function (parser location noten) (ly:music?)
 | 
				
			||||||
  #{
 | 
					    (begin (ly:warning "\\schwarzkopf brauchts nicht mehr, das kann ersatzlos weg!") noten))
 | 
				
			||||||
   \revert NoteHead.color
 | 
					
 | 
				
			||||||
   $noten
 | 
					romanStanza =
 | 
				
			||||||
   \override NoteHead.color = #grey
 | 
					  #(define-music-function (parser location) ()
 | 
				
			||||||
  #})
 | 
					  #{ \override StanzaNumber.style = #'roman #})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
stanza =
 | 
					stanza =
 | 
				
			||||||
  #(define-music-function (parser location stanzanumber) (number?)
 | 
					#(define-music-function (parser location stanzanumber) (number?)
 | 
				
			||||||
  #{ \set stanza = #(ly:format stanzaFormat stanzanumber) #})
 | 
					#{
 | 
				
			||||||
 | 
					  \once \override StanzaNumber.layer = 23 % set this to signal that there is a real stanza and no repeat signs
 | 
				
			||||||
 | 
					  \applyContext
 | 
				
			||||||
 | 
					  #(lambda (context)
 | 
				
			||||||
 | 
					    (let* ((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 = { \set stanza = \refString }
 | 
					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 }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -32,6 +32,38 @@ shiftChord = #(define-music-function (parser location xshift chord) (number? ly:
 | 
				
			|||||||
	$chord
 | 
						$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
 | 
					% kleine Mollakkorde und Alteration ausgeschrieben
 | 
				
			||||||
#(define (note-name->german-markup-nosym pitch lowercase?)
 | 
					#(define (note-name->german-markup-nosym pitch lowercase?)
 | 
				
			||||||
   (define (pitch-alteration-semitones pitch) (inexact->exact (round (* (ly:pitch-alteration pitch) 2))))
 | 
					   (define (pitch-alteration-semitones pitch) (inexact->exact (round (* (ly:pitch-alteration pitch) 2))))
 | 
				
			||||||
@@ -89,8 +121,6 @@ generalLayout = \layout {
 | 
				
			|||||||
    chordNoteNamer = #bassnote-name->german-markup-nosym
 | 
					    chordNoteNamer = #bassnote-name->german-markup-nosym
 | 
				
			||||||
    majorSevenSymbol = "maj7"
 | 
					    majorSevenSymbol = "maj7"
 | 
				
			||||||
    chordNameExceptions = \chordNameExceptions
 | 
					    chordNameExceptions = \chordNameExceptions
 | 
				
			||||||
    % der baseline-skip der Akkorde beeinflusst, wie hoch die Hochstellung ist
 | 
					 | 
				
			||||||
    \override ChordName.baseline-skip = #1.0
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,13 @@
 | 
				
			|||||||
\paper {
 | 
					\paper {
 | 
				
			||||||
  poetPrefix = "Worte:"
 | 
					  poetPrefix = "Worte:"
 | 
				
			||||||
  composerPrefix = "Weise:"
 | 
					  composerPrefix = "Weise:"
 | 
				
			||||||
 | 
					  compositionPrefix = "Satz:"
 | 
				
			||||||
  poetAndComposerEqualPrefix = "Worte und Weise:"
 | 
					  poetAndComposerEqualPrefix = "Worte und Weise:"
 | 
				
			||||||
 | 
					  voicePrefix = "Stimme:"
 | 
				
			||||||
 | 
					  versePrefix = "Strophe:"
 | 
				
			||||||
 | 
					  translationPrefix = "Übersetzung:"
 | 
				
			||||||
 | 
					  interludePrefix = "Zwischenspiel:"
 | 
				
			||||||
 | 
					  bridgePrefix = "Bridge:"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  authorFormat =
 | 
					  authorFormat =
 | 
				
			||||||
    #(lambda (noDetails name trail_name birth_year death_year organization)
 | 
					    #(lambda (noDetails name trail_name birth_year death_year organization)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,8 @@
 | 
				
			|||||||
songFormatAndSize = "a5"
 | 
					songFormatAndSize = "a5"
 | 
				
			||||||
songMargin = 5
 | 
					songMargin = 5
 | 
				
			||||||
songInfoFontSize = 0
 | 
					songInfoFontSize = 0
 | 
				
			||||||
 | 
					songInfoLineWidthFraction = 0.9
 | 
				
			||||||
 | 
					songTitleSize = 6
 | 
				
			||||||
songTitleFont = "LilyPond Sans"
 | 
					songTitleFont = "LilyPond Sans"
 | 
				
			||||||
songChordFont = "LilyPond Sans"
 | 
					songChordFont = "LilyPond Sans"
 | 
				
			||||||
songLyricFont = "LilyPond Sans"
 | 
					songLyricFont = "LilyPond Sans"
 | 
				
			||||||
@@ -8,11 +10,13 @@ songChordFontSeries = #'bold
 | 
				
			|||||||
songTextChordAlignment = #'left
 | 
					songTextChordAlignment = #'left
 | 
				
			||||||
songScoreChordFontSize = 2
 | 
					songScoreChordFontSize = 2
 | 
				
			||||||
songTextChordFontSize = \songScoreChordFontSize
 | 
					songTextChordFontSize = \songScoreChordFontSize
 | 
				
			||||||
songTextLineHeigth = 5.3
 | 
					songTextChordDistance = 2.8
 | 
				
			||||||
 | 
					songTextLineHeigth = 5.8
 | 
				
			||||||
songTocColumns = 3
 | 
					songTocColumns = 3
 | 
				
			||||||
globalSize = 15
 | 
					globalSize = 15
 | 
				
			||||||
lyricSize = 1.6
 | 
					lyricSize = 1.6
 | 
				
			||||||
stanzaFormat = "~a."
 | 
					stanzaFormat = "~a."
 | 
				
			||||||
 | 
					romanStanzaFormat = "~@r."
 | 
				
			||||||
refString = "Ref.:"
 | 
					refString = "Ref.:"
 | 
				
			||||||
% hübsche Wiederholungszeichen für den Liedtext
 | 
					% hübsche Wiederholungszeichen für den Liedtext
 | 
				
			||||||
repStart = "𝄆"
 | 
					repStart = "𝄆"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					#(use-modules (ice-9 receive))
 | 
				
			||||||
#(define-markup-command (print-songinfo layout props) ()
 | 
					#(define-markup-command (print-songinfo layout props) ()
 | 
				
			||||||
  (define (songinfo-from songId key)
 | 
					  (define (songinfo-from songId key)
 | 
				
			||||||
    (let ((song (if (defined? 'SONG_DATA) (assoc-ref SONG_DATA songId) #f)))
 | 
					    (let ((song (if (defined? 'SONG_DATA) (assoc-ref SONG_DATA songId) #f)))
 | 
				
			||||||
@@ -16,7 +17,7 @@
 | 
				
			|||||||
          (assoc-ref author "death_year")
 | 
					          (assoc-ref author "death_year")
 | 
				
			||||||
          (assoc-ref author "organization")
 | 
					          (assoc-ref author "organization")
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        (ly:warning (ly:format "author with id ~a not found" authorId)))))
 | 
					        "unbekannt")))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (define (format-poet poetId)
 | 
					  (define (format-poet poetId)
 | 
				
			||||||
    (string-append (ly:output-def-lookup layout 'poetPrefix) " " (format-author poetId #f)))
 | 
					    (string-append (ly:output-def-lookup layout 'poetPrefix) " " (format-author poetId #f)))
 | 
				
			||||||
@@ -27,22 +28,123 @@
 | 
				
			|||||||
  (define (format-poet-and-composer authorId)
 | 
					  (define (format-poet-and-composer authorId)
 | 
				
			||||||
    (string-append (ly:output-def-lookup layout 'poetAndComposerEqualPrefix) " " (format-author authorId #f)))
 | 
					    (string-append (ly:output-def-lookup layout 'poetAndComposerEqualPrefix) " " (format-author authorId #f)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (define (find-authors-by authorType authors)
 | 
					  (define (find-author-ids-by contributionType authors)
 | 
				
			||||||
    (filter-map (lambda (authordata) (if (member authorType authordata) (car authordata) #f)) 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)
 | 
					  (define (poet-and-composer-from-authors authors)
 | 
				
			||||||
    (if authors
 | 
					    (if authors
 | 
				
			||||||
      (let* (
 | 
					      (let (
 | 
				
			||||||
            (poetIds (find-authors-by 'text authors))
 | 
					            (poetIds (find-author-ids-by 'text authors))
 | 
				
			||||||
            (composerIds (find-authors-by 'melody authors))
 | 
					            (translatorIds (find-author-ids-by 'translation authors))
 | 
				
			||||||
            (poets (map (lambda (poetId) (format-author poetId #f)) poetIds))
 | 
					            (versePoetData (find-author-id-with-part-numbers 'verse authors))
 | 
				
			||||||
            (composers (map (lambda (composerId) (format-author composerId (member composerId poetIds))) composerIds)))
 | 
					            (composerIds (find-author-ids-by 'melody authors))
 | 
				
			||||||
        (if (equal? poetIds composerIds)
 | 
					            (verseComposerData (find-author-id-with-part-numbers 'meloverse authors))
 | 
				
			||||||
          (list (string-append (ly:output-def-lookup layout 'poetAndComposerEqualPrefix) " " (string-join poets ", ")) #f)
 | 
					            (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
 | 
					          (list
 | 
				
			||||||
            (string-append (ly:output-def-lookup layout 'poetPrefix) " " (string-join poets ", "))
 | 
					            (join-present (list
 | 
				
			||||||
            (string-append (ly:output-def-lookup layout 'composerPrefix) " " (string-join composers ", ")))))
 | 
					              (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)
 | 
					      (list #f #f)
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
@@ -61,8 +163,8 @@
 | 
				
			|||||||
            (copyright (chain-assoc-get 'header:copyright props #f))
 | 
					            (copyright (chain-assoc-get 'header:copyright props #f))
 | 
				
			||||||
            (translation (chain-assoc-get 'header:translation props #f))
 | 
					            (translation (chain-assoc-get 'header:translation props #f))
 | 
				
			||||||
            (pronunciation (chain-assoc-get 'header:pronunciation props #f))
 | 
					            (pronunciation (chain-assoc-get 'header:pronunciation props #f))
 | 
				
			||||||
            (year_text (chain-assoc-get 'header:year_text props #f))
 | 
					            (year_text (if (string? (car poet-and-composers)) #f (chain-assoc-get 'header:year_text props #f)))
 | 
				
			||||||
            (year_melody (chain-assoc-get 'header:year_melody props #f)))
 | 
					            (year_melody (if (string? (car poet-and-composers)) #f (chain-assoc-get 'header:year_melody props #f))))
 | 
				
			||||||
            (markup
 | 
					            (markup
 | 
				
			||||||
              #:override (cons 'songinfo:poet-maybe-with-composer
 | 
					              #: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))
 | 
					                (if (and poet-maybe-with-composer (not (and (string? poet-maybe-with-composer) (string-null? poet-maybe-with-composer)))) poet-maybe-with-composer #f))
 | 
				
			||||||
@@ -101,7 +203,7 @@
 | 
				
			|||||||
#(define-markup-command (fractional-line-width layout props arg)(markup?)
 | 
					#(define-markup-command (fractional-line-width layout props arg)(markup?)
 | 
				
			||||||
  (interpret-markup layout props
 | 
					  (interpret-markup layout props
 | 
				
			||||||
    (make-override-markup
 | 
					    (make-override-markup
 | 
				
			||||||
      `(line-width . ,(* (chain-assoc-get 'header:songinfo-size-factor props 0.9) (ly:output-def-lookup layout 'line-width)))
 | 
					      `(line-width . ,(* (chain-assoc-get 'header:songinfo-size-factor props songInfoLineWidthFraction) (ly:output-def-lookup layout 'line-width)))
 | 
				
			||||||
      arg)))
 | 
					      arg)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\paper {
 | 
					\paper {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,5 +4,5 @@ inline-score =
 | 
				
			|||||||
#(define-music-function (music) (ly:music?)
 | 
					#(define-music-function (music) (ly:music?)
 | 
				
			||||||
   (set! INLINESCOREMUSIC #{ \INLINESCOREMUSIC #music #})
 | 
					   (set! INLINESCOREMUSIC #{ \INLINESCOREMUSIC #music #})
 | 
				
			||||||
    #{
 | 
					    #{
 | 
				
			||||||
      \transposable #music
 | 
					      \transposable #TRANSPOSITION #music
 | 
				
			||||||
    #})
 | 
					    #})
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
% set the speed of the midi music
 | 
					% set the speed of the midi music
 | 
				
			||||||
#(define midiQuarterNoteSpeed (if (defined? 'midiQuarterNoteSpeed) midiQuarterNoteSpeed 90))
 | 
					#(define midiQuarterNoteSpeed (if (defined? 'midiQuarterNoteSpeed) midiQuarterNoteSpeed 90))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MUSIC = { \transposable \MUSIC }
 | 
					MUSIC = { \transposable #TRANSPOSITION \MUSIC }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
verselayout = \layout {
 | 
					verselayout = \layout {
 | 
				
			||||||
  \LAYOUT
 | 
					  \LAYOUT
 | 
				
			||||||
@@ -10,7 +10,13 @@ verselayout = \layout {
 | 
				
			|||||||
    \override ChordName.font-size = \songTextChordFontSize
 | 
					    \override ChordName.font-size = \songTextChordFontSize
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
TEXT = \markuplist { \override #`(verselayout . verselayout) \TEXT }
 | 
					TEXT = \markuplist {
 | 
				
			||||||
 | 
					  \override #`(transposition . ,TRANSPOSITION)
 | 
				
			||||||
 | 
					  \override #`(verselayout . ,verselayout)
 | 
				
			||||||
 | 
					  \override #`(verse-chords . ,#{ \chords { \verseChords } #})
 | 
				
			||||||
 | 
					  \override #`(verse-reference-voice . ,#{ \global \firstVoice  #})
 | 
				
			||||||
 | 
					  \TEXT
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
% nur Output wenn noStandaloneOutput auf false steht
 | 
					% nur Output wenn noStandaloneOutput auf false steht
 | 
				
			||||||
output = #(if (not noStandaloneOutput)
 | 
					output = #(if (not noStandaloneOutput)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@
 | 
				
			|||||||
\markup {
 | 
					\markup {
 | 
				
			||||||
  \override #'(baseline-skip . 3.5)
 | 
					  \override #'(baseline-skip . 3.5)
 | 
				
			||||||
  \center-column {
 | 
					  \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
 | 
					    \large \bold \fromproperty #'header:subtitle
 | 
				
			||||||
    \smaller \bold \fromproperty #'header:subsubtitle
 | 
					    \smaller \bold \fromproperty #'header:subsubtitle
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -167,11 +167,11 @@
 | 
				
			|||||||
               (reverse (map (lambda (m)
 | 
					               (reverse (map (lambda (m)
 | 
				
			||||||
                               (make-size-box-to-box-markup #f #t m target-size-markup))
 | 
					                               (make-size-box-to-box-markup #f #t m target-size-markup))
 | 
				
			||||||
                          (cons
 | 
					                          (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)))))))))
 | 
					                           (cdr revlist)))))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\paper {
 | 
					\paper {
 | 
				
			||||||
  indexItemMarkup = \markup \with-link-symbol-ref #'index:label {
 | 
					  indexItemMarkup = \markup {
 | 
				
			||||||
    \index-item-with-pattern
 | 
					    \index-item-with-pattern
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  indexSectionMarkup = \markup \override #'(baseline-skip . 1.5) \left-column {
 | 
					  indexSectionMarkup = \markup \override #'(baseline-skip . 1.5) \left-column {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,13 +1,22 @@
 | 
				
			|||||||
TRANSPOSITION = ##f
 | 
					TRANSPOSITION = #(cons #f #f)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
transposeGlobal =
 | 
					transposeGlobal =
 | 
				
			||||||
#(define-void-function (from to) (ly:pitch? ly:pitch?)
 | 
					#(define-void-function (from to) (ly:pitch? ly:pitch?)
 | 
				
			||||||
   (set! TRANSPOSITION (cons from to)))
 | 
					   (set! TRANSPOSITION (cons from to)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
transposable =
 | 
					transposable =
 | 
				
			||||||
#(define-music-function (music) (ly:music?)
 | 
					#(define-music-function (fromto music) (pair? ly:music?)
 | 
				
			||||||
  (if TRANSPOSITION
 | 
					  (if (car fromto)
 | 
				
			||||||
    #{
 | 
					    #{
 | 
				
			||||||
      \transpose #(car TRANSPOSITION) #(cdr TRANSPOSITION) #music
 | 
					      \transpose #(car fromto) #(cdr fromto) #music
 | 
				
			||||||
    #}
 | 
					    #}
 | 
				
			||||||
    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))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,11 +52,6 @@
 | 
				
			|||||||
     ((center) (make-size-box-to-box-markup use-x use-y abox bbox))
 | 
					     ((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)))))
 | 
					     ((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?)
 | 
					#(define-markup-command (chord-alignment-style-dependent layout props chord-with-text) (markup?)
 | 
				
			||||||
   (interpret-markup layout props
 | 
					   (interpret-markup layout props
 | 
				
			||||||
   (case songTextChordAlignment
 | 
					   (case songTextChordAlignment
 | 
				
			||||||
@@ -114,25 +109,39 @@
 | 
				
			|||||||
          (make-custom-linebreaks
 | 
					          (make-custom-linebreaks
 | 
				
			||||||
            (cdr break-words)
 | 
					            (cdr break-words)
 | 
				
			||||||
            (ly:regex-replace
 | 
					            (ly:regex-replace
 | 
				
			||||||
              (ly:make-regex (string-append "(" (ly:regex-replace (ly:make-regex "(.)") (car break-words) "(?: *,[^,)]+\\)" 1 "|\\(?" 1 ")") "(?: *,[^,)]+\\))?)(.*)$"))
 | 
					              (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
 | 
					              newtext
 | 
				
			||||||
              1 "\n" 2))))))
 | 
					              1 "\n" 2))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#(use-modules (lily display-lily))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
% Kompletten Vers mit Akkorden
 | 
					% Kompletten Vers mit Akkorden
 | 
				
			||||||
#(define-markup-command (chordverse layout props stanza verse) (string-or-music? string?)
 | 
					#(define-markup-command (chordverse layout props stanza verse) (string-or-music? string?)
 | 
				
			||||||
   #:properties ((intraverse-vspace 0)(custom-verse-breaks '()))
 | 
					   #:properties (
 | 
				
			||||||
 | 
					    (intraverse-vspace 0)
 | 
				
			||||||
 | 
					    (custom-verse-breaks '())
 | 
				
			||||||
 | 
					    (transposition (cons #f #f))
 | 
				
			||||||
 | 
					    (verselayout generalLayout)
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
   "Vers mit Akkorden"
 | 
					   "Vers mit Akkorden"
 | 
				
			||||||
   (let* ((fromto (chain-assoc-get 'transposition props #f))
 | 
					   (let ((transp (if (car transposition)
 | 
				
			||||||
          (transp (if fromto
 | 
					                    (string-append "\\transpose " (symbol->string (note-name->lily-string (car transposition))) " " (symbol->string (note-name->lily-string (cdr transposition))))
 | 
				
			||||||
                    (string-append "\\transpose " (car fromto) " " (cdr fromto))
 | 
					                    "")))
 | 
				
			||||||
                    ""))
 | 
					 | 
				
			||||||
          (verselayout (chain-assoc-get 'verselayout props generalLayout)))
 | 
					 | 
				
			||||||
   (interpret-markup layout props
 | 
					   (interpret-markup layout props
 | 
				
			||||||
     (markup #:override `(baseline-skip . ,(+ intraverse-vspace songTextLineHeigth)) #:anchor-x-between #:stanza stanza
 | 
					     (markup #:override `(baseline-skip . ,(+ intraverse-vspace songTextLineHeigth)) #:anchor-x-between #:stanza stanza
 | 
				
			||||||
       (make-wrap-newline-markup
 | 
					       (make-wrap-newline-markup
 | 
				
			||||||
               (ly:regex-replace (ly:make-regex "\\(( *)([^,()]*)( *),([^)]*)\\)")
 | 
					               (ly:regex-replace (ly:make-regex "\\(( *)([^,()]*)( *),([^)]*)\\)")
 | 
				
			||||||
                 (ly:regex-replace (ly:make-regex "(([^ \n]*\\([^()]*,[^()]+\\)[^ \n(]*)+)") (handle-custom-newlines custom-verse-breaks verse) " \\concat { " 1 " } ")
 | 
					                 (ly:regex-replace (ly:make-regex "(([^ \n]*\\([^()]*,[^()]+\\)[^ \n(]*)+)") (handle-custom-newlines custom-verse-breaks verse) " \\concat { " 1 " } ")
 | 
				
			||||||
                "\\textup \\line { \"" 1 "\" " 2 " \"" 3 "\" } \\score { \\transposable " transp " \\chords { s4 " 4 " } \\layout { \\verselayout } }")
 | 
					                "\\textup \\line { \"" 1 "\" " 2 " \"" 3 "\" } \\score { " transp " \\chords { s4 " 4 " } \\layout { \\verselayout } }")
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
     ))))
 | 
					     ))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -148,9 +157,18 @@
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#(define-markup-command (verseformat layout props verse) (markup?)
 | 
					#(define-markup-command (verseformat layout props verse) (markup?)
 | 
				
			||||||
 | 
					   #:properties ((verselayout generalLayout))
 | 
				
			||||||
   "Textformatierung für Strophen"
 | 
					   "Textformatierung für Strophen"
 | 
				
			||||||
   (interpret-markup layout props
 | 
					   (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)))
 | 
				
			||||||
 | 
					     )
 | 
				
			||||||
   )
 | 
					   )
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -182,3 +200,135 @@
 | 
				
			|||||||
              (make-column-markup
 | 
					              (make-column-markup
 | 
				
			||||||
                (add-markup-between-elements #t (make-vspace-markup verse-vspace) column-markups)))
 | 
					                (add-markup-between-elements #t (make-vspace-markup verse-vspace) column-markups)))
 | 
				
			||||||
            column-data)))))))))
 | 
					            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)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            \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