lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Automatic lyric colouring


From: Thomas Morley
Subject: Re: Automatic lyric colouring
Date: Sun, 27 Nov 2016 14:26:22 +0100

2016-11-27 2:40 GMT+01:00 Jack Mackenzie <address@hidden>:
> I'm trying to put together an engraver for educational purposes, with
> noteheads coloured according to a particular scheme, and lyrics following
> this colouring.
>
> I've used the snippet for notehead colouring successfully
> (http://lsr.di.unimi.it/LSR/Snippet?id=572), using "\override NoteHead.color
> = #color-notehead", but have no idea how to get the lyrics to follow the
> same colour scheme without changing each word individually. I took a punt
> but using "override LyricText.color = #color-notehead" didn't work.
>
> Anyone got any clues to whether my idea is possible and if so how?
>
> Thanks


Hi Jack,

how about below?
Not an engraver, seems to work, tho'.

\version "2.18.2"

%Association list of pitches to colors.
#(define color-mapping
   (list
    (cons #{ c'   #} (x11-color 'red))
    (cons #{ cis' #} (x11-color 'green))
    (cons #{ des' #} (x11-color 'green))
    (cons #{ d'   #} (x11-color 'blue))
    (cons #{ dis' #} (x11-color 'cyan))
    (cons #{ e'   #} (x11-color 'red))
    (cons #{ eis' #} (x11-color 'green))
    (cons #{ fes' #} (x11-color 'red))
    (cons #{ f'   #} (x11-color 'green))
    (cons #{ fis' #} (x11-color 'blue))
    (cons #{ ges' #} (x11-color 'blue))
    (cons #{ gis' #} (x11-color 'red))
    (cons #{ aes' #} (x11-color 'red))
    (cons #{ a'   #} (x11-color 'green))
    (cons #{ ais' #} (x11-color 'blue))
    (cons #{ bes' #} (x11-color 'blue))
    (cons #{ bis' #} (x11-color 'red))))

%Compare pitch and alteration (not octave).
#(define (pitch-equals? p1 p2)
   (and
    (= (ly:pitch-alteration p1) (ly:pitch-alteration p2))
    (= (ly:pitch-notename p1) (ly:pitch-notename p2))))

#(define (pitch-to-color pitch)
   (let ((color (assoc pitch color-mapping pitch-equals?)))
     (if color
         (cdr color)
         '())))

#(define (color-notehead grob)
  (let* ((pitch-color
           (pitch-to-color
             (ly:event-property (event-cause grob) 'pitch)))
         (pap-col-elts
           (ly:grob-object
             (ly:grob-parent
               (ly:grob-parent grob X)
               X)
             'elements))
         (elts-list
           (if (ly:grob-array? pap-col-elts)
               (ly:grob-array->list pap-col-elts)
               '()))
         (lyr-text
           (filter
             (lambda (g)
               (grob::has-interface g 'lyric-syllable-interface))
             elts-list)))
     (for-each
       (lambda (lyr)
         (ly:grob-set-property! lyr 'color pitch-color))
       lyr-text)
     (ly:grob-set-property! grob 'color pitch-color)))

\score {
  <<
    \new Voice = "voice"
      \relative c' {
      \override NoteHead.after-line-breaking = #color-notehead
      c8 b d dis ees f( g) aes
    }
    \new Lyrics \lyricsto "voice" { c b d dis ees f aes }
  >>
}


Cheers,
  Harm



reply via email to

[Prev in Thread] Current Thread [Next in Thread]