Un jukebox à partir d'un Raspberry Pi

Ça y est ! Enfin un tutoriel Raspberry Pi. Depuis le temps qu'on m'en demande, vous êtes servi.

Le Raspberry Pi (et les autres ordinateurs monocartes de la même farine) est remarquable du fait de la multitude d'usages qu'on peut lui attribuer. On le vois dans tous les domaines, Domotique, informatique embarquée, serveur écologique, ordinateur de bureau low-cost, Internet des objets, montage électronique, cluster de calcul réparti, pour ne citer que ces exemples. Cet article va se concentrer sur l'aspect média-center du Raspberry Pi et plus précisément la lecture de bibliothèque musicale.

Dans un premier temps, je vais vous expliquer comment vous monter un serveur MPD de base, chose que vous pourrez en grande partie trouver en quelques clics sur n'importe quel moteur de recherche. La deuxième partie présentera une manière très amusante de contrôler votre serveur de musique via un écran LCD, un projet en python qui a occupé mes soirées depuis ce dimanche (panne d'internet, vous comprenez) et dont je suis par conséquent assez fier, parce qu'il marche d'une part, et qu'en plus vous pouvez épater la galerie lorsque vous invitez des amis à l'heure de l'apéro et que vous voulez mettre un fond sonore.

Le serveur MPD

Si vous fréquentez des milieux barbus parlant entre autres d'usage de Linux au quotidien, de lecteurs multimédia, qui lancent des guerres sanglantes ayant pour motif par exemple le meilleur environnement graphique, qu'un environnement graphique en fait c'est pourri, que Arch Linux c'est bien mieux que Gentoo, bref, de tout ce qui relève de l'UNIX porn, vous avez très certainement déjà entendu parler de MPD (Music Player Daemon). Il s'agit d'une référence dans le domaine des lecteurs de bibliothèques musicales du type client-serveur (vous avez une machine qui lis la musique, et vous pouvez vous connecter dessus avec un client pour la contrôler).

Ce qui fait la force de MPD, c'est sa légèreté (un Raspberry Pi peut l'exécuter sans trembler des genoux) ainsi que la flexibilité de sa configuration vis-à-vis des sorties audio, mais également et surtout la grande diversité des programmes clients, reflétant une communauté considérable, ce qui en fait en quelques sortes un standard de la lecture musicale sur UNIX.

Nous partirons du principe que vous disposez d'un Raspberry Pi (même la première génération convient), et que vous avez installé une distribution dessus (par exemple Raspbian). Il est également conseillé de disposer d'un DAC (Digital to Analog Converter) externe, la carte son intégrée su RPi étant médiocre pour rester poli. Le DAC, pour faire court, est l'élément qui convertit le flux numérique audio en signal électrique analogique que vous pouvez brancher sur un ampli. Par exemple, la carte son de n'importe quel PC est un DAC. Je vous conseille également d'utiliser un DAC USB et non un DAC branché sur GPIO, sachant qu'ils est appréciable de pouvoir utiliser le GPIO pour autre chose (par exemple la deuxième partie du tutoriel...). Si vous cherchez une bonne affaire mais que vous pouvez quand même y mettre un certain prix, je vous conseille le Cambridge DacMagic 100, qui est d'excellente qualité, qui fonctionne sur le RPi avec une configuration de base et que j'utilise moi-même en étant satisfait.

Niveau installation, il vous suffit d'installer MPD, présent sur la très grande majorité des distributions. Chose à noter, si vous avez des morceaux au format ALAC dans votre bibliothèque, vous devres en plus installer les plugins gstreamer adaptés. Sur Raspbian, il s'agit du paquet gstreamer1.0-plugins-bad. Puis vous êtes bon pour le décollage.

Il est important d'ajouter le support de votre bibliothèque musicale dans le fichier /etc/fstab du RPi, cela permettra bien entendu de monter votre disque dur USB ou votre volume NFS dès le démarrage de l'appareil. Dans le cas d'un partage NFS, vous pouvez par exemple écrire :

192.168.0.5:/chemin/vers/dossier/musique    /data   nfs    rsize=8192,wsize=8192,timeo=14,intr

En remplaçant bien sûr l'IP de votre serveur NFS et le chemin du dossier musique sur ce serveur.

Ensuite vous aurez besoin de configurer MPD. Direction le fichier /etc/mpd.conf pour dans un premier temps dire au lecteur où se trouve votre musique.

