Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
openatelier:projet:sampler_puredata_pour_raspberry_pi_sans_ecran [2025/08/29 14:52] cyril |
openatelier:projet:sampler_puredata_pour_raspberry_pi_sans_ecran [2025/09/02 12:45] (Version actuelle) cyril [En Python avec des boutons physiques de récupération] |
||
---|---|---|---|
Ligne 90: | Ligne 90: | ||
while True: #initialise une boucle "while" (conditionnelle) | while True: #initialise une boucle "while" (conditionnelle) | ||
- | ChasetheDevil.when_pressed = chase #lorsque le boutton auquel est assigné ChasetheDevil est pressé, cela lance la fonction "c> | + | ChasetheDevil.when_pressed = chase #lorsque le bouton auquel est assigné ChasetheDevil est pressé, cela lance la fonction "c> |
- | President.when_pressed = pres #lorsque le boutton auquel est assigné President est pressé, cela lance la fonction "pres" | + | President.when_pressed = pres #lorsque le bouton auquel est assigné President est pressé, cela lance la fonction "pres" |
pause() #mets le script en pause, il attend donc une nouvelle instruction en permanence | pause() #mets le script en pause, il attend donc une nouvelle instruction en permanence | ||
</code> | </code> | ||
+ | |||
+ | Puisque notre sortie sera en mono, nous pouvons avoir cette ligne configuration dans le script python: | ||
+ | |||
+ | <code python>mixer.pre_init(44100,-16, 1, 127) | ||
+ | mixer.init() </code> | ||
+ | Où les paramètres sont (fréquence d’échantillonnage, la taille, le nombre de canaux de sortie, la taille du buffer). Dans notre cas, on place la fréquence d’échantillonnage à 44100 Hz, ce qui est de qualité CD, on demande un seul canal de sortie, ce qui fera moins de calculs, un a une taille de buffer assez petite, le tout fait que la latence est assez réduite et permette de pouvoir éventuellement jouer avec les samples. | ||
+ | |||
+ | Notre nouveau script Python est donc le suivant: | ||
+ | |||
+ | <code python> | ||
+ | #Always comment your code like a violent psychopath will be maintaining it and they know where you live ;) | ||
+ | |||
+ | from pygame import mixer #importe la classe Mixer depuis le module "pygame" pour gérer les fichiers son | ||
+ | from gpiozero import Button #importe que l'élément "Button"depuis la bibliothèque GPIOzero | ||
+ | |||
+ | RadioVaxmonedeu = Button(5) | ||
+ | RadioWaxmonde01 = Button(7) | ||
+ | Waxmonde10 = Button(13) #désigne la broche GPIO 13, l'active et lui donne un nom | ||
+ | WaxmondeRalenti = Button(15) #désigne la broche GPIO 21, l'active et lui donne un nom | ||
+ | |||
+ | mixer.pre_init(44100,-16, 1, 127) | ||
+ | mixer.init() #créé une instance de la classe "mixer" de la bibliothèque "Pygame" | ||
+ | |||
+ | def radiovaxmonedeu(): #déclare une fonction pour gérer l'arrêt du morceau en cours, son volu> | ||
+ | mixer.music.stop() #stoppe le fichier actuellement en lecture | ||
+ | mixer.music.set_volume(1.0) #règle le volume | ||
+ | mixer.music.load('/home/waxmonde/samples/radio_vaxmonedeu_01.wav') #charge le fichier son en indiquant le chemin entier pour pouvoir démar> | ||
+ | mixer.music.play() | ||
+ | |||
+ | def radiowaxmonde01(): #déclare une fonction pour gérer l'arrêt du morceau en cours, son volu> | ||
+ | mixer.music.stop() #stoppe le fichier actuellement en lecture | ||
+ | mixer.music.set_volume(1.0) #règle le volume | ||
+ | mixer.music.load('/home/waxmonde/samples/radio_waxmonde_01.wav') #charge le fichier son en indiquant le chemin entier pour pouvoir démarre> | ||
+ | mixer.music.play() #répare ta gazinière | ||
+ | | ||
+ | |||
+ | def waxmonde10(): #déclare une fonction pour gérer l'arrêt du morceau en cours, son volume, so> | ||
+ | mixer.music.stop() #stoppe le fichier actuellement en lecture | ||
+ | mixer.music.set_volume(1.0) #règle le volume | ||
+ | mixer.music.load('/home/waxmonde/samples/waxmonde_10.wav') #charge le fichier son en indiquant le chemin entier pour pouvoir démarrer le script depuis > | ||
+ | mixer.music.play() #trouve les bons numéros du loto de hier | ||
+ | |||
+ | def waxmonderalenti(): #déclare une fonction pour gérer l'arrêt du morceau en cours, son volu> | ||
+ | mixer.music.stop() #stoppe le fichier actuellement en lecture | ||
+ | mixer.music.set_volume(1.0) #règle le volume | ||
+ | mixer.music.load('/home/waxmonde/samples/waxmonde_ralenti.wav') #charge le fichier son en indiquant le chemin entier pour pouvoir démarrer> | ||
+ | mixer.music.play() #répare ta gazinière | ||
+ | | ||
+ | |||
+ | while True: #initialise une boucle "while" (conditionnelle) | ||
+ | RadioVaxmonedeu.when_pressed = radiovaxmonedeu #lorsque le boutton auquel est assigné ChasetheDevil est pressé, cela> | ||
+ | RadioWaxmonde01.when_pressed = radiowaxmonde01 #lorsque le boutton auquel est assigné President est pressé, cela> | ||
+ | Waxmonde10.when_pressed = waxmonde10 | ||
+ | WaxmondeRalenti.when_pressed = waxmonderalenti | ||
+ | |||
+ | pause()</code> | ||
+ | |||
+ | |||
+ | Il y a certainement possibilité de simplifier le script avec un système de dictionnaire ou autre. | ||
Prochaine étape: faire en sorte que ce script se lance automatiquement au démarrage du Raspberry Pi! | Prochaine étape: faire en sorte que ce script se lance automatiquement au démarrage du Raspberry Pi! | ||
Ligne 217: | Ligne 276: | ||
On est content.e et on va fêter ça dans un endroit sympa comme son jardin puisqu'on a du linge à étendre!!! | On est content.e et on va fêter ça dans un endroit sympa comme son jardin puisqu'on a du linge à étendre!!! | ||
+ | |||
+ | ====Ajout d'une carte Audio Amp Shim ==== | ||
+ | |||
+ | Le projet va maintenant s'installer dans une radio dont le haut-parleur est sous 4 Ohms pour une puissance de 2W. | ||
+ | Il y a une carte qui correspond à ces paramètres at qui s'appelle la Audio Amp Shim, de chez Pimoroni. Elle prend peu de place, communique en i2s et sert d'amplificateur de bonne qualité. | ||
+ | Il est à noter que le i2s a besoin de 3 broche GPIO pour fonctionner. Voici la documentation à ce sujet: [[https://pinout.xyz/pinout/audio_amp_shim|Pin Out Audio Amp Shim]] | ||
+ | |||
+ | Ce sont donc des ports que nous ne pourrons pas utiliser pour d'autres fonctionnalités, comme des boutons par exemple. | ||
+ | |||
+ | Il faudra aussi brider le volume de sortie, puisque la puissance admissible par le haut-parleur est inférieure à la puissance maximale délivrable par l'amplificateur de la carte. | ||
+ | |||
+ | ===Nouvelle configuration de Alsa=== | ||
+ | Puisque nous n'utilisons plus la sortie casque pour alimenter le haut-parleur, il faut retourner dans le fichier de configuration de alsa. Avant cela, il faut se souvenir que cela n'est pas seulement une marque de levure chimique mais bien un gestionnaire de cartes son. Il y a pas mal de documentation à ce sujet ici: [[https://www.alsa-project.org/wiki/Main_Page|Site du porjet Alsa]] et ici: [[https://www.alsa-project.org/wiki/Asoundrc|Alsasoundrc]] qui explique comment fonctionne le fichier de configuration de Alsa. Très intéressant! | ||
+ | |||
+ | Nous allons donc voir dans un premier temps comment s'appelle pour Alsa notre carte son. | ||
+ | <code>aplay -l</code> | ||
+ | Nous retourne ceci: | ||
+ | |||
+ | <code>**** List of PLAYBACK Hardware Devices **** | ||
+ | card 0: sndrpihifiberry [snd_rpi_hifiberry_dac], device 0: HifiBerry DAC HiFi pcm5102a-hifi-0 [HifiBerry DAC HiFi pcm5102a-hifi-0] | ||
+ | Subdevices: 0/1 | ||
+ | Subdevice #0: subdevice #0 | ||
+ | </code> | ||
+ | |||
+ | Il n'y a que cela, donc notre carte son va s'appeler 0:0. | ||
+ | Nous modifions donc le fichier etc/asound.conf | ||
+ | |||
+ | <code>sudo nano etc/asound.conf</code> | ||
+ | |||
+ | <code>pcm.!default { | ||
+ | type asym | ||
+ | playback.pcm { | ||
+ | type plug | ||
+ | slave.pcm "hw:0,0" | ||
+ | } | ||
+ | }</code> | ||
+ | |||
+ | Il n'y aura eu qu'à changer "hw:1,0" par: "hw:0,0" et c'est tout! Et on sauvegarde le fichier, comme de bien entendu. | ||
+ | |||
+ | On reboot le raspberry pi pour que la modification du fichier soit prise en compte et cela fonctionne. On s'habitue doucement au succès... | ||
+ |