Historique: Faire de la MAO sur Raspberry Pi 3
Aperçu de cette version: 29
Réalisation d'un expandeur / boîte à rythme et synthé virtuel avec une Raspberry Pi 3.
Table des matières
Motivation
Ayant une préférence pour les instruments "matériels" comme les séquenceurs MIDI, les synthétiseurs analogique et numérique, etc. Je voulais combler un manque après l'acquisition d'un séquenceur MIDI Kilpatrick Audio Carbon
. En effet, je n'avais aucun synthé à séquencer. Par contre une Raspberry Pi était là, dans un profond sommeil et prenant la poussière.L'idée fut donc de transformer cette Raspberry Pi en véritable expandeur, boîte à rythme et synthétiseur virtuel.
Liste des "ingrédients"
- Une Raspberry Pi 2 ou 3.
- Une carte microSD d'au moins 16Go (système + échantillons) ou une microSD de 8Go et une clé USB.
- Une interface audio USB. Dans cet exemple une Asus Xonar U3 sera employée mais n'importe quelle carte USB compatible Linux/ALSA fera l'affaire.
- Un écran
- Un boîtier. Uniquement pour protéger votre Pi.
- Du temps, de la patience et de la persévérance 😉
Installation de Raspbian
Pour l'installation du système Raspbian
, vous trouverez de nombreux tutos sur Internet.Ensuite, j'ai choisi de passer à la version dite "testing" afin d'avoir des versions plus récentes des applications utilisées. Vous pouvez en faire de même ou en rester là, suivant votre niveau en matière de linuxien.
Si vous êtes courageux, voici les commandes :
Éditez votre fichier /etc/apt/sources.list :
Copy to clipboard
sudo nano /etc/apt/sources.list
Remplacer les mots "stretch" par "testing"
Votre fichier doit ressembler a ceci :
Copy to clipboard
deb http://mirrordirector.raspbian.org/raspbian/ testing main contrib non-free rpi
Sauvegardez vos modifications avec Ctrl+o puis Entrée et quittez nano avec Ctrl+x.
Lancez la mise à jour :
Copy to clipboard
sudo apt-get update && sudo apt-get -y dist-upgrade
Si tout c'est bien passé, redémarrez avec :
Copy to clipboard
sudo reboot
Pour finir, installez l'utilitaire listbugs d'APT. Cette commande permet de savoir si des bugs gênants seront présent lors des mise à jours. Très utile avec une variante dite instable 😉
Copy to clipboard
sudo apt-get install apt-listbugs
Optimisation du système
Pour cette étape, vous pouvez procéder de deux manières. Soit simplement en conservant le noyau par défaut en activant le mode "performance", soit en compilant un noyau temps réel. Cette dernière méthode est celle que j'ai privilégiée mais si vous débutez, ne vous lancez pas dans cette tâche qui reste assez fastidieuse.
Méthode avec le noyau par défaut (recommandée pour les débutants)
Il faut privilégier le gouverneur "performance" pour le processeur. Par défaut il est sur "ondemand" ce qui n'offre pas toujours les meilleurs performances.
Si vous utilisez un clavier, pressez la touche "maj" au démarrage. Sans cette touche, c'est "ondemand" qui est configuré. Avec c'est le mode "performance".
Comme ce n'est pas toujours pratique d'appuyer sur une touche au démarrage ou si vous n'utilisez pas de clavier, il faut commencer par désactiver le service raspi-config qui ne sert qu'à sélectionner les modes "ondemand" ou "performance" :
Copy to clipboard
sudo systemctl disable raspi-config
Ensuite, créez ou éditez votre fichier /etc/rc.local :
Copy to clipboard
sudo nano /etc/rc.local
Ajoutez les lignes suivantes :
Copy to clipboard
for GOVERNOR in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; \ do \ echo "performance" | sudo tee $GOVERNOR; \ done
Enregistrez votre fichier avec Ctrl+o puis Entrée et Ctrl+x pour quitter.
Méthode avec une noyau temps-réel (RT) (déconseillée aux débutants)
Il y a deux possibilités pour compiler un noyau. Soit depuis un PC sous Linux avec un compilateur croisé (cross-compiler), soit directement sur votre Raspberry Pi. Je vais vous expliquer cette seconde méthode.
À partir de là, si vous souhaitez compiler votre noyau temps réel, je vais faire comme si vous étiez déjà familiarisé avec cette tâche (compilation du noyau). N'hésitez pas à me faire savoir si vous aimeriez une méthode plus orientée débutant.
Commencez par récupérer les sources officielles :
Copy to clipboard
git clone -b 'rpi-4.9.y' --depth 1 https://github.com/raspberrypi/linux.git
Comme nous sommes sur une Raspberry Pi 64bit avec un système 32bit, il faut le préciser :
Copy to clipboard
export KERNEL=kernel7
Ensuite indiquez le nombre de cœurs utilisés. Je vous conseille 3 maxi pour des raisons de limitation mémoire :
Copy to clipboard
export CONCURRENCY_LEVEL=3
Par défaut, raspbian prévoit une mémoire d'échange (swap) de 100Mo. Je vous conseille vivement de créer un fichier d'échange sur votre carte microSD ou sur support USB :
Copy to clipboard
sudo fallocate -l 1G /chemin/vers/votre/swapfile sudo chmod 600 /chemin/vers/votre/swapfile sudo mkswap /chemin/vers/votre/swapfile sudo swapon /chemin/vers/votre/swapfile
en cas de redémarrage, vous devrez retaper la dernière ligne pour réactiver votre fichier d'échange
Revenez au noyau et configurez le :
Copy to clipboard
cd linux make bcm2709_defconfig
Téléchargez et appliquez les rustines (patches) pour le temps réel :
Copy to clipboard
wget https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/patch-4.9.76-rt61.patch.xz cd linux xzcat ../patch-4.9.76-rt61.patch.xz | patch -p1
ATTENTION : actuellement, il y a deux fichiers (kernel/hrtimer.c et kernel/workqueue.c) où le patch n'est pas totalement appliqué. Vous devez corriger manuellement en vous aidant des fichiers (kernel/hrtimer.c.rej et kernel/workqueue.c.rej) sous peine d'avoir une Raspberry Pi qui refuse de démarrer.
Il y a quelques bogues spécifiques aux Raspberry Pi. Heureusement une rustine existe :
Copy to clipboard
cd .. wget https://raw.githubusercontent.com/fedberry/kernel/master/usb-dwc_otg-fix-system-lockup-when-interrupts-are-threaded.patch cd linux patch -i ../usb-dwc_otg-fix-system-lockup-when-interrupts-are-threaded.patch -p1
Maintenant, il est temps de configurer ce noyau pour obtenir le temps réel :
Copy to clipboard
make menuconfig Allez dans "Kernel Features" puis "Preemption Model" et sélectionnez "Fully Preemptible Kernel (RT)". Maintenant choisissez "Exit" deux fois de suite.
Vous pouvez aussi configurer votre noyau comme il vous plaît
Allez, c'est parti. Croisez les doigts et armez vous de patience, c'est assez long 😉 :
Copy to clipboard
make clean ./scripts/config --disable DEBUG_INFO make -j3 deb-pkg
Si tout va bien, vous devez avoir plusieurs fichiers .deb prêts à l'emploi. Ils sont placés dans le répertoire précédent "linux" (cd ..). Installez les avec "dpkg -i nom_du_fichier.deb".
Enfin, vous devez configurer le fichier /boot/config.txt afin que votre RPI démarre avec ce noyau temps réel.
Ajoutez une ligne avec votre éditeur favori :
Copy to clipboard
kernel=vmlinuz-4.9.79-rt61-v7+ (vérifiez le nom car il peut être différent)
Vous devriez aussi avoir besoin d'ajouter l'option "irqpoll" dans votre fichier /boot/cmdline.txt si LightDM ne se lance pas (avec d'autres erreurs en prime).
Copy to clipboard
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=9d1bede3-02 rootfstype=ext4 elevator=deadline fsck.repair=yes irqpoll rootwait
Si vous souhaitez plus de détails sur cette étape, consultez le blog Blog d'autostatic
.À l'avenir, je proposerai un paquet deb avec un noyau RT
Redémarrez, croisez les doigts, et admirez votre rpi avec noyau temps réel 😊
Mise en place de l'écran
Là, tout dépend de votre écran. Il n'y a malheureusement pas une seule méthode mais plutôt une méthode par écran.
Dans un premier temps, je vous conseille vivement un écran HDMI. D'ailleurs rien n'oblige à prendre un écran spécifique tactile ou non.
Dans le cas du HyperPixel de Pimoroni, veuillez suivre la procédure suivante dans votre terminal :
Copy to clipboard
curl https://get.pimoroni.com/hyperpixel | bash
Au prochain redémarrage, votre écran HyperPixel sera actif.
Installation des applications MAO
D'abord, je tiens à signaler que cette phase est celle qui m'a pris le plus de temps. Trouver le meilleur compromis facilité/performance/fiabilité/légèreté.
Jack
En premier lieu, il vous faut installer et configurer jackd. Ce qui sera fait automatiquement en installant QJackCtl :
Copy to clipboard
sudo apt-get install qjackctl
J'ai choisi QJackCtl après avoir essayé ses concurrents. QJackCtl a l'avantage de la légèreté sur Raspberry Pi. Il est aussi plus stable.
Lancez QJackCtl et configurez jack. Pour cela, vous pouvez suivre les différents conseils des pages liées à QjackCtl.
Non Mixer
Non-Mixer n'est malheureusement pas dans les dépôts. Vous allez devoir le compiler vous même. Rien de bien difficile si vous suivez les étapes à la lettre.
Hydrogen
Avec Hydrogen, un peu de simplicité, ça fait du bien :
Copy to clipboard
sudo apt-get install hydrogen
ZynAddSubFX
ZynAddSubFX est dans les dépôts raspbian. Bonne nouvelle 😊 Mais la v3 n'est disponible que dans la version Raspbian Testing. Si vous êtes restés sur la version stable, vous aurez une version 2.x. Dans tous les cas, l'utilisation reste identique. La nouvelle interface Fusion n'étant pas encore disponible pour ARM.
Copy to clipboard
sudo apt-get install zynaddsubfx
[+]