Processing : exploration des couleurs HSB et de l’ordre des dessins

Processing : exploration des couleurs HSB et de l’ordre des dessins

Je cherche à mieux comprendre comment gérer les superpositions d’objets et de  couleurs. Je vais tenter de comprendre progressivement et de noter au fur et à mesure ce que je comprends.

La boucle « draw »

Essayons d’abord un sketch simple pour explorer les notions de transparence de couleur, et de boucle ‘draw’.

J’ai préparé un sketch qui illustre les impacts des choix d’ordre d’affichage et de transparence.

Couleurs en HSB

Jusqu’à présent j’ai toujours utilisé des couleurs en RGB ou Hexadécimal (cf article ancien : choisir les bonnes couleurs pour un site (hexa, rgb) ) et j’ai toujours ignoré le mode HSB. Pourtant ce mode permettrait d’avoir plus de subtilité pour les choix de couleur automatique, comme dans Processing.

Pour définir que mon script Processing utilise HSB, j’indique colorMode(HSB, 360, 100,100,100) ;  dans le setup :

  • Hue :  0  ou 360 est rouge,  60 est jaune, 120 est vert, 180 est cyan, 240 est bleu, 300 est mauve ;
  • Saturation : 0 gris, 50 clair, 100 saturé ;
  • Brightness : 0 noir, 50 foncé, 100 plus clair – Quelle que soit le Hue, un brightness faible donne une couleur noire ;
  • Alpha transparency 0 = transparent, 100 = opaque

Les couleurs sont représentées sur un cone, expliqué très bien sur ce site en anglais : HSB: hue, saturation, and brightness, de  Tom Jewett. Sur cette page, en anglais, il y a des exemples très clairs et on comprend bien ce que sont les couleurs RGB, HSL et HSV. On pourra aussi lire cet article, toujours en anglais : The HSB Color System: A Practitioner’s Primer.

