Subject: couleurs rgb

From: Daniel Cartron <[email-masked]>
Date: Wed, 25 Mar 2015 18:11:13 +0100

Bonsoir,

La logique lilypondienne veut que les couleurs rgb soient notées 1 1 1 et non 
255 255 255, ce que je trouve peu pratique.

Qqun a-t-il connaissance d'une fonction pour convertir la notation classique 
en notation lily ? Sinon je me la fait, mais ce serait idiot de réinventer 
l'eau tiède...

Merci.

-- 
Cordialement, Daniel Cartron
« Il ne faut pas avoir peur du bonheur. C'est seulement un bon moment à 
passer. »
Romain Gary

---

From: Christophe Pochon <[email-masked]>
Date: Wed, 25 Mar 2015 19:48:58 +0100

Le choix de 1 1 1 est beaucoup plus ouvert vers l'avenir :-) Parce qu'il y
a beaucoup plus de nuances possibles entre 0 et 1 en nombres relatifs
qu'entre 0 et 255 en nombres entiers. 255*255*255 ça fait 16.7 millions de
couleurs. Ca parait énorme, mais pourtant dans certains types de couleurs
l'oeil humain est capable de voir plus de nuances.

Ceci dit si tu as ta valeur basée sur 255, tu fais (x+1)/256 pour
convertir, je pense.

A+

Christophe

Christophe Pochon
http://www.christophe-pochon.com

Le 25 mars 2015 18:11, Daniel Cartron <[email-masked]> a écrit :

> _______________________________________________
> liste de diffusion lilypond-user-fr
> [email-masked]
> https://lists.gnu.org/mailman/listinfo/lilypond-user-fr
>

---

From: Daniel Cartron <[email-masked]>
Date: Wed, 25 Mar 2015 20:04 +0100

> l'oeil humain est capable de voir plus de nuances.

Je n'en disconviens pas mais :
- nos écrans pour l'instant ne savent pas faire plus que ça ;
- le jour où ils sauront le faire ok ce sera bien mais lilypond c'est un 
logiciel graphique de haut niveau ?

Du rgb de base c'est déjà énorme, et si j'ai choisi ce format c'est parce 
qu'on n'a pas besoin de connaître 200+ noms de couleurs qui ne fonctionnent 
d'ailleurs pas toutes...

> Ceci dit si tu as ta valeur basée sur 255, tu fais (x+1)/256 pour

non (/ 1 x) le fait AMHA.

C'est juste que si qqun l'a déjà fait c'est idiot de le refaire...

-- 
Cordialement, Daniel Cartron
« Quand les filles ont les yeux cernés, c'est que la place est prise. »
Willy

---

From: Christophe Pochon <[email-masked]>
Date: Wed, 25 Mar 2015 20:19:59 +0100

Pas bien compris (/ 1 x)

A+

Christophe

Christophe Pochon

---

From: Daniel Cartron <[email-masked]>
Date: Wed, 25 Mar 2015 20:34:10 +0100

> Pas bien compris (/ 1 x)

Ben c'est du scheme...

Ceci dit tu as raison c'est (/1 (+1 x)) qui donnerait le bon résultat.

Au passage, un petit défi : écrire un markup en couleur rgb uniquement en 
scheme ... En fait le défi est surtout de me dire où tu auras trouvé la doc...

Je te rassure, j'y arrive. C'est faisable. Ça m'a pris des heures. Parce que 
pas trouvé de doc...

-- 
Cordialement, Daniel Cartron
« Quand on a oublié d'acheter du sucre, on peut parfaitement sucrer son café 
avec une betterave, mais c'est plus long. »
François Cavanna - Le saviez-vous ?

---

From: Christophe Pochon <[email-masked]>
Date: Wed, 25 Mar 2015 21:37:33 +0100

Je dois être idiot : diviser un nombre par 1 ça sert à quoi ?

Daniel tu sous-entends dans presque chaque message que la doc de Lilypond
est incomplète. C'est un peu fatigant. Parmi les milliers de projets
open-source qui existent, Lilypond est un des projets (voire le projet)
incroyablement bien documenté. Et dans plusieurs langues. Par des gens qui
font ça sur leur temps libre, bénévolement.

A+

Christophe

Christophe Pochon

---

From: Daniel Cartron <[email-masked]>
Date: Thu, 26 Mar 2015 07:04:56 +0100

> Je dois être idiot : diviser un nombre par 1 ça sert à quoi ?

Non je divise 1 par x. Mais tu avais raison c'est (x+1)/256 qu'il faut faire. 
À un détail près : 255 donnera bien 1, 127 donnera 0.5 mais 0 ne donnera pas 
0. Il faut rajouter un if en début de formule...

Au passage, dans la doc
http://lilypond.org/doc/v2.19/Documentation/notation/inside-the-staff.fr.html#coloring-objects
il est indiqué que 0.5 correspond à 128 ce qui est faux puisqu'on compte de 0 
p 255 et non de 1 à 256.
 
> est incomplète. 