music_directory "/mnt"

Le fichier de configuration de MPD est assez bien documenté via le texte commenté. Ainsi vous pourrez personnaliser l'emplacement de vos futures playlists et de la base de donnée par exemple si ça vous chante.

Partie également importante de ce fichier, la configuration des sorties audio. Si vous n'utilisez pas de DAC externe, vous pouvez laisser sans toucher. Si vous avec un DAC externe supportant de bonnes fréquences d'échantillonnage et que vous avez de la musique haute qualité, il sera intéressant d'y faire figurer :

audio_output {
    type                "alsa"
    name                "My ALSA Device"
    device              "hw:CARD=C1,DEV=0"
    mixer_type          "none"
    auto_channels       "no"
    auto_format         "no"
    auto_resample       "no"
}

Le nom de la carte correspond pour le Cambridge DacMagic 100. Pour trouver le nom de votre DAC, vous pouvez par exemple faire usage de la commande aplay -L, qui vous listera l'ensemble des périphériques audio et leurs caractéristiques.

Cette configuration impose à MPD de laisser le flux intouché (pas de traitement a posteriori) et de laisser le DAC révéler son potentiel en traitant du son à des fréquences échantillonnages élevées.

Normalement c'est tout bon, vous pouvez démarrer ou redémarre MPD et initialiser la base de donnée. Pour ça,  vous allez avoir besoin d'un client, à installer sur les machines qui contrôleront le serveur. Par exemple sonata si vous voulez une interface graphique, ou l'excellent ncmpcpp si vous voulez du joli ncurses dans votre console. Astuce : il est pratique d'utiliser directement sur le RPi un client en ligle de commande minimaliste mpc, qui vous permettra rapidement de faires certaines actions, par exemple mettre la musique en pause parce que le voisin vous attend à votre porte avec une batte de baseball (mpc pause) ou bien mettre à jour la base de donnée (mpc update). Attention, la création de la base de donnée peut être très longue en fonction de la taille de votre bibliothèque. Pendant cette période, le CPU du RPi sera très solicité. Du coup vous saurez vite quand il aura fini...

L'utilisation de MPD se base sur une liste de lecture centrale, dans laquelle vous ajoutez les morceaux dans l'ordre souhaité de lecture. Pour alimenter cette liste, vous aurez besoin de piocher dans la banque de musique qui a été créée par MPD. Je reste volontairement vague à ce sujet car la présentation de ces concepts varie en fonction du client utilisé.

Il est également très amusant de contrôler son serveur via une interface web. Si vous désirez le faire, je vous conseille vivement de jeter un œil à ympd, une interface web propre et très légère, et dont il existe une version pour RPi justement.

Bon, vous l'aurez compris, toute cette première partie n'était qu'un prétexte pour vous présenter le fruit de mon temps libre, mon projet du mois.

Utiliser un écran LCD

Il y a quelques années, je cherchais un écran LCD à contrôler par le RPi. J'ai craqué pour le Display-O-Tron 3000, qui dispose d'un rétroéclairage sous stéroïdes et multicolore, d'une série de diodes lumineuses supplémentaires à contrôler et d'un joystick de contrôle. Tout est contrôlable et personnalisable, et le fabriquant a développé une bibliothèque très facile d'usage, utilisable en Python, en C/C++ et en NodeJS. J'avais eu l'idée d'en faire un panneau de contrôle MPD mais je n'avais jamais pris le temps de le coder. C'est maintenant chose faite.

Ce programme en python donc permet d'afficher les informations de la musique en cours sur MPD, avec les fonctionnalités suivantes :

  • Affichage du titre, de l'artiste et de l'album
  • Défilement du texte quand celui ci est trop long pour tenir sur une ligne
  • Changemment de la couleur du rétroéclairage en fonction de l'état du lecteur
  • Contrôle du lecteur grâce au joystick
  • Killer feature : affichage en temps réel de la puissance sonore via les diodes supplémentaires.

Mieux que des paroles, voici une vidéo de démonstration

Je vous invite à allez voir mon code commenté en détail (en anglais).

Pour le mettre en application, il vous suffira d'installer la bibliothèque Python (voir le lien vers la page Github du fabricant) ainsi que la bibliothèque python-mpd2 utilisée pour contrôler MPD.

Si vous trouvez des fonctionnalités à ajouter ou des améliorations possibles, n'hésitez pas à me le faire savoir, je serais heureux de prendre toutes les remarques en considération.