On Sun, May 25, 2014 at 10:06 AM, David Nalesnik
<david.nales...@gmail.com>wrote:


>  (Something could be worked out for enharmonics, I suppose.)
>

OK, this handles enharmonics:
\version "2.18.2"


#(define (get-pitch elt)
   (ly:music-property elt 'pitch))

#(define (extract-pitches lst result)
   (cond
    ((null? lst) result)
    ((ly:pitch? (get-pitch (car lst)))
     (set! result (append result (list (get-pitch (car lst)))))
     (extract-pitches (cdr lst) result))
    ((ly:music-property (car lst) 'elements)
     (append
      (extract-pitches (ly:music-property (car lst) 'elements) result)
      (extract-pitches (cdr lst) result)))
    (else (extract-pitches (cdr lst) result))))


colorPitches =
#(define-music-function (parser location mus col) (ly:music? color?)
   (let* ((music-list (extract-named-music mus '(EventChord NoteEvent)))
          (pitch-list (extract-pitches music-list '())))
     #{
       \override NoteHead.color =
       #(lambda (grob)
          (let ((pitch (ly:event-property (ly:grob-property grob 'cause) 'pitch)))
            (if (any
                 (lambda (x) (= (ly:pitch-semitones pitch) (ly:pitch-semitones x)))
                  pitch-list)
                col)))
     #}))

%%%%%%%%%%%%%%%%%%%%%%%% EXAMPLE %%%%%%%%%%%%%%%%%%%%%%%%%%

playerI = \relative c'' { g bes }

playerII = \relative c' { <c d> dis } % works for chords too

upper = \relative c' {
  c4 cis d dis es f fis fisis g aeses gis a ais bes b c
}

\score {
  \new Staff \upper
  \layout { }
}

\score {
  \new Staff {
    \colorPitches \playerI #green
    \upper
  }
  \layout { }
}

\score {
  \new Staff {
    \colorPitches \playerII #red
    \upper
  }
  \layout { }
}
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to