1. Introduction

Mes camarades et moi jouons assez souvent au jeu du blindest, qui consiste à écouter des extraits de musiques et essayer de deviner de quel morceau est tiré l’extrait et d’en deviner un maximum au cours de la partie afin d’avoir le plus de points. Cependant, nous avons souvent remarqué que les réponses peuvent vite devenir confuses étant donné que tout le monde crie sa réponse en même temps et on ne sait pas clairement à qui attribuer les points. Et, de plus, nous perdons du temps d’écoute sur l’extrait si les gens proposent leurs solutions sans ordre de parole clair. De plus, il serait pratique de faire un système qui comptabilise automatiquement les points à la fin de chaque round et annonce le total des points de chaque joueur lorsque la partie se termine. Un autre avantage de ce système est qu'il permettrait d'avoir des parties plus uniformes avec à chaque fois le même nombre de rounds et d'avoir un même temps d'écoute pour tout les morceaux. Ce système est aussi plus intéressant que les vidéos blindtest standards que l'on trouve sur YouTube car il permet d'avoir une infinité de combinaisons différentes en créant à chaque fois des playlists aléatoires et donc de n'être jamais limité par la quantité de vidéo dont on dispose, puisqu'il suffit de télécharger de nouveaux morceaux si on a utilisé tout ceux dont on dispose.

2. Matériel et méthodes

2.1 Matériel:

Le matériel nécessaire est le suivant: - 1 Raspberry Pi avec au moins la version 3.5 de python - 3 Breadboards - 1 Pi Wedge à 40 pins - 20 fils connecteurs - 4 interrupteurs - 4 LED (si possible de couleurs différentes) - 4 résistances de 33Ω

2.2 Méthode

