lilypond-user-fr
[Top][All Lists]
Advanced

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

Re: Colorier suivant l'intervalle ave c la note précédente


From: Gilles
Subject: Re: Colorier suivant l'intervalle ave c la note précédente
Date: Tue, 27 Mar 2012 15:52:16 +0200
User-agent: Opera Mail/11.62 (Win32)


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



reply via email to

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