2016-11-27 2:40 GMT+01:00 Jack Mackenzie <jackguthriemacken...@gmail.com>: > 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 _______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user