Non le plus souvent je dis que je ne trouve pas dans la doc ce que je cherche, 
pas que ça n'y est pas. Et je ne suis pas le seul sur cette liste à poser des 
questions pour cette raison. Alors oui la doc est hyper riche, à la hauteur 
des performances de lilypond, mais elle suit une logique anglo-saxonne et non 
cartésienne. En tout cas c'est comme ça que je la ressent. Nous on a 
l'habitude d'aller du général au particulier, là c'est souvent le contraire. 
Exemple :
http://lilypond.org/doc/v2.16/Documentation/extending/markup-construction-in-scheme.fr.html (la version 2.19 est encore moins explicite AMHA) :
on nous montre en exemple et on doit en déduire le fonctionnement général.

Mais pour ce qui est du rgb je persiste ce n'est pas expliqué, il faut 
tâtonner pour deviner comment faire. Et pour make-line-markup c'est encore 
pire j'ai beau faire impossible de l'utiliser pour faire ce que je veux, à 
savoir une lettre qui est soit droite soit en italique avec un if.

-- 
Cordialement, Daniel Cartron
« La seule différence entre un sage et un imbécile, c'est que le sage a 
tendance à commettre des erreurs beaucoup plus graves, parce que personne ne 
confie des décisions importantes à un imbécile. »
Tom Clancy - Dangers immédiats

---

From: Daniel Cartron <[email-masked]>
Date: Thu, 26 Mar 2015 07:59:44 +0100

Le mercredi 25 mars 2015, 18:11:13 Daniel Cartron a écrit :
> Sinon je me la fait, mais ce serait idiot de réinventer 
> l'eau tiède...

Presque fini mais si toutes les commandes fonctionnent dans la sandbox guile 
une fois mis sous forme de fonction ça marche pas. C'est en général toujours 
là que je finis par coincer... :-(

Pourtant je me suis inspiré de 
http://www.lilypond.org/doc/v2.18/Documentation/extending/scheme-function-definitions

la fonction :

mkRGB = #(define-scheme-function (parser location lst) (list?)
 (define (convert-rgb n) (if (> n 0) (exact->inexact(/ (+ 1 n) 256)) 0 ))
 (map convert-rgb lst)
 (append '(rgb-color) lst)
 lst
)

#(define lst '(0 128 256))
(display (mkRGB test))

In expression (mkRGB test):
Wrong type to apply: #<Music function #<procedure #f (parser location lst)>>

Merci de me donner un ch'tit coup de main pour finir...

-- 
« Les cons gagnent toujours. Ils sont trop. »
François Cavanna - Coups de sang

---

From: Gilles THIBAULT <[email-masked]>
Date: Fri, 27 Mar 2015 13:48:15 +0100

> #(define lst '(0 128 256))
la syntaxe serait plutôt :

%%%%%%%%%%
mkRGB = #(define-scheme-function (parser location lst) (list?)
 (define (convert-rgb n) (if (> n 0) (exact->inexact(/ (+ 1 n) 256)) 0 ))
 (apply rgb-color (map convert-rgb lst))
)

#(display #{ \mkRGB #'(0 128 256) #})

%%%%%%%%%

En scheme brut/pure/classique ..., c'est plus simple :

%%%%%%%%%%%%%%%
#(define (mkRGB . args)
   (define (convert-rgb n) (/ n 256)) 
(apply rgb-color (map convert-rgb args)))
%% (apply fonc '(a b c d ..) => (fonc a b c d ..)

#(display (mkRGB 0 127 256))

\relative c' { 
  \override NoteHead.color = #(mkRGB 0 128 256) 
  c4 d e f
}

%%%%%%%%%%%%%%%%%%%

NB
 J'ai mis (/ n 256) qui marche très bien, mais je ne suis pas spécialiste des 
couleurs.

%%%%%%%
-- 
Gilles

---

From: Daniel Cartron <[email-masked]>
Date: Fri, 27 Mar 2015 17:01:21 +0100

>   \override NoteHead.color = #(mkRGB 0 128 256) 

effectivemement c'est encore plus compact, ça accepte 256 (alors que ça devrait 
pas ;-) et ça marche mm sans transformer en inexact. Superbe !

Mon seul pb est que les valeurs rgb sont dans une variable...
#(define couleur '(0 128 256))

et là ça coince, In expression (0 128 256):
/tmp/frescobaldi-fuFEHd/tmpQdJS9G/bluesette.ly:57:14: Wrong type to apply: 0

Je devine bien pourquoi, mais je vois pas comment modifier...

-- 
Cordialement, Daniel Cartron
« L'idéal serait d'être d'une bonne santé contagieuse. »
Robert Sabatier - Le livre de la déraison souriante

---

From: Olivier Miakinen <[email-masked]>
Date: Fri, 27 Mar 2015 23:58:53 +0100

>  J'ai mis (/ n 256) qui marche très bien, mais je ne suis pas spécialiste des 

Pour ma part, j'aurais mis (/ n 255).

Avec (/ n 256), le 0 donne bien 0.0 et le 128 donne 0.5, mais le 255
donne 0.996 au lieu de 1.0 .

