15 Commits

9 changed files with 133 additions and 123 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"

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

@ -39,6 +39,7 @@ generalLayout = \layout {
\context { \context {
\Staff \Staff
\accidentalStyle modern \accidentalStyle modern
\consists Merge_rests_engraver
} }
\context { \context {
\Score \Score
@ -60,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
} }
} }
@ -71,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

@ -38,6 +38,32 @@ shiftChords = #(define-music-function (parser location xshift chords) (number? l
$chords $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))))
@ -95,20 +121,9 @@ 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
} }
} }
#(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))))
% Akkord mit Bunddiagramm anzeigen % Akkord mit Bunddiagramm anzeigen
#(define-markup-command (fret-chord layout props fret chord) (string? string?) #(define-markup-command (fret-chord layout props fret chord) (string? string?)
(interpret-markup layout props (interpret-markup layout props

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

@ -104,7 +104,10 @@
) )
(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? translatorIds) (null? versePoetData) (null? verseComposerData) (null? voiceComposerData) (null? compositionIds) (null? bridgeIds) (null? interludeIds))
(list (list
(render-contribution-group (ly:output-def-lookup layout 'poetAndComposerEqualPrefix) poetIds) (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) #f)
(list (list
(if (and (null? poetIds) (null? versePoetData) (null? translatorIds)) #f (if (and (null? poetIds) (null? versePoetData) (null? translatorIds)) #f
@ -200,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,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

@ -122,6 +122,8 @@
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 ( #:properties (
@ -132,7 +134,7 @@
) )
"Vers mit Akkorden" "Vers mit Akkorden"
(let ((transp (if (car transposition) (let ((transp (if (car transposition)
(string-append "\\transpose " (note-name->string (car transposition)) " " (note-name->string (cdr transposition))) (string-append "\\transpose " (symbol->string (note-name->lily-string (car transposition))) " " (symbol->string (note-name->lily-string (cdr transposition))))
""))) "")))
(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
@ -225,14 +227,24 @@
#:properties ((baseline-skip)) #:properties ((baseline-skip))
(stack-stencils Y DOWN baseline-skip (stack-stencils Y DOWN baseline-skip
(map (map
(lambda (line) (ly:make-stencil (ly:stencil-expr line) (ly:stencil-extent line X) `(0 . ,reference-height))) (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)))) (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?) #(define-markup-command (chordlyrics layout props lyrics) (ly:music?)
#:properties ((verse-chords #{#}) #:properties ((verse-chords #{#})
(verse-reference-voice #{#}) (verse-reference-voice #{#})
(verse-break-voice #{#}) (verse-break-voice #{#})
(verse-line-height songTextLineHeigth) (verse-line-height songTextLineHeigth)
(verse-text-chord-distance songTextChordDistance)
(intraverse-vspace 0) (intraverse-vspace 0)
(transposition (cons #f #f)) (transposition (cons #f #f))
(verselayout generalLayout)) (verselayout generalLayout))
@ -241,33 +253,35 @@
#{ #{
\markup { \markup {
\override #`(baseline-skip . ,intraverse-vspace) \override #`(baseline-skip . ,intraverse-vspace)
\pad-left #-5
\score-equal-height #verse-line-height \score-lines { \score-equal-height #verse-line-height \score-lines {
\transposable #transposition \transposable #transposition
<< <<
\new Devnull { #verse-break-voice } \new Devnull { #verse-break-voice }
\new NullVoice = "dummyvoice" { #verse-reference-voice }
#(music-clone verse-chords) #(music-clone verse-chords)
\new NullVoice { #verse-reference-voice } \new Lyrics \lyricsto "dummyvoice" { #lyrics }
\addlyrics { #lyrics }
>> >>
\layout { \layout {
\verselayout \verselayout
\context { ragged-right = ##t
\Staff
\override LeftEdge.space-alist.first-note = #'(fixed-space . 5.0)
}
\context { \context {
\Lyrics \Lyrics
\override VerticalAxisGroup.nonstaff-relatedstaff-spacing.basic-distance = #(- (- songTextLineHeigth songTextChordFontSize) 1) \override VerticalAxisGroup.nonstaff-relatedstaff-spacing.basic-distance = #verse-text-chord-distance
\override LyricText.parent-alignment-X = #LEFT \override LyricText.parent-alignment-X = #LEFT
\override LyricText.self-alignment-X = #LEFT \override LyricText.self-alignment-X = #LEFT
\override LyricText.word-space = 0.8 \override LyricText.word-space = 0.8
\override LyricSpace.minimum-distance = 0.8 \override LyricSpace.minimum-distance = 0.8
\override LyricText.stencil = #custom-lyric-text::print \override LyricText.stencil = #custom-lyric-text::print
} }
\context {
\ChordNames
\override VerticalAxisGroup.staff-affinity = ##f
\override ChordName.extra-spacing-width = #'(-0.1 . 0.1)
}
\context { \context {
\Score \Score
\override PaperColumn.keep-inside-line = ##f \override PaperColumn.keep-inside-line = ##f
% \override SpacingSpanner.strict-note-spacing = ##t
\override SpacingSpanner.uniform-stretching = ##t \override SpacingSpanner.uniform-stretching = ##t
\override SpacingSpanner.spacing-increment = 0 \override SpacingSpanner.spacing-increment = 0
\remove Bar_number_engraver \remove Bar_number_engraver
@ -280,7 +294,10 @@
\remove Staff_symbol_engraver \remove Staff_symbol_engraver
\remove Clef_engraver \remove Clef_engraver
\remove Time_signature_engraver \remove Time_signature_engraver
\remove Bar_engraver
\remove Separating_line_group_engraver
\omit KeySignature \omit KeySignature
\omit KeyCancellation
} }
\context { \context {
\Voice \Voice
@ -293,6 +310,13 @@
\remove Dynamic_engraver \remove Dynamic_engraver
\remove Note_heads_engraver \remove Note_heads_engraver
} }
\context {
\NullVoice
\consists Rest_engraver
\omit Rest
% \undo \omit NoteHead
% \hide NoteHead
}
} }
} }
} }