25 Commits

Author SHA1 Message Date
tux
b4690f63bc Alternativchords mit Klammern 2024-09-04 09:39:57 +02:00
tux
958efca6aa set spacing for rests in chordlyrics 2024-09-03 12:13:23 +02:00
tux
81a5676965 more precise Links in PDF toc 2024-07-19 14:32:41 +02:00
tux
5ee1a7b6be show year also for same author on text and melody 2024-07-17 13:34:00 +02:00
tux
162d32c53d hide KeyCancellation in chordlyrics 2024-07-12 07:55:55 +02:00
tux
a3c3a67b33 make songTitleSize customizable 2024-07-10 22:29:58 +02:00
tux
09d3bb7fa1 improve spacing of chordlyrics 2024-06-30 19:02:12 +02:00
tux
bab581042a deprecate \schwarzkopf and solve the problem with layers 2024-06-30 15:27:53 +02:00
3b87476549 have repeat signs as stanzas in lyrics 2024-06-30 10:28:21 +02:00
c4bfc17b89 support für römische Zahlen in den Strophen 2024-06-29 19:18:05 +02:00
e388559f23 auch die Punktierung grau machen im secondVoiceStyle 2024-06-29 16:56:53 +02:00
tux
e17c544763 Anteil der songinfo Breite an Gesamtbreite konfigurierbar 2024-06-25 12:17:54 +02:00
tux
3c2f27b477 use upstream merge rest engraver 2024-06-02 19:46:43 +02:00
tux
b3d46ff607 fix tranpose 2024-05-27 14:56:44 +02:00
tux
0df95f6441 Textakkordabstands finetuning 2024-05-26 22:08:09 +02:00
tux
201a54f60a recognize verselayout and use lyrictext font size to render verse markup 2024-05-25 17:28:02 +02:00
tux
0199813a81 repair transposition for books 2024-05-25 13:14:14 +02:00
bce9ffe763 hide multi measure rests in chordlyrics 2024-05-22 22:55:41 +02:00
tux
86943b9316 fix default reference voice and chords for songbook output 2024-05-22 22:55:41 +02:00
tux
5884ab9d2c rework authorsystem
* add translation, interlude, bridge and meloverse
* fix rendering bugs
2024-05-12 18:31:39 +02:00
199f515be9 fix verse-chord multiple transpose problem 2024-05-12 16:13:56 +02:00
8c7386807b fix spacing in new chordlyrics system 2024-03-30 18:12:51 +01:00
tux
7f7cac99f4 add chordlyrics and nochordlyrics 2024-03-24 11:22:49 +01:00
395e959432 unknown author and shiftChords 2024-02-16 20:00:10 +01:00
tux
e72efbd156 custom line breaks more robust refs #21 2024-02-04 16:29:10 +01:00
13 changed files with 396 additions and 153 deletions

View File

@ -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 = {}

View File

@ -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
}
}

View File

@ -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 }
}
}

View File

@ -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
} }
} }

View File

@ -3,6 +3,11 @@
composerPrefix = "Weise:" composerPrefix = "Weise:"
compositionPrefix = "Satz:" 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)

View File

@ -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 = "𝄆"

View File

@ -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)))
@ -39,40 +40,111 @@
)) authors) )) authors)
) )
(define (render-contribution-numbers contributionNumbers) (define (numbered-contribution-prefix contributionNumbers prefixLookup)
(string-join (map (lambda (contributionNumber) (ly:format "~a." contributionNumber)) contributionNumbers) ", ") (string-append
(string-join (map (lambda (contributionNumber) (ly:format "~a." contributionNumber)) contributionNumbers) ", ")
" "
(ly:output-def-lookup layout prefixLookup)
) )
(define (render-verse-contribution contributionNumbers)
(string-append (render-contribution-numbers contributionNumbers) " Strophe: ")
) )
(define (render-voice-contribution contributionNumbers) (define referencedAuthors '())
(string-append (render-contribution-numbers contributionNumbers) " Stimme: ")
(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-author-ids-by 'text authors)) (poetIds (find-author-ids-by 'text authors))
(translatorIds (find-author-ids-by 'translation authors))
(versePoetData (find-author-id-with-part-numbers 'verse authors)) (versePoetData (find-author-id-with-part-numbers 'verse authors))
(allPoetIds (append poetIds (map car versePoetData)))
(composerIds (find-author-ids-by 'melody authors)) (composerIds (find-author-ids-by 'melody authors))
(compositionIds (find-author-ids-by 'composition authors)) (verseComposerData (find-author-id-with-part-numbers 'meloverse authors))
(voiceComposerData (find-author-id-with-part-numbers 'voice authors)) (voiceComposerData (find-author-id-with-part-numbers 'voice authors))
(poets (append (compositionIds (find-author-ids-by 'composition authors))
(map (lambda (poetId) (format-author poetId #f)) poetIds) (bridgeIds (find-author-ids-by 'bridge authors))
(map (lambda (versePoetEntry) (string-append (render-verse-contribution (cdr versePoetEntry)) (format-author (car versePoetEntry) (member (car versePoetEntry) poetIds)))) versePoetData) (interludeIds (find-author-ids-by 'interlude authors))
)) (year_text (chain-assoc-get 'header:year_text props #f))
(composers (append (year_translation (chain-assoc-get 'header:year_translation props #f))
(map (lambda (composerId) (format-author composerId (member composerId allPoetIds))) composerIds) (year_melody (chain-assoc-get 'header:year_melody props #f))
(map (lambda (composerId) (string-append (ly:output-def-lookup layout 'compositionPrefix) " " (format-author composerId (member composerId allPoetIds)))) compositionIds) (year_composition (chain-assoc-get 'header:year_composition props #f))
(map (lambda (voiceComposerEntry) (string-append (render-voice-contribution (cdr voiceComposerEntry)) (format-author (car voiceComposerEntry) (member (car voiceComposerEntry) allPoetIds)))) voiceComposerData) )
))) (if (and (equal? poetIds composerIds) (null? translatorIds) (null? versePoetData) (null? verseComposerData) (null? voiceComposerData) (null? compositionIds) (null? bridgeIds) (null? interludeIds))
(if (and (equal? poetIds composerIds) (null? versePoetData) (null? voiceComposerData) (null? compositionIds))
(list (string-append (ly:output-def-lookup layout 'poetAndComposerEqualPrefix) " " (string-join poets ", ")) #f)
(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)
) )
) )
@ -91,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))
@ -131,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 {

View File

@ -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
#}) #})

View File

@ -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)

View File

@ -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
} }

View File

@ -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 {

View File

@ -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))

View File

@ -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))
)