\version "2.22.1"

%% http://lsr.di.unimi.it/LSR/Item?id=973
% => http://lilypond.1069038.n5.nabble.com/kind-of-gregorian-moving-noteheads-tc170995.html
% => http://lilypond.1069038.n5.nabble.com/Hungarian-Gregorian-tc171130.html

%% Works with other sizes:
%#(set-global-staff-size 25)
%#(set-global-staff-size 16)



\paper {
  #(set-paper-size "a4portrait")
    %top-margin = 17\%
    left-margin = 17% 
    right-margin = 17%
   %bottom-margin = 40%
   %print-page-number = ##t   
  }


\header {
  tagline = ""  %lábjegyzetbe akármi
} 

%%%%% Defs to be saved as "modernGregorian.ily" %%%%%%%%%

%%%% Defining new stem/ligatures:
% long stem
lst = #(define-music-function (parser location mus)
     (ly:music?)
   #{
     \stemDown
     \undo\omit Stem
     \once\override Stem.length = #7
     \once\override Stem.X-extent = #'(.1 . 0)
     \once\override NoteHead.stem-attachment = #'(1.5 . .1)
     $mus
     \omit Stem
   #})

%long curved ligature
#(define (long-curved-ligature grob)
   (if (ly:stencil? (ly:stem::print grob))
     (let* ((stencil (ly:stem::print grob))
            (X-ext (ly:stencil-extent stencil X))
            (Y-ext (ly:stencil-extent stencil Y))
            (width (interval-length X-ext))
            (len (interval-length Y-ext)))
       (ly:stencil-translate
         (grob-interpret-markup grob
           (markup
             (#:path width
               (list (list (quote moveto) -0.7 -0.65)
                   (list (quote curveto) -1.2 -0.4 -1.1 -0.2 -0.9 0.5)
                   (list (quote curveto) -0.9 0.5 -0.4 2 -0.8 2.2)))))
         (cons 0 (interval-start Y-ext))))
     #f))

lli = #(define-music-function (parser location mus)
     (ly:music?)
        #{
          \stemUp
          \undo\omit Stem
          \override Stem.stencil = #long-curved-ligature
          $mus
          \omit Stem
        #})

%medium curved ligature
#(define (medium-curved-ligature grob)
   (if (ly:stencil? (ly:stem::print grob))
     (let* ((stencil (ly:stem::print grob))
            (X-ext (ly:stencil-extent stencil X))
            (Y-ext (ly:stencil-extent stencil Y))
            (width (interval-length X-ext))
            (len (interval-length Y-ext)))
       (ly:stencil-translate
         (grob-interpret-markup grob
           (markup
             (#:path width
               (list (list (quote moveto) -0.7 -0.65)
                   (list (quote curveto) -1.2 -0.4 -1.1 -0.2 -0.9 0.5)
                   (list (quote curveto) -0.9 0.5 -0.4 1.9 -1.4 1.8)))))
         (cons 0 (interval-start Y-ext))))
     #f))

mli = #(define-music-function (parser location mus)
     (ly:music?)
        #{
          \stemUp
          \undo\omit Stem
          \override Stem.stencil = #medium-curved-ligature
          $mus
          \omit Stem
        #})

%short curved ligature
#(define (short-curved-ligature grob)
   (if (ly:stencil? (ly:stem::print grob))
     (let* ((stencil (ly:stem::print grob))
            (X-ext (ly:stencil-extent stencil X))
            (Y-ext (ly:stencil-extent stencil Y))
            (width (interval-length X-ext))
            (len (interval-length Y-ext)))
       (ly:stencil-translate
         (grob-interpret-markup grob
           (markup
             (#:path width
               (list (list (quote moveto) -0.7 -0.65)
                   (list (quote curveto) -1.2 -0.4 -1.1 -0.2 -1 0.4)
                   (list (quote curveto) -1 0.4 -0.8 1.5 -1.4 1.3)))))
         (cons 0 (interval-start Y-ext))))
     #f))

sli = #(define-music-function (parser location mus)
     (ly:music?)
        #{
          \stemUp
          \undo\omit Stem
          \override Stem.stencil = #short-curved-ligature
          $mus
          \omit Stem
        #})

%tiny curved ligature
#(define (tiny-curved-ligature grob)
   (if (ly:stencil? (ly:stem::print grob))
     (let* ((stencil (ly:stem::print grob))
            (X-ext (ly:stencil-extent stencil X))
            (Y-ext (ly:stencil-extent stencil Y))
            (width (interval-length X-ext))
            (len (interval-length Y-ext)))
       (ly:stencil-translate
         (grob-interpret-markup grob
           (markup
             (#:path width
               (list (list (quote moveto) -0.7 -0.65)
                   (list (quote curveto) -1.2 -0.4 -1.1 -0.1 -1 0.2)
                   (list (quote curveto) -1 0.2 -0.8 0.7 -1.4 0.6)))))
         (cons 0 (interval-start Y-ext))))
     #f))

tli = #(define-music-function (parser location mus)
     (ly:music?)
        #{
          \stemUp
          \undo\omit Stem
          \override Stem.stencil = #tiny-curved-ligature
          $mus
          \omit Stem
        #})

%% Ornament function
orn = 
  -\tweak self-alignment-X #LEFT
  -\tweak Y-offset #0.5
  -\tweak X-offset #1
  -\tweak outside-staff-priority ##f
  -\markup
      \raise #-.3
      \scale #'(1 . .85)
      \rotate #90 
      \musicglyph #"ties.lyric.short"

%% Left aligning lyric :
lal = \once\override LyricText.self-alignment-X = #LEFT

%% horizontal inside staff spacer 
space =
#(define-music-function
     (parser location anzahl)
     (number?)
   #{
     \grace { \repeat unfold #anzahl s }
   #})

% Given some music that represents lyrics, add a prefix to the first
% lyric event.
% syntax is \versus { some lyrics }
% resp. \responsum { some lyrics }
#(define (add-prefix-to-lyrics prefix music)
   (let ((found? #f))
     (map-some-music
      (lambda (m)
	(if found? m
	    (and (music-is-of-type? m 'lyric-event)
		 (begin
		   (set! (ly:music-property m 'text)
			 (string-append prefix (ly:music-property m 'text)))
		   (set! found? #t)
		   m))))
      music)))
% Add unicode 2123 (versicle) as prefix to lyrics.
versus =
#(define-music-function (parser location music) (ly:music?)
   (add-prefix-to-lyrics "℣. " music))
% Add unicode 211F (response) as prefix to lyrics.
responsum =
#(define-music-function (parser location music) (ly:music?)
   (add-prefix-to-lyrics "℟. " music))

%% Defining notelaces (neume, melisma) and dedicated context:
gregorianContext = { 
  \cadenzaOn 
  \omit Clef
  \omit TimeSignature
  \omit StaffSymbol
  \omit Rest
  \omit Flag
  \omit Beam
  \override SpacingSpanner.packed-spacing = ##t
  \override NoteHead.stencil = 
    #(lambda (grob)
       (let ((pos (ly:grob-property grob 'staff-position)))
         (cond ((= pos -6)
             (grob-interpret-markup grob 
               #{
                  \markup
                  \concat { 
                    \with-dimensions #'(0 . 0) #'(0 . 0)
                    \translate-scaled #'(-.45 . 0)
                    \override #'(thickness . 2)
                    \draw-line #'(1.78 . 0)
                    \hspace #-.21 
                    \musicglyph #"noteheads.s2" 
                    \hspace #-.25 
                  }
               #}))
           ((= pos -7)
               (grob-interpret-markup grob 
                 #{
                    \markup
                    \concat { 
                      \with-dimensions #'(0 . 0) #'(0 . 0) 
                      \override #'(thickness . 2) 
                      \translate-scaled #'(-.45 . .5)
                      \draw-line #'(1.78 . 0)
                      \hspace #-.21 
                      \musicglyph #"noteheads.s2" 
                      \hspace #-.25 
                    }
                 #}))
           ((= pos -8)
               (grob-interpret-markup grob 
                 #{
                    \markup
                    \concat { 
                      \with-dimensions #'(0 . 0) #'(0 . 0) 
                      \override #'(thickness . 2) 
                      \translate-scaled #'(-.45 . 1)
                      \draw-line #'(1.78 . 0)
                      \with-dimensions #'(0 . 0) #'(0 . 0) 
                      \override #'(thickness . 2) 
                      \translate-scaled #'(-.45 . 0)
                      \draw-line #'(1.78 . 0)
                      \hspace #-.21 
                      \musicglyph #"noteheads.s2" 
                      \hspace #-.25 
                    }
                  #}))
           (else
              (grob-interpret-markup grob 
                     #{
                        \markup
                        \concat { 
                          \hspace #-.21 
                          \musicglyph #"noteheads.s2" 
                          \hspace #-.25 
                        }
                      #})))))
  \override Accidental.extra-offset = #'(-.2 . 0)
  
  %%% TODO: find a fixed ledger line with no dimension
  %% see: http://lilypond.1069038.n5.nabble.com/Fixed-ledger-line-width-with-no-dimension-tc172180.html 
  %\override LedgerLineSpanner.length-fraction = #'() %%% ???
  %\override LedgerLineSpanner.minimum-length-fraction = #'() %%% ???
}

neume = #(define-music-function (parser location mus)
     (ly:music?)
   #{
     \once\override NoteHead.stencil = #(lambda (grob)
         (grob-interpret-markup grob 
           #{
              \markup\concat {
                \hspace #-2
                \score {
                  \transpose c c' { \omit Stem $mus } 
                  \layout {
                    indent = 0
                    ragged-right = ##t
                    \context {
                      \Score
                      \gregorianContext
                    }
                  }
                }
              }
           #}))
   #})

melisma = #(define-music-function (parser location mus)
     (ly:music?)
     #{
        { 
          \once\override Lyrics.LyricText.self-alignment-X = #LEFT
          \neume { $mus } 
          \omit Accidental 
          \omit Dots
          #(make-music
            'NoteEvent
            'pitch
            (ly:make-pitch -1 6 0)
            'duration
            (ly:make-duration 2 0 1))
        }
     #})

% Declare default layout
\layout {
  \context {
    \Score
    \omit TimeSignature
  }
}

%%%%%%%%%%%% end of "modernGregorian.ily" %%%%%%%%%

%%%%%%%%%%% Example %%%%%%%%%%%%%%

%\version "2.18.2"
%\include "modernGregorian.ily"





zsoltaregy = \transpose c c' {
    \key f \major
  \omit Stem
    d4 f d c f g \melisma { f \lst a } 
  \melisma a4.
   \once\override Staff.BarLine.bar-extent = #'(0 . 2) \bar "|"
    a a \melisma { a4 \lst c' } a a g f \melisma { g \lst a } \melisma a4. 
  \once\override Staff.BarLine.bar-extent = #'(0 . 2) \bar "|"
  a g a f g \melisma { \lst f4 e } \melisma d4. 
   \bar "|"
   f \melisma { \lst f4 e }  d c c d \melisma { f \lst g } \melisma f4. 
  \once\override Staff.BarLine.bar-extent = #'(0 . 2) \bar "|"
  f \melisma { g4 \lst a } \melisma { \lst a a g } e f e \melisma { d d } \melisma { d d }
  \bar "||"
}

zsoltaregyLyrics = \lyricmode {
  Je -- ru -- zsá -- lem gyer -- mek -- né -- pe pál -- ma -- fák -- nak á -- ga -- it hoz -- ván
  e -- lé -- be ment az Úr -- nak; s ki -- ál -- tot -- ta han -- gos szó -- val:
  Ho -- zsan -- na a ma -- gas -- ság -- ban!
}


\score {
  <<
    \cadenzaOn
    \new Voice = Zslotar \zsoltaregy
    \new Lyrics \lyricsto Zslotar \zsoltaregyLyrics
  >>
  \layout {
     indent = 0.0\cm %az első kottasor behúzása
    
    ragged-right = ##f
    \context {
      \Lyrics
      \override VerticalAxisGroup.staff-affinity = ##f
    }
  }
 }


\markup\vspace #2



zsoltarkettő = \transpose c c' {
    \key f \major
  \omit Stem
   d f d c f g \melisma {  f \lst a } \melisma {a4.}
    \once\override Staff.BarLine.bar-extent = #'(0 . 2) \bar "|"
    a a \melisma { a4 \lst c' } a a a g f \melisma { g \lst a } \melisma {a4.}
    \once\override Staff.BarLine.bar-extent = #'(0 . 2) \bar "|"
    a g a f g \melisma { \lst f4 e } \melisma {d4.} \bar "|"
    f \melisma { \lst f4 e } \melisma { \lst d4 d c c } 
    \once\override Staff.BarLine.bar-extent = #'(0 . 2) \bar "|"
    c d f \melisma { f \lst g } f f g a \melisma { \lst a a g }
    e f e \melisma { d d } \melisma { d d } \bar "||"
}

zsoltarkettőLyrics = \lyricmode {
  Je -- ru -- zsá -- lem gyer -- mek -- né -- pe le -- te -- rít -- vén ru -- há -- it az út -- ra,
  nagy szó -- val így ki -- ál -- tott: Ho -- zsan -- na Dá -- vid Fi -- á -- nak, ál -- dott,
  ki jő az Úr ne -- vé -- ben!
}


\score {
  <<
    \cadenzaOn
    \new Voice = Zslotar \zsoltarkettő
    \new Lyrics \lyricsto Zslotar \zsoltarkettőLyrics
  >>
  \layout {
     indent = 0.0\cm %az első kottasor behúzása
    ragged-right = ##f
    \context {
      \Lyrics
      \override VerticalAxisGroup.staff-affinity = ##f
    }
  }
 }


\markup\vspace #2



zsoltarharom = \transpose c c' {
    \key f \major
  \omit Stem
   \melisma {  f f \lst g } \melisma { f4. }
   \once\override Staff.BarLine.bar-extent = #'(0 . 2) \bar "|"
   f\breve \hide NoteHead  f4 f f f f f 
  \undo \hide NoteHead
  g f \melisma {  g \lst a } \melisma { \lst a-- g4.-- } \bar "|"
  g f g a \melisma {  \lst g4 f } \melisma { f4. } \bar "||" \break
  
  a\breve \hide NoteHead a4 a a a a a a a
  \undo \hide NoteHead
  \melisma { a \lst b } \melisma {  a4. }
  \once\override Staff.BarLine.bar-extent = #'(0 . 2) \bar "|"
  a\breve \hide NoteHead a4 a a a
  \undo \hide NoteHead
  \melisma { g \lst a } \melisma { g4. }
  \once\override Staff.BarLine.bar-extent = #'(0 . 2) \bar "|"
  g\breve \hide NoteHead g4 g g
  \undo \hide NoteHead
  g a \melisma { \lst g f } \melisma { g \lst a } \melisma { \lst a-- g4.-- }
  \bar "||"
  
}

zsoltarharomLyrics = \lyricmode {
Krisz -- tus en -- ge -- del -- mes volt ér -- tünk mind -- ha -- lá -- lig,_* a ke -- reszt -- ha -- lá -- lig.
V.:_A -- zért föl -- ma -- gasz -- tal -- ta őt az Is -- ten, és ne -- vet a -- dott né -- ki,
mely fö -- löt -- te van min -- den név -- nek.
}


\score {
  <<
    \cadenzaOn
    \new Voice = Zslotar \zsoltarharom
    \new Lyrics \lyricsto Zslotar \zsoltarharomLyrics
  >>
  \layout {
     indent = 0.0\cm %az első kottasor behúzása
    ragged-right = ##f
    \context {
      \Lyrics
      \override VerticalAxisGroup.staff-affinity = ##f
    }
  }
 }


\markup\vspace #2
