[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
- Automatic lyric colouring, Jack Mackenzie, 2016/11/26
- Re: Automatic lyric colouring, Andrew Bernard, 2016/11/26
- Re: Automatic lyric colouring, Jack Mackenzie, 2016/11/26
- Re: Automatic lyric colouring, Andrew Bernard, 2016/11/26
- Re: Automatic lyric colouring, Jack Mackenzie, 2016/11/26
- Re: Automatic lyric colouring, Urs Liska, 2016/11/27
- Re: Automatic lyric colouring, Joseph Chrestien, 2016/11/27
- Re: Automatic lyric colouring, Urs Liska, 2016/11/27
Re: Automatic lyric colouring,
Thomas Morley <=