J'ai réussi à modifier le code que tu m'avais donné....
Ouah ! Trés joli.
seul problème je
voudrais colorier les hampes plutot que les tête de notes...
Bon j'ai fait 2 versions
- une version qui colorie les notes et les "stem"
- une version (colorizeStem) qui ne colorie que les stem.
La version 2 est très décevante, à moins peut-être de grossir/agrandir les stem
La version 1 devrait marcher pour la 2.16 (non testé) mais il faudra modifier la 2.
Gilles
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\version "2.14.2"
#(define (pitch->color pitch prev-pitch)
(let ((mod-interval (modulo (- (ly:pitch-semitones prev-pitch)
(ly:pitch-semitones pitch))
12)))
(case mod-interval
;; Return rainbow colors
((1) (rgb-color 0.71 0.28 0.58 )) ; for C
((2) (rgb-color 0.15 0.33 0.68 )); for D
((3) (rgb-color 0.58 0.73 0.91 )) ; for E
((4) (rgb-color 0.71 0.86 0.69 )) ; for F
((5) (rgb-color 1.0 0.87 0.0 )) ; for G
((6) (rgb-color 1.0 0.58 0.55 )) ; for A
((7) (rgb-color 0.93 0.15 0.20 )) ; for B
((8) (rgb-color 0 0.5 0 ))
((9) (rgb-color 0.71 0.28 0.58 ))
((10) (rgb-color 0.71 0.28 0.58 ))
((11) (rgb-color 0.71 0.28 0.58 ))
((12) (rgb-color 0.71 0.28 0.58 ))
(else black))))
%% parfois Lilypond renvoie color <unspecified> !?
%% je pense qu'il faut commencer de 0 et finir à 11
%% (non testé)
%%%%%%%%%%%%%%%%%%%%%%%%% colorizeNote %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
colorizeNote = #(define-music-function (parser location music) (ly:music?)
"Colorize note in green if previous notes is below, in black if pitch equal,
in resd if above"
(let ((prev-pitch (ly:make-pitch 0 0 0)))
(music-map
(lambda(x)
(let ((p (ly:music-property x 'pitch)))
(if (ly:pitch? p) (begin
(ly:music-set-property! x 'tweaks
(cons (cons 'color (pitch->color p prev-pitch))
(ly:music-property x 'tweaks)))
(set! prev-pitch p)))
x))
music)))
#(define (note-color->stem-color grob)
(let* ((note-head (ly:grob-property grob 'cause))
(color (ly:grob-property note-head 'color)))
; décommenter la ligne suivante n'a aucun effet ! Dommage.
; (ly:grob-set-property! note-head 'color black)
color))
%%%%%%%%%%%%%%%%%%%%%%% colorizeStem %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \displayMusic \override Voice.Stem #'color = #red =>
#(define (override-stem-color mycolor)
(make-music 'ContextSpeccedMusic 'context-type 'Voice 'element
(make-music 'OverrideProperty 'pop-first #t
'grob-property-path (list (quote color))
'grob-value mycolor
'symbol 'Stem)))
colorizeStem = #(define-music-function (parser location music) (ly:music?)
"Colorize note in green if previous note is below, in black if pitch is
equal, in red if above"
(let ((prev-pitch (ly:make-pitch 0 0 0)))
(music-map
(lambda(x)
(case (ly:music-property x 'name)
((EventChord)
(let ((es (filter
(lambda(y) (eq? (ly:music-property y 'name) 'NoteEvent))
(ly:music-property x 'elements))))
(if (null? es)
x
(let* ((p (ly:music-property (car es) 'pitch))
(color (pitch->color p prev-pitch)))
(set! prev-pitch p)
(make-sequential-music (list
(override-stem-color color) x))))))
(else x)))
music)))
%%%%%%%%%%%%%%%%%%% Test %%%%%%%%%%%%%%%%%%%
musique = \relative
{ c4 d e d e d c e e d f e g f <e g c> <d f b> <c e c'>1 }
\markup "colorizeNote + stem override"
{
\override Voice.Stem #'color = #note-color->stem-color
\colorizeNote \musique
}
\markup "colorizeStem"
\colorizeStem \musique