Avec (/ n 255), le 0 donne bien 0.0 et le 255 donne 1.0, même si le 128
donne 0.502 et non pas 0.5 . Ça s'éloigne donc un peu de la doc qui dit
que 128 correspond à 0.5, mais c'est quand même plus logique d'avoir un
noir complètement noir et un blanc complètement blanc plutôt que de
pinailler sur la valeur du milieu.

---

From: Daniel Cartron <[email-masked]>
Date: Sat, 28 Mar 2015 10:38:12 +0100

Le vendredi 27 mars 2015, 23:58:53 Olivier Miakinen a écrit :
> >  J'ai mis (/ n 256) qui marche très bien, mais je ne suis pas spécialiste
> >  des> 
> > couleurs.
> 

C'est aussi ce que j'ai mis, et j'ai testé 0 127 et 255

> pinailler sur la valeur du milieu.

Ceci dit la valeur du milieu n'est pas 128 mais 127 contrairement à ce que dit 
la doc. Et 127 donne 0.498 (je vous fais grâce de toutes les décimales.

Ce qui est logique puisque le milieu entre 0 et 255 c'est 127.5. Mais à ce 
stade c'est vraiment peu important, moins qu'avoir une vraie valeur 1, je suis 
d'accord.

-- 
Cordialement, Daniel Cartron
« Si Adam avait été homosexuel, personne ne serait là pour le dire. »
Oscar Wilde

---

From: Gilles THIBAULT <[email-masked]>
Date: Sat, 28 Mar 2015 21:31:24 +0100

> #(define couleur '(0 128 256))

Soit tu mets :
\override NoteHead.color = #(apply mkRGB couleur)

Soit tu changes mkRGB
#(define (mkRGB macouleur)
  (define (convert-rgb n) (/ n 256))
 (apply rgb-color (map convert-rgb macouleur)))

\override NoteHead.color = #(mkRGB couleur)

NB
Aucune opinion sur  (/ n 256) vs (/ n 255) sauf à dire que je ferais plutôt 
confiance aux programmeurs de Lilypond : il faudrait voir les entrailles de 
rgb-color

-- 
Gilles

---

From: Daniel Cartron <[email-masked]>
Date: Sun, 29 Mar 2015 06:44:53 +0200

>  (apply rgb-color (map convert-rgb macouleur)))

Je préfère cette solution, à ce détail  près que la couleur doit s'écrire 
(rgb-color 0 0.5 1) et que si j'ajoute un append '(rgb-color) lily ne 
considère pas ça comme une couleur... Parce que c'est une liste ?
Comment peut-on faire pour que ça passe ?

> \override NoteHead.color = #(mkRGB couleur)

en fait je ne fais pas ça mais (define macouleur (mkRGB couleur)) et je 
réutilise macouleur pour faire mes markups

> confiance aux programmeurs de Lilypond : il faudrait voir les entrailles de

Ça se peut qu'ils sachent ce qu'ils font mais si on utilise des valeurs de 1 à 
256 et qu'on divise par 256 on n'aura jamais la valeur 0... de plus l'habitude 
est de noter le rgb de 0 à 255, alors...

-- 
Cordialement, Daniel Cartron
« Si l'Administration militaire faisait correctement son travail, il n'y 
aurait pas de Soldat inconnu. »
François Cavanna - Le saviez-vous ?

---

From: Daniel Cartron <[email-masked]>
Date: Sun, 29 Mar 2015 16:41:07 +0200

> Comment peut-on faire pour que ça passe ?

J'ai trouvé, c'est 
(rgb-color (car(mkRGB macouleur)) (cadr(mkRGB macouleur)) (caddr(mkRGB 
macouleur)) )
ce qu'il faut obtenir, mais je vois pas comment intégrer ça dans la 
fonction... Pour moi map c'est encore bien nébuleux mm si je sens que ça doit 
être très efficace et que j'en aurai besoin d'ici peu pour une autre fonction...

-- 
Cordialement, Daniel Cartron
« Les voyages, ça sert surtout à embêter les autres une fois qu'on est revenu  
»
Sacha Guitry

---

From: Gilles THIBAULT <[email-masked]>
Date: Mon, 30 Mar 2015 09:27:14 +0200

> (rgb-color (car(mkRGB macouleur)) (cadr(mkRGB macouleur)) (caddr(mkRGB
(apply rgb-color macouleur) fait la même chose ...

-- 
Gilles

---

From: Daniel Cartron <[email-masked]>
Date: Mon, 30 Mar 2015 10:56:26 +0200

> (apply rgb-color macouleur) fait la même chose ...

Ha bizarre... Effectivement ça marche mais pendant un moment j'ai eu :
erreur fatale : make-with-color-markup: Argument invalide à la position 1.
 color requis, trouvé (255 0 0) .

Donc merci une fois de plus...

-- 
Cordialement, Daniel Cartron
« Il ne faut pas oublier que le jour du Déluge ceux qui savaient nager se 
noyèrent aussi. »
Ramon Gomez de la Serna