Color Spawn
Mon père disait toujours deux points je cite
« Il faut maîtriser sa palette... »
Il n'aurait pas du tout aimé ce qui va suivre, Naï c'est pour toi que j'écris cet article...
Des palettes et des contraintes
Dans le cadre de mon projet Code Can Be Beautiful (alias C2B2 — oui, j'ai le droit, et puis je fais ce que je veux avec ma calvitie), j'utilise un fichier JSON pour définir des collections de palettes.
Par exemple :
[
{
"name": "impulse0",
"colors": [
"#000000",
"#FFA500",
"#FFFFFF"
]
},
{
"name": "yy0",
"colors": [
"#15508C",
"#D87C20"
]
}
]
Ici, on retrouve Impulse0 et Yin-Yang0.
Impulse0 pour rendre hommage à ce label de Jazz et on va pas parler Coltrane de suite ( attends un peu ça arrive...). J'aime la pureté de cette palette Noir, Blanc et Orange et pour Yin-Yang, le couple que je considère comme le plus dynamique des complémentaires : Bleu et Orange.
Ensuite, je balance tout ça dans mes algos pour produire les artworks à partir d'un modèle simplissime, par exemple une matrice de 9.
Normalement, la dynamique des complémentaires fait le job : ça bouge, l'œil est attiré, se promène, voyage. On peut lancer un nouveau tirage aléatoire et espérer une proposition intéressante... mais au bout d'un moment, le « surgissement » devient rare. Et ce n'est pas la peine de générer 3000 tirages pour espérer la perle rare.
Le surgissement
C'est le mot, l'idée que je cherchais : produire du bruit à l'instanciation.
Si la couleur définie dans la palette perd son statut figé, elle devient une ancre, un point d'émergence. Mais bruiter une couleur en hexadécimal ? Pas envie, pas fun, pas une bonne médecine.
Après un peu de veille, je me suis naturellement tourné vers l'espace HSV et son modèle géométrique en cône. Par exemple, l'Orange #FFA500 en hexa correspond à (39°, 100%, 100%) dans l'espace HSV. Ma couleur-ancre devient soudain un point dans un espace à trois dimensions, que je peux déplacer sur ses axes.
Du bruit à l'émergence.
Je reprends mon exercice : une palette de deux couleurs, une matrice de 9, et 10 tirages par génération (inutile de bourriner). Pour comparer objectivement, je fige la position des couleurs dans la grille ; seules les coordonnées des points d'émergence varient légèrement.
O ! La vache...
Les premiers essais ont été un choc. Ces micro-variations insufflent une dynamique globale incroyable. C'était exactement ce qui manquait à mes productions : je faisais évoluer les motifs géométriques, mais il manquait ce souffle chromatique. (Je t'épargne les comparatifs fastidieux entre bruit gaussien, uniforme, blanc, gris, rose et bruit hyperbolique de la tangente azimutale).
Et c'est là que j'ai repensé à : « Il faut maîtriser sa palette... »
Sorry, pas là, justement !
The Coltrane Circle
Me voilà donc un soir, heureux comme un bossu avec mon nouveau joujou, à faire tourner mes scripts et à retravailler les post-traitements avec G'MIC, lorsque ma playlist me balance Giant Steps dans les oreilles...
Et là, The Coltrane Circle spawne dans ma tête.
Une idée de dingue vient de me traverser l'esprit, inventer un système de notation des couleurs en copiant la musique
Dans l'espace HSV, les teintes s'expriment sur 360° comme
12 × 30 = 360
ah, la duodécimale et le cercle
J'ai donc mes 12 teintes de base, pour limiter les caractères de mon alphabet, je choisis d'utiliser le symbole # pour noter une progression de 30°.
J'obtiens ainsi un alphabet de 7 caractères (R, V, J, C, B, M, #) pour couvrir mes 12 teintes fondamentales :
| Code HSV | Nom de la couleur | Abréviation |
|---|---|---|
(0°, 100%, 100%) |
Rouge | R |
(30°, 100%, 100%) |
Rouge-Orange | R# |
(60°, 100%, 100%) |
Jaune | J |
(90°, 100%, 100%) |
Chartreuse | J# |
(120°, 100%, 100%) |
Vert | V |
(150°, 100%, 100%) |
Menthe | V# |
(180°, 100%, 100%) |
Cyan | C |
(210°, 100%, 100%) |
Azur | C# |
(240°, 100%, 100%) |
Bleu | B |
(270°, 100%, 100%) |
Indigo | B# |
(300°, 100%, 100%) |
Magenta | M |
(330°, 100%, 100%) |
Fuchsia | M# |
Pour les axes de Saturation et de Valeur (Luminosité), j'ai choisi de les segmenter en 3 niveaux :
- Saturation : Ombré (
b), Normal (par défaut), Intense (!) - Valeur : Sombre (
1), Médium (2), Clair (3)
J'arrive ainsi à une notation concise et élégante pour désigner mes spawns.
ColorSpawn
Je bascule donc d'un système de palettes en hexadécimal à un système de ColorSpawn, reposant sur un alphabet de 14 caractères : R, V, J, C, B, M, #, !, b, 1, 2, 3, K, W (avec K pour le noir pur Black et W pour le blanc pur White).
Le fichier de palette devient alors :
[
{
"name": "impulse0",
"spawns": [
"K",
"R#!3",
"W"
]
},
{
"name": "yy0",
"spawns": [
"C#!2",
"R#!3"
]
}
]
La palette Yin-Yang0 se traduit désormais par un nuage de probabilité d'émergence autour de ses deux ancres, C#!2 et R#!3.
Il ne me reste plus qu'à coder un petit parser en python qui décode le spawn et me le restitue en couleur informatique (hexa, hsv, rbg) compatible avec les librairies graphiques que j'utilise pour Code Can Be Beautiful.
Qu'est-ce que ça change au fond ?
Hé bien, pas grand-chose... et tout à la fois.
D'abord, j'arrête de parler de « couleurs » figées là où je manipule désormais des points d'émergence, avec un système de notation cohérent.
Ensuite, cela m'a permis de me détacher totalement du codage hexadécimal pour adopter l'espace HSV comme véritable modèle de représentation mentale des couleurs.
En prime, de nouvelles évidences sautent aux yeux. Par exemple, si l'on replace la palette Impulse dans l'espace HSV, elle matérialise un triangle parfait : la tension absolue entre deux valeurs extrêmes et un point de fuite coloré, source de vibration.
Je suis maintenant convaincu que de véritables structures géométriques sous-tendent les palettes que nous percevons comme belles et harmonieuses. Et ça, ce sera l'objet de mes prochaines investigations.
J'ai d'ailleurs déjà commencé à projeter les palettes de couleur de Sanzo Wada sous Blender car c'est en 3D qu'il me faudra faire l'analyse.