La réalisation de ce projet repose principalement sur l'exploitation de la librairie gpiozero, en particulier le module Button qui permet de détecter la pression d'un interrupteur en le connectant au pins du Wedge. Les boutons sont reliés au pin qui leur est attribué dans le code puis sont connectés à ground afin de faire varier la tension dans le pin lors de la pression et ainsi pouvoir détecter dans quel état se trouve l'interrupteur (appuyé ou relâché). Ainsi, en fonction de la tension dans le pin le système détermine si le bouton est pressé et réagit en conséquence. Pour faire flasher la LED correspondant au joueur il faut la connecter en circuit fermé avec une résistance, un pin que l'on met en mode output et dont on fera varier la tension en fonction de la pression ou non du bouton, et enfin au pin Ground afin d'avoir une différence de tension pour pouvoir allumer la LED. Lorsque le bouton est pressé, on passe l'output du pin connecté à la LED en mode 'High' afin de pouvoir allumer cette dernière. Puis on repasse le pin en mode 'Low' quand le temps de parole imparti se termine. Le projet consiste, ensuite, à déclencher, lorsqu'un bouton est pressé, différents événements en fonction du temps qui s'est écoulé depuis le début du round. Cela est fait en utilisant des boucles 'while' couplées à la fonction time.time(), qui nous donne le temps en secondes écoulé depuis le premier janvier 1970, afin de mesurer des intervalles de temps et ainsi déclencher les éventements au moments voulus (p.ex interrompre la chanson après x secondes). L'utilisation de la boucle while combinée à time.time() permet de mesurer le temps et passer d'une phase du jeu à une autre (p.ex de la phase d'écoute à la phase de comptage des points), tout en ne bloquant pas le signal des buzzers, ce que ne permet pas de faire la fonction time.sleep() puisqu'elle est bloquante. De plus, afin d'éviter des appuis de boutons parasites de la part des autres joueurs, le système est programmé pour bloquer les signaux des autres buzzers lorsqu'un de ceux-ci a été appuyé. Cela afin de laisser la liberté au joueur de s'exprimer et de définir qui a droit à la parole, avec cependant, bien sûr, une limite de temps impartie pour donner sa réponse. Pour créer des playlists uniques à chaque partie on utilise la fonction glob.glob(), qui est capable de sélectionner l'ensemble des fichiers d'un certain format (p.ex mp3) et crée une liste avec ces fichiers. Ensuite la liste qui a été crée est passée dans la fonction random.shuffle() qui mélange tout les éléments de la playlist dans un ordre aléatoire. Puis, ensuite, grâce a la fonction subprocess.Popen() on dit à omxplayer de lancer le i-ième élement de la playlist (avec i le nombre du round). De plus, afin de pouvoir donner exactement le même temps d'écoute pour chaque morceau le programme prend en compte le nombre de fois qu'un bouton a été appuyé, et ainsi détermine le temps d'écoute qui a été perdu afin de faire durer la boucle plus longtemps.

Ci-dessous, deux images du projet final afin de vous donner une idée plus claire de ce à quoi il ressemble:

Le rôle des pins est le suivant:

Pin 4: Relié au bouton 1, permet de détecter la pression de celui-ci en fonction de la tension

Pin 5: Relié au bouton 2, permet de détecter la pression de celui-ci en fonction de la tension

Pin 6: Relié au bouton 3, permet de détecter la pression de celui-ci en fonction de la tension

Pin 12: Relié au bouton 4, permet de détecter la pression de celui-ci en fonction de la tension

Pin 21: Allume la LED du joueur 1 en passant l'output du pin en mode élevé (High) si le bouton 1 est pressé

Pin 22: Allume la LED du joueur 2 en passant l'output du pin en mode élevé (High) si le bouton 2 est pressé

Pin 23: Allume la LED du joueur 3 en passant l'output du pin en mode élevé (High) si le bouton 3 est pressé

Pin 24: Allume la LED du joueur 4 en passant l'output du pin en mode élevé (High) si le bouton 4 est pressé

3. Résultats

Le résultat final permet de jouer à ce jeu avec un nombre de rounds déterminés, un temps d'écoute de chaque extrait déterminé et permet aussi, si on le souhaite, de relancer le jeu à l'infini à chaque fois qu'une partie se termine. Il peut, de plus, avertir l'utilisateur si celui-ci n'a pas téléchargé assez de morceaux pour pouvoir jouer. Une des limites du programme est qu'il peut risquer de sélectionner des fichiers audios 'parasites', c'est à dire, des fichiers que l'utilisateur ne souhaiterait pas intégrer au jeu mais qui se trouvent dans Downloads. Je n'ai pas crée une directory spécifique à ce jeu dans laquelle mettre les morceaux pour éviter que l'utilisateur doivent déplacer tout les fichiers audios puisque le jeu peut être utilisé tel qu'il est, sans devoir passer par cette étape supplémentaire. Mais, si besoin, cela peut être facilement fait directement par l'utilisateur donc j'ai décidé de laisser le jeu tel qu'il est. Le système est cependant doté d'une faille majeure qui est le fait que le jeu plante totalement si un fichier audio dure moins longtemps que le temps d'écoute imparti à cause de la l'input généré par la fonction pyautogui, qui va bloquer le prochain morceau à l'instant même où il vient d'être lancé.

4. Discussion

Le résultat semble assez proche des attentes initiales et il est modulable assez facilement en fonction de nos envie et nos besoins. Quand au point des limites du jeu lorsqu'il s'agit de trouver les fichiers audios, ou au contraire d'en écarter certains que le joueur ne veut pas, on pourrait, comme dit précédemment, facilement y remédier en créant, si besoin, une directory dédiée au jeu et en ne changeant que quelques lignes du code source du jeu. Une autre limite pourrait être l'interface graphique peu soignée du jeu, puisque le programme du jeu utilise un affichage encore assez rudimentaire. Le résultat final reste, cependant, intéressant car le code est efficace, bien que l'objet en soit est peu esthétique et peut-être même peu pratique. Cependant puisque le code est fonctionnel et efficace la plus grosse partie du travail est faite, il ne faudrait plus que changer des éléments d'ordre esthétiques, qui ne prennent que peu de temps, afin de rendre le jeu le plus optimal possible. Un autre aspect positif est que le joueur a la liberté de créer des parties qu'avec un certain nombre de morceau qu'il sélectionne à sa guise, car il lui suffit de créer un nouveau répertoire ou il mettra les morceau souhaités et changer deux lignes du codes pour avoir une partie totalement personnalisée selon ses envies.

5. Conclusion

En conclusion, je pense que ce programme peut apporter quelque chose de nouveau à ce jeu et changer la manière dont nous jouons. Il permet en effet d'avoir une infinité de partie toutes unique, ce qui ne serait pas le cas si nous jouons autrement car il y a un nombre fini de playlist qui ont été crées. De plus, il permet d'avoir un jeu plus fluide et mieux organisé pour en tirer un maximum de divertissement, sans même avoir besoin de compter nos points. A titre personnel, je pense donc que cet objet et ce programme sont utiles et que je pourrais réellement envisager de les utiliser lors de futurs parties de Blindtest avec des amis. Ils amènent une infinité de possibilité nouvelle pour ce et, potentiellement, beaucoup de divertissement puisque l'on peut changer le programme facilement pour qu'il satisfasse nos besoin et envies.

Références

https://gpiozero.readthedocs.io/en/stable/api_input.html#gpiozero.Button.value https://pytutorial.com/pyautogui-keyboard-keys https://www.programiz.com/python-programming/time#:~:text=Python%20time.time%20%28%29%20The%20time%20%28%29%20function%20returns,%3D%20time.time%20%28%29%20print%28%22Seconds%20since%20epoch%20%3D%22%2C%20seconds%29 https://docs.python.org/3/library/subprocess.html https://docs.python.org/3/library/glob.html https://www.w3schools.com/python/ref_random_shuffle.asp https://stackoverflow.com/questions/14907067/how-do-i-restart-a-program-based-on-user-input