Le sketch qui suit utilise les couleurs suivantes (dans leur ordre d’apparition dans le code) :

  • Canevas de taille 640×360 pixel et de fond blanc : background(360) ;  dans setup()
  •  Grand Rectangle bleu violet opaque : fill(271, 100, 89, 100);
  • Arc de cercle cyan avec transparence : fill(180, 100, 100,20);
  • Cercle tracé par la souris rouge sang, opaque visible dans le coin en haut à gauche au démarrage du script : fill(353, 95, 73, 100); 
  • Triangle jaune doré avec transparence :  fill(43, 94, 72, 10);
  • Petits ronds de couleurs avec Hue variant de 0 à 360 par pas de 60 en haut (avec la boucle
for (int i = 0; i<=360; i+= 60) {

      fill(i, 100, 100, 100);

      ellipse( 150+i, 10 , 20, 20);

  }

On obtient ainsi l’écran suivant au démarrage du script :

Processing 3.0 Couleurs HSB

L’impact de l’ordre des dessins dans Setup() et draw()

Voici le code en Processing

void setup() {
  size(640, 360, P2D);
  colorMode(HSB, 360, 100,100,100) ;
  background(360) ;  // white
}

void draw() {
  // Rectangle opaque (sans transparence) blue violet
  fill(271, 100, 89, 100);  
  rect(40, 50, 150, 200);
  
  // Arc de cercle (avec transparence) cyan (bleu clair) 
  fill(180, 100, 100,20);  
  arc(479, 300, 280, 280, PI, TWO_PI);  
  
  // Cercle tracé par la souris rouge sang opaque
  fill(353, 95, 73, 100);  
  noStroke();
  ellipse(mouseX, mouseY, 20, 20);
  
  // triangle avec transparence jaune doré  
  fill(43, 94, 72, 10);  
  triangle(100, 25, 150, 340, 450, 260); 
  
  for (int i = 0; i<=360; i+= 60) {
      fill(i, 100, 100, 100);
      ellipse( 150+i, 10 , 20, 20);
  }
}

Je l’ai converti en Javascript avec ce site puis mis, sans aucune modification, dans Codepen :

See the Pen Exploration des couleurs et layers Processing – 1 by Delpech (@aldelpech) on CodePen.

On obtient des écrans comme celui-ci par exemple lorsqu’on manipule la souris dedans :

Processing 3.0 Ordre des dessins

Ce que je comprends à ce stade :

  • Le Canevas de fond blanc est défini dans le setup() et n’est donc plus jamais redessiné. C’est pourquoi on voit la trace de la souris dessus. Si background() était défini au tout début de la fonction draw(), on ne verrait pas la trace du passage de la souris.
  • Tous les objets qui sont dessinés dans draw() effacent les traces de la souris lorsqu’ils sont dessinés. C’est pourquoi les traces ne sont visibles que dans le canevas sans objets.
  •  Le grand Rectangle bleu violet opaque est dessiné en premier. Il apparaît donc sous tous les autres objets.
  • L’Arc de cercle cyan avec transparence est dessiné ensuite. Il a beau être transparent, il n’y a pas de trace de souris en dessous puisque la souris est dessinée après.
  • Lorsqu’on bouge la souris, un cercle rouge sang est. Il est visible par dessus les objets déjà présents. Attention on le voit dans le triangle jaune car il est transparent. S’il ne l’était pas le cercle de la souris ne serait pas visible car il est dessiné après.
  • Triangle jaune doré avec transparence : on observe en dessous les traces de la souris et il laisse voir également le cercle de la souris à l’instant de la capture d’écran car il est dessiné par dessus l’arc de cercle et sous le triangle.

Et maintenant ?

Oui, j’ai déjà un peu mal à la tête !

Dans le prochain article, ce sera encore plus compliqué car nous explorerons les calques. Maintenant que nous avons vu l’impact de la transparence, nous n’utiliserons que des couleurs sans transparence pour ne pas brouiller le message !

Processing : exploration des formes (class, pshape,…)

Processing : exploration des formes (class, pshape,…)

Je prépare un travail avec Processing qui va nécessiter de faire bouger des formes assez nombreuses dans le canevas. Ces formes peuvent être générées par le sketch ou être des fichiers svg (ou png) associés au sketch. J’explore donc les moyens de les générer puis de les faire bouger. Cet article reprend mes étapes successives d’apprentissage.

Etape 1 : explorer la notion de classe d’objet

D’abord tester la notion de classe et créer manuellement des objets

J’ai utilisé le script proposé dans l’exercice 2 du Chapitre 8 sur les objets de Learning Processing de Daniel Shiffman.

Ce que j’en retiens :

Une classe d’objet est utilisée lorsqu’on programme en mode orienté objet. La classe contient toujours les éléments suivants :

// des variables

// un constructor

// des fonctions, dont celle qui affichera l’objet (void display() mais pas obligatoirement ce nom)

La convention est toujours de faire commencer le nom d’une classe par une lettre majuscule, comme ici Car.

Ensuite, utiliser un array pour créer et animer un grand nombre d’objets à partir d’une classe

J’ai testé le code proposé dans l’exercice 9 du Chapitre 9 sur les « arrays » (tableaux) de Learning Processing de Daniel Shiffman.

Avec une seule classe on peut créer un nombre infini d’objets semblables, la limite étant la capacité de l’ordinateur à générer et animer ces objets.

Etape 2 : explorer le mouvement « autonome » d’objets divers

D’abord créer des objets divers et les faire bouger de manière « autonome »

Je me suis inspirée des essais de l’étape 1 et de l’exercice 2 du Chapitre 10 sur les algorithmes de Learning Processing de Daniel Shiffman.

Le script avec les classes dans des fichiers distincts en format zippé : alObjets3_Knowledge alObjets3 (zip)

.

Dans ce script, je crée « manuellement » un objet « myCar1 » et un objet « myVelo1 » et les objets balls[0] à balls[MaxBalls] sont générés par un array.

On notera qu’ici les paramètres de chaque objet sont définis dans les classes et pas dans le programme principal (voir plus bas).

Ensuite, tester la gestion des interactions entre certains objets

Je me suis inspirée de l’exercice 3 du Chapitre 10 sur les algorithmes de Learning Processing de Daniel Shiffman.

Dans ce sketch, les balles s’arrêtent lorsqu’elles approchent un « vélo » du fait d’une fonction intersect(Velo b) définie dans la classe Ball. Dans le programme principal, fonction void draw(), les balles ne bougent que si la distance au vélo est suffisante par le biais de :

if ( !balls[i].intersect(myVelo1) && !balls[i].intersect(myVelo2) ) {
     balls[i].move(); 
}

Le script avec les classes dans des fichiers distincts en format zippé : alObjets3 (zip)

.

Etape 3 : Explorer une classe pour le chronométrage et la gestion du temps

J’ai lu quelque part que le système utilisé pour l’étape 2 peut consommer énormément de ressources si on crée beaucoup d’objet. J’ai donc souhaité chronométrer le processus. Pour celà j’ai utiliser une classe « Timer » inspirée encore une fois du livre Learning Processing de Daniel Shiffman : exemple 4 et exemple 5 (timer OOP ou Programmation Orientée Objet) du chapitre 10.

Ca donne ce programme : alObjets5 (zip). Il est identique au précédent sauf que la console affiche le temps écoulé en fonction d’un compteur.

Etape 4 : utilisation de PShape

Dans ce tutoriel de Processing.org sur PShape, Daniel Shiffman explique que PShape est une solution pour éviter de saturer les capacités de l’ordinateur lorsqu’on veut créer un grand nombre de formes. J’ai donc décidé d’explorer PShape.

Je me suis inspirée du tutoriel et de Je me suis inspirée de File → Examples → Topics → Create Shapes → PolygonPShapeOOP que l’on trouve dans les exemples de Processing.

Ce script (alObjets6 (zip)) crée des étoiles comme indiqué dans le tutoriel ci-dessus et les déplace sur l’écran. J’ai ensuite créé des balles sur le même principe qui se déplacent comme dans alObjets5 de l’étape 3. Il y a aussi un chronomètre qui mesure le temps toutes les 100 boucles de draw().

Je ne peux pas afficher le résultat ici car l’extension que j’utilise ne gère pas correctement createShape et ça provoque une erreur dans la page. J’ai créé une version JavaScript (cf étape 8 pour la visualisation).

Syntaxe pour les objets prédéfinis et les objets à construire

La construction des objets PShape n’utilise pas exactement la même syntaxe lorsque l’objet est prédéfini (ici ellipse) ou pas (ici pour l’étoile) :

Dans la classe Star

createShape()

 // code de construction de la forme, morceau par morceau

beginShape()

s.fill(105, 204);

 s.noStroke();

endShape(CLOSE)

et dans la classe Ball

createShape(ELLIPSE, x, y, r*2, r*2);

b.setStroke(false) ;

b.setFill( c );

PShape manipule l’origine (0,0) du canevas

L’utilisation de PShape manipule l’origine (0,0) du canevas et il faut faire bien attention au moment du setup. J’ai mis beaucoup de temps à comprendre pourquoi mon canevas paraissait décalé. Puis en relisant pour la énième fois le tutoriel sur PShape, j’ai vu cette petite phrase : « when using PShape, what we’re really doing is configuring the geometry relative to the origin (0,0) » et j’ai enfin compris le sens des exemples qui suivaient !

Dans la fonction setup() on doit construire la forme à l’origine du canevas (0,0). Ainsi si je crée un rectangle avec PShape, je vais utiliser le code suivant (positionnement du rectangle dans la fonction setup à 0,0 :

PShape rectangle;

void setup() {

  size(640,360,P2D);

  rectangle = createShape(RECT, 0, 0, 100, 50);

}

void draw() {

  background(51);

  translate(mouseX,mouseY);

  shape(rectangle);

}

 

Par contre, si je décide de positionner les objets par leur centre (avec shapeMode(CENTER); ) c’est plus compliqué, je n’ai pas compris comment faire.

La façon d’afficher les objets est différente

Maintenant la fonction display() utilise des nouvelles fonctions :

void display() {

	pushMatrix();
	translate(x, y);
	shape(b);
	popMatrix(); 
}

pushMatrix() et popMatrix() assurent le changement d’origine du canevas et son retour aux coordonnées initiales.

Etape 5 : manipulation de PShape par des variables définies dans le programme principal

La version 7 de alObjets ne crée plus que des balles (pas les étoiles) et les variables sont définies à l’intérieur de la classe, ce qui limite un peu les choses.

Télécharger la version 7 : alObjets7 (zip)

Dans cette version 8, je m’inspire du cours sur la Programmation Orientée Objet de Margaret Noble, une artiste et professeur d’art. Elle explique très clairement le fonctionnement des classes puis vers la fin, elle expose comment on peut transférer des variables du programme principal vers les classes en utilisant des variables _var  au lieu de var .

Télécharger la version 8 : alObjets8 (zip)

Je ne peux pas afficher le résultat ici car l’extension que j’utilise ne gère pas correctement createShape et ça provoque une erreur dans la page.

J’ai converti un mix du code de alObjets6.pde et alObjets8.pde en Javascript (librairie p5.js). Si vous voulez voir le contenu de ce fichier, vous pouvez le télécharger  : alObjets6_convertiJS (en p5.js)

En voici le résultat dans CodePen

See the Pen Moving stars (p5.js) by Delpech (@aldelpech) on CodePen.

Et maintenant ?

J’ai compris comment génerer et contrôler des formes via des classes et PShape.

Maintenant, je veux faire la même chose sur des images svg. En attendant, je vais aussi voir comment convertir un script processing en javascript pour pouvoir en présenter une version animée en utilisant codepen.

Des « clients » pour serveur Mini DLNA et UPnP

Des « clients » pour serveur Mini DLNA et UPnP

Dans deux articles précédents de cette série , nous avons installé un serveur miniDLNA et un lecteur de musique (GMediaRender) sur un Raspberry Pi 3. Maintenant je veux pouvoir écouter la musique de ce Pi sur un téléphone mobile, une tablette ou un PC.

Clients, renderers, serveurs ????

J’ai installé sur le Pi un serveur DLNA qui permet de lister mes musiques et de les proposer à d’autres appareils. Le serveur ne joue pas la musique. Et le serveur ne peut pas décider quelle musique servir.

Pour écouter la musique de ce Pi où que je sois dans le réseau local, il me faut donc deux choses essentielles :

  • un « client» qui va contrôler le serveur et lui dire quelle musique choisir, composer des listes de lecture et dire où les restituer. Ce client peut être un PC, un appareil mobile (android, iOS,…) ou un appareil électronique compatible (une télévision par exemple) ;
  • un « renderer» qui va jouer la musique définie par un client. Souvent le client est également renderer, mais ce n’est pas toujours le cas.

Mes choix de clients et renderers

J’ai installé des clients qui font également « renderer » sur Android ou Windows 10. Sur le Pi, j’ai installé un « renderer » seulement pour qu’il joue de la musique dans un amplificateur situé à proximité. Sur iOS, je ferai des essais plus tard.

Je ne suis pas certaine d’avoir fait les bons choix. J’avais aussi comme critère que les applications soient compatibles DLNA, UPnP et « Open Home » car je veux installer un serveur UPnP sur le Pi (ce sera l’objet du prochain article de cette série). J’ai fait quelques essais et ce qui m’a semblé bien, c’est le choix suivant :

  • Sur Android : BubbleUPnP. Je l’installe et immédiatement Il voit ‘al music’, le « friendly name » du serveur DLNA

BubbleUPnP, client android DLNA et UPnP

  • Sur Windows 10, Windows Media Player. Je l’ai essayé en dernier et il fonctionne parfaitement. Il repère aussi ‘al music’ sans aucun réglage. J’ai donc rangé mes a priori et décidé de l’utiliser ! Sur Windows, VLC fonctionne avec le serveur miniDLNA mais c’est un peu plus compliqué et surtout ça paraît quasi impossible avec UPnP.
  • Sur Linux (Debian), pour le Pi, j’ai installé gMediaRender, dans une version compatible DLNA, UPnP et « Open Home». J’explique tout dans l’article XXX.
  • Dès que j’aurai la visite d’un appareil iOS, je proposerai d’essayer Linn Kazoo (Windows, Mac, android, iPad) ou LUMIN (iPad)
  • J’ai également très envie d’un appareil Chromecast audio qui deviendrait un renderer (une fois que j’aurai installé un serveur UPnP sur le Pi) pour jouer ma musique numérisée sur ma chaine hifi très ancienne.

Nota : pour une utilisation optimale, il faut acheter la licence de BubbleUPnP UPnP/DLNA (montant 3.99 €). Avant de le faire, je vais essayer d’autres solutions Android pour décider laquelle est la plus conviviale :

Je mettrai à jour cet article lorsque j’aurai tranché.

Et maintenant ?

Il faut que j’installe mon serveur UPnP sur le Pi pour avoir une vision globale. Ce sera l’objet du prochain article de cette série, .

GMediaRender sur Raspberry Pi pour lire de la musique d’un serveur DLNA, UPnP, Open Home

GMediaRender sur Raspberry Pi pour lire de la musique d’un serveur DLNA, UPnP, Open Home

Dans cet article de la série, , j’explique simplement comment installer une version compatible DLNA, UPnP et « Open Home » de GMediaRender, fondée sur gmrender-resurrect. Pour en savoir plus sur le fonctionnement d’un serveur DLNA, d’un serveur UPnP et du protocole « Open Home », il vous faudra lire les autres articles de cette série 😯 !

Installer gstreamer 1.0 et gmrender-resurrect UPnP renderer

Selon « Playing music on a Raspberry Pi using UPnP and DLNA (v3) » avec des modifications pour tenir compte que j’ai une installation plus récente, avec en particulier Raspbian Stretch et pas Wheezy.

Pour installer gstreamer 1.0, on copie tout ce qui suit (les deux lignes) et on le colle dans le terminal de notre Pi :

wget -O - http://www.chiark.greenend.org.uk/~christi/debian/christi@coraline.org.gpg.key \

| sudo apt-key add -

On doit avoir un message « OK ».

Ensuite on crée un nouveau fichier /etc/apt/sources.list.d/upnprender.list  pour y ajouter l’adresse du dépôt de Christi Scarborough pour gstreamer 1.0 :

cp /etc/apt/sources.list.d/raspi.list /etc/apt/sources.list.d/upnprender.list

Pour comprendre (un peu) ce qu’est une sources list, voir cet article, en français.

Dans le nouveau fichier on supprime le contenu de raspi.list et on ajoute la ligne suivante. Les instructions originelles disent de terminer par wheezy main. Ce serait juste si on utilisait encore la distribution Wheezy de Raspbian. Mais depuis 2013 elle a été remplacée par Jessie puis Stretch. Comme j’utilise Stretch, je termine par stretch main

deb http://www.chiark.greenend.org.uk/~christi/debian/ stretch main

Puis on met à jour la liste des paquets avant d’installer gmrender-resurrect

apt-get update

Il y a une erreur liée au fait qu’il n’y a pas de version stretch dans le dépôt ‘http://www.chiark.greenend.org.uk/~christi/debian. Mais l’erreur ne paraît pas majeure…

Je poursuis l’installation de gmrender-resurrect en copiant collant l’ensemble des 4 lignes sur une seule ligne du terminal du Pi :

apt-get install libupnp-dev libgstreamer1.0-dev \

gstreamer1.0-plugins-base gstreamer1.0-plugins-good \

gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly \

gstreamer1.0-alsa

Installation de gmediarender

Installer git avec

apt-get install git

On exécute ensuite les commandes suivantes, les unes après les autres :

cd

git clone https://github.com/hzeller/gmrender-resurrect.git

cd gmrender-resurrect

apt-get install autoconf

./autogen.sh

./configure

make install

Ca place gmediarender dans /usr/local/bin  et des icones dans /usr/local/share/gmediarender

Et maintenant on peut ponctuellement lancer le renderer, en lui donnant le nom qu’on veut (l’option –f dit quel nom on veut donner)

./src/gmediarender -f "Pi Bureau"

Ca fonctionne correctement. On fait CTRL C pour en sortir.

Faire fonctionner gmediarender comme un service

Pour que gmediarender démarre comme un service, il faut copier le contenu de  scripts /root/gmrender-resurrect/init.d/gmediarenderer dans /etc/init.d (ou home/votre-nom-d’utilisateur/gmrender-resurrect/init.d/gmediarenderer si vous n’êtes pas connecté en root au Pi)

cp scripts/init.d/gmediarenderer /etc/init.d

On édite /etc/init.d/gmediarender  pour définir le nom du « renderer » et corriger si nécessaire l’utilisateur :

DAEMON_USER="al:audio"

UPNP_DEVICE_NAME="Pi Bureau"

Puis on utilise update-rc.d pour que ces informations soient placées correctement dans le Pi.

update-rc.d gmediarenderer defaults

On redémarre le Pi (reboot  ou shutdown -r now ). gmediarender démarre. On peut le vérifier avec

ps aux|grep gmedia

Cette commande renvoit

552 11.9  6.9 317764 66444 ?        Ssl  10:01   0:02 /usr/local/bin/gmediarender -f Pi Bureau -d -u 7aff11df49801835fb41c5ea6c54bfa0 --gstout-audiosink=alsasink --gstout-audiodevice=sysdefault --gstout-initial-volume-db=-10

root       657  0.0  0.0   4372   560 pts/0    S+   10:02   0:00 grep --color=auto gmedia

Ca fonctionne et le “renderer” s’appelle Pi Bureau.

Sur mon ordinateur Windows, je peux maintenant destiner de la musique à « Pi Bureau » en cliquant à droite sur une liste de lecture ou un morceau dans Windows Media Player.

gMediaRender sur Raspberry Pi

Et maintenant ?

Dans les prochains articles de cette série , j’expliquerai quels « clients » j’ai choisi pour faire fonctionner mon serveur DLNA et jouer de la musique du serveur. J’ajouterai également un serveur BubbleUPnP au Pi afin de disposer d’un partage des listes de lecture et d’un fonctionnement aux normes « Open Home ».

Raspberry Pi : créer un serveur de musique miniDLNA

Raspberry Pi : créer un serveur de musique miniDLNA

Dans le premier article de cette série, , j’ai expliqué comment créer un serveur utilisant MPD. Mais je n’étais pas vraiment satisfaite. Depuis j’ai acheté un Raspberry Pi 3 et je me suis dit qu’il était temps de passer à un niveau supérieur.

Dans cet article, j’explique comment créer un serveur de musique miniDLNA qui va gérer toute ma musique numérique et la rendre accessible via des appareils Android (ou Apple). Dans un prochain article de cette même série, , j’expliquerai comment y ajouter un serveur UPnP.

De quoi j’ai besoin ?

  • Un raspberry Pi 3  ;
  • Un cable ethernet (on peut opter pour le wifi mais ce n’est pas ce que j’ai choisi) ;
  • un disque dur USB ;
  • Une alimentation USB pour le Raspberry Pi et le disque dur.

Préparer le Raspberry Pi (Raspbian Stretch, IP fixe)

J’ai installé Raspbian Stretch Lite (sans la partie graphique) en suivant les instructions de mon article Mise en service d’un Raspberry Pi.

Le « hostname » de mon Pi est : AlMusicServer. C’est le nom que j’utilise pour me connecter.

J’ai réglé ce Pi sur l’adresse IP fixe (connexion ethernet) 198.168.1.102 selon les instructions de mon article Raspberry Pi : connexion internet en wifi et/ou IP fixe.

Régler la sortie audio

Pour le réglage et les tests, je me suis inspirée des articles suivants :

ALSA est le système Linux de gestion du son. Le paquet alsa-utils est pré-installé dans les distributions Raspbian et contient des commandes utiles pour tester et régler le son de notre Raspberry Pi.

J’ai connecté mon Pi via le connecteur Jack 3.5mm. Ce n’est pas la meilleure solution pour une bonne qualité audio. On a intérêt à utiliser au moins une carte son USB, voire un DAC Hifi. Je verrai ça ultérieurement.

Dans le terminal, s’assurer que le mode audio renvoie bien au connecteur jack (et pas HDMI) avec

amixer cset numid=3 1

Pour tester le son

!!! Attention à bien enfoncer le connecteur Jack, sinon il y a du bruit dans les HP et rien ne fonctionne !!!

speaker-test

Ca fait un bruit (léger) dans les haut parleurs. Il faut régler le volume fort pour l’entendre.

aplay /usr/share/sounds/alsa/Noise.wav

Fait aussi du bruit, qu’on entend que si le volume est très fort

Pour voir les périphériques audios et leurs pilotes

aplay –l  liste tous les périphériques audio présents

lsmod  permet de voir quel pilote est associé au(x) périphérique(s) audio.

Pour régler le son

amixer controls  renvoie

numid=3,iface=MIXER,name='PCM Playback Route'

numid=2,iface=MIXER,name='PCM Playback Switch'

numid=1,iface=MIXER,name='PCM Playback Volume'

numid=5,iface=PCM,name='IEC958 Playback Con Mask'

numid=4,iface=PCM,name='IEC958 Playback Default'

Playback switch règle le son sur “ON” ou « OFF ».  Réglé sur On, le son sort des haut parleur au volume défini pat numid=1 (playback volume). Réglé sur Off, les haut pareleurs sont muets quel que soit le réglage de volume.

amixer cget numid=1  doit donc nous indiquer quel est le réglage du volume. Ca me dit :

; type=INTEGER,access=rw---R--,values=1,min=-10239,max=400,step=0

  : values=-2000

  | dBscale-min=-102.39dB,step=0.01dB,mute=1

Pour régler le son au maximum, je tape (noter qu’au lieu de cget j’utilise cset) :

amixer cset numid=1 100%

Maintenant aplay /usr/share/sounds/alsa/Noise.wav  émet maintenant un son que j’entends mieux.

Et pour régler le volume sur 100% et la sortie sur ON et qu’elle soit utilisée à chaque redémarrage du Pi

amixer cset numid=1 100%

amixer cset numid=2 on

alsactl store

Mon son fonctionne.

Si j’utilisais une carte son USB (on en trouve à des prix dérisoires), il faudrait que j’identifie son microprocesseur selon https://learn.adafruit.com/usb-audio-cards-with-a-raspberry-pi/figure-out-your-chipset. Ensuite selon le microprocesseur utilisé, je suivrais les instructions d’Adafruit dans le tutoriel USB Audio Cards with a Raspberry Pi.

Ajouter un disque dur USB

Connecter un disque dur USB puis suivre les instructions de mon article Monter un disque dur externe partagé sur un Raspberry Pi.

Ma musique est dans /media/iomega/MULTIMEDIA/musique.

Installer un serveur miniDLNA

DLNA ?

Cet article, en français, explique plutôt bien ce qu’est le DLNA. Pour résumer, je dirai juste Le DLNA (Digital Living Network Alliance) a été créé par Sony et d’autres entreprises pour définir des pratiques permettant le partage de médias digitaux entre appareils électroniques. En 2015, selon Wikipedia, plus de 200 entreprises participaient à cette alliance.

Installation de mini DLNA sur notre Raspberry Pi 3

J’ai suivi les instructions de Raspberry Pi Media Server – MiniDLNA., avec une correction pour que la base de données se mette à jour correctement lorsque je modifie les fichiers de musique (source : ce sujet sur le forum Raspberrypi.org)

apt-get install minidlna

Copier le fichier de configuration pour le conserver avant modification

cp /etc/minidlna.conf /etc/minidlna.OLD

puis modifier /etc/minidlna.conf

Ma musique est dans /media/iomega/MULTIMEDIA/musique suite à l’installation du disque dur. Il ne faut pas mettre directement ce répertoire dans la configuration de miniDLNA car dans ce cas inotify ne fonctionne pas correctement.

On doit laisser un répertoire local (sur la carte SD) et on crée un lien vers la véritable localisation des fichiers de musique ensuite… Comme ça inotify fonctionne, c’est à dire qu’il surveille en permanence si des fichiers sont modifiés et met alors la base de données à jour (si les modifications sont réalisées pendant que miniDLNA fonctionne).

Je modifie donc les lignes suivantes (pour la ligne inotify=yes, j’ai simplement décommenté la ligne) :

media_dir=A,/var/lib/minidlna/music

db_dir=/media/iomega/MULTIMEDIA/

friendly_name= AL Music

inotify=yes

Dans le terminal du Pi, je définis un lien entre /var/lib/minidlna/music et /media/iomega/MULTIMEDIA/musique :

ln -s /media/iomega/MULTIMEDIA/musique /var/lib/minidlna/music

On peut verifier que ça fonctionne en cliquant sur /var/lib/minidlna/music dans filezilla. On est enmené automatiquement sur /media/iomega/MULTIMEDIA/musique

Je démarre le service avec la commande

service minidlna start

Le disque tourne pendant un bout de temps.

Le log est dans /var/log/minidlna.log . Pour savoir en temps réel ce qui se passe, je peux utiliser

service minidlna status

Dans l’explorateur Windows, un clic sur “Réseau » affiche AL Music. Si je clique dessus, j’accède au lien http://192.168.1.102:8200/.

Si j’ai modifié les fichiers pendant l’arrêt de miniDLNA, je redémarre en forcant la reconstruction de la base de données :

service minidlna force-reload

Gestion des utilisateurs

C’est assez bizarre que je ne doive pas définir d’utilisateur et de groupe pour miniDLNA. Mais comme tout semble fonctionner… Si jamais on a un problème, il faudra peut-être s’inspirer de cet article de la documentation Ubuntu.

Lire des radios internet avec MiniDLNA

Dans ce forum, la solution de phile est de créer une playlist contenant les url des radios souhaitées et le sauvegarder en mode .txt avant de le renommer avec une extension .m3u. L’auteur met même une playlist exemple en téléchargement sur dropbox ici.

Ensuite on place le fichier dans le répertoire musique du Pi, /media/iomega/MULTIMEDIA/musique/.

Avec Windows Media Player, si je clique sur « Playlists » dans la bibliothèque DLNA « AL Music », je vois toutes mes listes, y compris la liste que je viens de placer. Mais je ne peux pas la lire. PAr contre, si je lis une radio internet (CTRL U dans Windows Media Player puis lien vers un flux internet, par exemple http://chai5she.cdn.dvmr.fr/bfmbusiness pour BFM), je peux la mettre dans la play list créée et elle apparaît bien dans le contenu de mon Pi (/media/iomega/MULTIMEDIA/musiqueRadio – 2015 12 04 – HCFR.m3u.

C’est sans doute lié au problème d’utilisateur indiqué plus haut… A suivre !

Et maintenant ?

Dans un prochain article de cette même série, , j’expliquerai quelles applications on peut utiliser pour accéder au serveur à partir d’un PC ou d’un appareil mobile présent sur le réseau local. Un autre article expliquera comment ajouter un serveur UPnP à notre Raspberry Pi pour rendre l’utilisation vraiment confortable, voire même accéder à notre musique via internet.

Des colonnes de hauteur égale avec le thème Divi et Flexbox

Des colonnes de hauteur égale avec le thème Divi et Flexbox

Lorsqu’on dispose des contenus en colonnes, on utilise flexbox pour avoir des colonnes de hauteur égale. Sous Divi, on fait la même chose.

Pour l’instant je n’ai pas eu l’occasion d’essayer. Je préfère conserver cet article en mémoire pour une prochaine fois : How to Set Equal Column Heights using Flexbox (article de Divi Space, en anglais).

Et je n’oublie pas l’excellent tutoriel, en anglais également, de CSS-tricks : « A Complete Guide to Flexbox« .

Je mettrai mon article à jour lorsque je réaliserai cette opération avec un thème Divi.

Raspberry Pi : Utilisation de VNC Viewer pour accès graphique d’un PC

Raspberry Pi : Utilisation de VNC Viewer pour accès graphique d’un PC

Cet article date de début 2018. En avril 2020 j’ai écrit un autre article avec une autre solution qui semble mieux adaptée. je vous invite donc à consulter également mon article « Raspberry Pi : accès graphique à distance (VNC)« .

Je connecte mes Raspberry Pi en mode « headless », c’est à dire sans écran, clavier et souris dédiés. Je m’y connecte en SSH à partir de mon PC (Windows). VNC (Virtual Network Computing) permet d’accéder facilement à l’interface graphique du Pi, même à distance. Il permet également d’accéder au Pi en mode cloud, à distance et de manière sécurisée.

Pour ce qui suit, je suis partie de l’article, en anglais, « VNC (Virtual Network Computing) » de www.raspberrypi.org.

Avec Raspbian en mode graphique (pas ‘lite’)

Activer VNC sur le Raspberry Pi (Raspbian Stretch)

En SSH (j’utilise Cygwin, comme je l’explique dans l’article « Mise en service d&rsquo;un Raspberry Pi »), activer VNC par la commande  raspi-config  puis dans l’option « 5 Interfacing Options », choisir « VNC » puis « Yes ». VNC est maintenant activé.

Sur l’ordinateur distant (windows 10)

Télécharger RealVNC Viewer, (pour moi version Windows, je choisis MSI Installers).

Extraire le fichier zip puis choisir l’exécutable correspondant à ma version (64 bits pour mon PC)

Attention il faut choisir « entire feature will be installed on local hard drive” :

Installation de VNC Viewer sous Windows

Ensuite, on clique sur « Next » puis « Install ».

On lance ensuite VNC Viewer sur le PC. On entre l’adresse IP du Pi, le nom d’utilisateur et le mot de passe correspondant. Et voilà, je dispose de l’interface graphique du Pi sur mon PC, comme si mes écran, clavier et souris étaient connectés au Pi directement !

Accès distant à l'interface graphique d'un Raspberry Pi "headless" sous NC Viewer

Ca fonctionne parfaitement !

Avec Raspbian en mode ‘lite’

Le mode ‘lite’ de Raspbian ne contient pas l’interface graphique. C’est la distribution que j’installe le plus souvent car elle est moins gourmande en espace disque et me convient parfaitement puisque je n’ai jamais accédé au Pi par l’interface graphique. Ca changera peut-être maintenant que j’ai découvert VNC Viewer.

J’active VNC de la même manière que précédemment sur le Raspberry Pi.

Là si je démarre VNC Viewer, j’ai un écran mais noir et je n’ai pas accès au terminal. C’est donc sans intérêt apparemment (voir si dessous quand même !).

Que puis-je faire d’autre avec VNC Viewer et un Raspberry Pi ?

Dans la documentation de VNC Viewer sur l’utilisation avec un Raspberry Pi, je lis que l’on peut :

  • avoir un accès graphique à distance, même sur un Pi avec Raspbian ‘lite’ en utilisant le « virtual desktop ».
  • Se connecter à distance par une connexion « cloud ». C’est une manière sécurisée et gratuite d’avoir un accès à distance à notre Pi.

Pour l’instant je n’ai pas besoin d’un accès à distance et Cygwin me convient parfaitement pour l’accès SSH au terminal d’un Pi sans interface graphique.

Je verrai ces nouvelles fonctionnalités plus tard.

Raspberry Pi, quelle version de Raspbian ?

Raspberry Pi, quelle version de Raspbian ?

Il est souvent utile de savoir quelle version de Raspbian on a sur un Pi. Et évidemment, il est prudent de mettre régulièrement le Raspberry Pi à jour pour disposer des dernières mises à jour de sécurité et des dernières fonctionnalités.

Quelle est la version de Raspbian de mon Pi ?

Sur un Raspberry Pi 3 équipé de la dernière version de Stretch (au 7/1/2018), et après un update et upgrade.

La commande uname -a   renvoie :

Linux AlMusicServer 4.9.59-v7+ #1047 SMP Sun Oct 29 12:19:23 GMT 2017 armv7l GNU/Linux

AlMusicServer est le « hostname » du Pi.

La commande cat /etc/os-release renvoie un texte beaucoup plus lisible :

PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

J’utilise Raspbian Stretch.

Mettre mon Pi à jour

apt-get update

Cette commande mettra à jour la liste des paquets de Raspbian. Il faut ensuite les installer, ce qui se fait avec la commande :

apt-get dist-upgrade

Cette commande mettra à jour Raspbian ainsi que le « firmware » du Pi. Par contre, elle n’installera pas de nouveaux paquets créés après la première installation de Raspbian.

apt-get clean

supprime les paquets téléchargés afin de nettoyer l’espace disque. Ils ne sont plus utiles puisqu’ils ont été installés.

Une extension pour afficher des sketch Processing

Une extension pour afficher des sketch Processing

J’essaie ici d’afficher un visuel écrit en processing (fichier .pde) tel quel sur mon site WordPress. J’utilise l’extension ProcessingJS for WordPress

Installer et activer l’extension

Installer et activer l’extension ProcessingJS for WordPress

Sous le nom de l’extension, dans la page des extensions, il y a un lien vers une page « instructions ». C’est là que j’ai copié puis collé les shortcodes à utiliser. Mais c’est la même chose que sur la page de présentation de l’extension.

Essai n°1 : taper le code directement dans le contenu WordPress

Je copie et colle ce qui est proposé par l’auteur de l’extension :

[pjs4wp]
void setup()
{
size(200, 200);
text(« Hello world! », 50, 50);
}
[/pjs4wp]

Et voilà le résultat, moche mais simple !

Essai n°2 : lire un fichier processing (.pde)

Le sketch Processing qui suit est inspiré d’un remake de Pol Guezennec de l’oeuvre #118 de Sol Lewitt.

J’ai un fichier d’essai sollewitt4.pde. Je le renomme sollewitt4.js sans rien changer d’autre que le type de fichier (pde devient js).

Dans la bibliothèque de média, je charge ce fichier puis je note son url (https://knowledge.parcours-performance.com/wp-content/uploads/2017/11/sollewitt4.js).

Ensuite je saisis le shortcode suivant :

[pjs4wp url="/wp-content/uploads/2017/11/sollewitt4.js" bordercolor="#000"][/pjs4wp].

Voici le résultat :

On voit que l’écran ne s’adapte pas à la page (pas responsive) – L’écran fait 1200 px par 800 px comme défini dans le sketch.

Avec un éditeur de texte type notepad++, je modifie donc la taille de l’écran défini dans setup, pour le ramener à 600px par 400 px, je charge le nouveau fichier dans les médias, sollewitt4-600-400.js  et j’utilise le shortcode [pjs4wp url="/wp-content/uploads/2017/11/sollewitt4-600-400.js" bordercolor="#000"][/pjs4wp]

Et voilà !

Les limites de l’extension

L’écran de visualisation du sketch Processing ne paraît pas responsive, en tous cas pas lorsqu’il est défini en « dur », en disant explicitement size(1200, 800);

Si j’essaie en remplaçant la taille de l’écran par fullScreen(); 

Ca ne fonctionne pas du tout…

Donc pour l’instant les limites de cette extension sont :

  • impossible d’utiliser une fenêtre responsive ;
  • pas de possibilité d’avoir des fichiers associés au script.

Mais je suis déjà très contente d’obtenir ce résultat.

Je ferai d’autres essais ultérieurement.

Découverte de Processing

Découverte de Processing

J’ai entendu parler plusieurs fois de Processing, sans trop savoir à quoi ça pouvait me servir ni comment l’utiliser. Et puis je me suis inscrite au cours « Art Numérique » des Beaux Arts de Quimper (site de l’école ou site de partage du cours). Et je m’y met.

Dans ce premier article sur Processing, dans la série , je vais simplement mettre des liens qui m’ont paru intéressants vers d’autres sites qui parlent de Processing.

Que peut-on faire avec Processing ?

Une réalisation d’une ancienne élève du cours Art numérique : ici sur le site du cours.

Le site Beautiful Programming qui présente de très beaux exemples d’art génératif et interactif. J’aime tout particulièrement le « Infinite Arboretum » qui dessine automatiquement un arbre et le modifie selon ce que l’on fait avec la souris ou le clavier :

Un exemple d’arbre généré automatiquement. En cliquant, vous allez sur le site de l’auteur.

 

Un site regroupe de nombreux exemples avec le code : OpenProcessing

Algorithm Ink de Aza Raskin montre une réalisation intéressante et son code (en cliquant sur le bouton edit)

Processing drawings présente des projets visuels et leur code.

Generative Art Links contient des liens vers des projets visuels mais aussi des logiciels utilisables pour de l’art numérique.

La page « processing : Ressources Processing et tutoriels en ligne » contient de nombreux liens vers des sites intéressants.

Le site GuruBlog contient une galerie de sketch Processing.

Le site de Jm Commenge contient des exemples intéressants.

Ce site présente un projet associant Processing et Twitter pour animer du plancton.

Sur CodePen.io on peut voir de nombreuses réalisations utilisant Processing.js et taggée « processing »., ou contenant « p5 » Par exemple cette réalisation de Kultur Design, une animation de polygones SVG :

See the Pen SVG Polygon Animation by Kultur Design (@kulturdesign) on CodePen.

Sur CodePen, Lionel Radisson a réuni une collection liée à Nature of Code (le livre je pense).

J’ai entamé une collection de travaux sur CodePen en lien avec p5.js, visible ici.

Références sur le code Processing

Processing.org est le site de référence pour Processing, et aussi pour p5.js une bibliothèque JavaScript qui lit le code Processing sur un site ou une application web.

The Nature of Code permet d’acheter un livre très intéressant sur Processing et aussi de le lire en ligne.

Contributed Tools, Projects, Demos · processing/p5.js est le Wiki pour p5.js, .

Education · processing/p5.js est un Wiki consacré à l’enseignement de p5.js pour Processing.

Des cours sur Processing sont disponibles sur le site de Electronic Media Studio. Le menu « Lectures » contient plusieurs cours et dans la barre latérale, on trouve de nombreux exemples d’exercices.

Le site Arts Numériques contient de nombreux tutoriels sur Processing.

Processing Quick Start nous parle de Processing.js, une autre bibliothèque JavaScript pour Processing.

Le site du livre Design Génératif : un livre excellent, mais cher. J’ai pu l’emprunter à la bibliothèque de l’école des Beaux Arts de Quimper. On peut télécharger tous les exemples de codes sur le site. Beaucoup sont très très intéressants.

Pour démarrer dans l’utilisation de svg créés avec Inkscape et utilisés dans Processing : how to use svg for rigged 2D-animations in processing.

Un lycée a mis en ligne quelques exemples et exercices lié à des oeuvres d’art.

Un cours en ligne, en anglais, très bien fait pour apprendre rapidement les rudiments de Processing : Le cours CS1335 de Karen Doore

Placer un sketch Processing dans un site WordPress

Embedding p5.js processing sketches in WordPress posts sur le site weegreenblobbie.com

Embedding p5.js · processing/p5.js sur GitHub explique comment on peut visualiser du code  Processing / p5.js sur un navigateur avec iframe dans une page html ou des sites de partage et visualisation de code tels que CodePen ou JSFiddle.

Creative Computation » Embedding a Processing Sketch expose diverses solutions pour placer un sketch Processing dans une page html.

Enfin, deux extensions WordPress paraissent intéressantes pour intégrer du Processing à un site :

Processing.js for WordPress et ProcessingJS for WordPress. Elles sont toutes deux gratuites et ont été mises à jour récemment.

Javascript ou Processing ?

Les bibliothèques javascript citées plus haut (P5.js ou processing.js) permettent de créer des scripts visualisables en ligne. C’est quand même très pratique….

Si on veut apprendre P5.js, un excellent tutoriel en français a été réalisé par B2renger.

Processing et Arduino ou Raspberry Pi

Ce tutoriel, en anglais sur Instructables, explique comment utiliser un Raspberry Pi pour des sketchs Processing.  Adafruit a également fait un tutoriel sur l’utilisation du Pi avec Processing 3.

L’article « Récupérer une valeur analogique Arduino avec Processing » me parait être une bonne base pour démarrer. On peut remplacer les photo-résistances par d’autres capteurs analogiques.

Il y a aussi un manuel Floss spécifique à Arduino et un Chapitre Arduino du Manuel Floss sur Processing.

Pour le Raspberry Pi, on peut lire Introduction to Processing sur le site Raspberry Pi Projects, ou Processing on the Raspberry Pi & PiTFT  sur le site Adafruit Learning System.

Et pour un ensemble Arduino Uno, Raspberry Pi utilisant Processing : Raspberry Pi + Processing + CT UNO (Part 2) , un tutorial de Cytron.

On peut contrôler l’arduino en C++ et simplement le faire communiquer avec Processing ou le contrôler en Processing. Voir les explications de Arduino Playground ou Learn Sparkfun.

Le site Arts Numériques contient  également des tutoriels sur Arduino.

Art et Arduino

Mes projets

Me familiariser avec Processing :

Et je veux également voir comment intégrer ces travaux dans des pages web. J’essaierai donc CodePen, JSFiddle et les deux extensions WordPress ci-dessus.

Ca m’intéresserait aussi de savoir faire les images suivantes, il me semble que Processing est bien adapté pour :

geralt / Pixabay

intographics / Pixabay

 

 

geralt / Pixabay

 

Vous verrez la suite dans les prochains articles de cette série !