Journal Batterie et Rock'n'Roll, goret style

Posté par  . Licence CC By‑SA.
22
8
jan.
2018

TilK avait publié 2 excellents journaux racontant comment il avait transformé une « batterie » pour Rock Band (un jeu video) en batterie MIDI :

https://linuxfr.org/users/tilk/journaux/orange-batterie-et-rock-and-roll
https://linuxfr.org/users/tilk/journaux/orange-batterie-et-rock-and-roll-partie-2

Il se trouve que j'ai la même batterie dans ma cave, et que le marmot l'a repérée ce soir… il a bien sûr fallu remonter l'engin et le transformer en simili batterie Playskool.

Pour référence, lsusb indique :
Bus 002 Device 009: ID 12ba:0210 Licensed by Sony Computer Entertainment America Harmonix Drum Kit for PlayStation(R)3
Ça se comporte comme un joystick de Playstation.

Là où Tilk a fait un travail propre, réfléchi, et élégant (matériel dédié, intégration avec alsa, possibles évolution), j'ai plutôt pondu dans l'urgence un code parfaitement goret, constitué essentiellement de copiés/collés de trucs piqués ça et là sur github ou stackexchange (ne niez pas, vous aussi vous faîtes ça parfois !), qui a néanmoins le mérite de satisfaire un enfant de 3 ans et demi.

Je vous laisse trouver des samples par vous même si vous voulez essayer. Le seul point technique intéressant est l'initialisation du mixer de pygame en deux temps qui permet de ne pas avoir de latence… et je suis bien incapable de vous expliquer pourquoi. Je vous avais prévenu, c'est goret style :p

#!/usr/bin/env python
# -*- coding: utf8 

import sys
import pygame
from pygame.locals import *

# mixer
def init_mixer():
    #pygame.mixer.init() -> latence importante
    # pre_init/init/quit/init -> latence très faible...
    pygame.mixer.pre_init(22050, -16, 2, 1024)
    pygame.mixer.init()
    pygame.mixer.quit()
    pygame.mixer.init(22050, -16, 2, 1024)

# joystick
def init_joystick():
    pygame.joystick.init()
    joystick_count = pygame.joystick.get_count()
    if joystick_count == 0:
        print("No joystick detected")
        return False
    pygame.joystick.Joystick(0).init()
    return True

def quit(code=0):
    pygame.quit()
    sys.exit(code)

# start here
pygame.init()
pygame.display.init()

w,h=320,200
r,g,b=0,0,0

background = (r,g,b)
screen = pygame.display.set_mode((w,h))
screen.fill((background))
pygame.display.flip()

if not init_joystick(): quit(1)
init_mixer()

sample = {
    2 : pygame.mixer.Sound('Ensoniq-ESQ-1-Hi-Synth-Tom.wav'),   # rouge
    3 : pygame.mixer.Sound('Ensoniq-SQ-1-Ride-Cymbal.wav'),     # jaune
    0 : pygame.mixer.Sound('Hi-Bongo.wav'),                     # bleu
    1 : pygame.mixer.Sound('High-Conga-1.wav'),                 # vert
    4 : pygame.mixer.Sound('Closed-Hi-Hat-7.wav'),              # pédale
    #4 : pygame.mixer.Sound('Bass-Drum-1.wav'),
}

done = False
while not done: 
    for event in pygame.event.get():
        if event.type == pygame.JOYBUTTONDOWN:
            print event.button
            try:
                sample[event.button].play()
            except Exception as ex:
                pass
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                done = True
        elif event.type == pygame.QUIT:
            done = True
        elif event.type == pygame.JOYHATMOTION:
            (x,y) = event.value # au cas où ça soit utile un jour
            print event.hat, x, y
quit()
  • # Rock and roll all night

    Posté par  . Évalué à 4.

    Le premier journal était déjà très intéressant, merci pour cette relance qui l'est tout autant ! Je serais curieux de voir la latence en action en vidéo.

    l'initialisation du mixer de pygame en deux temps

    Oui c'est une façon de le dire :D

    • [^] # Re: Rock and roll all night

      Posté par  . Évalué à 3.

      C'est ici :

      https://youtu.be/wJVjR-4LBxo

      Il y a toujours de la latence… mais il me semble qu'elle est moins importante pour le pad vert. Est-ce subjectif ou lié au sample associé ? Mystère.

      La gent féminine, pas la "gente", pas de "e" ! La gent féminine ! Et ça se prononce comme "gens". Pas "jante".

      • [^] # Re: Rock and roll all night

        Posté par  . Évalué à 6.

        Ah oui, ici aussi, la latence est très importante. Je trouve le bricolage sympathique : c'est toujours un peu triste qu'un machin si élaboré finisse comme un vulgaire bout de plastique. Je me demande cependant si il ne serait pas plus judicieux, dans une optique autant ludique que pédagogique, de fabriquer avec l'enfant une batterie à partir d'objets récupérés plutôt qu'un truc qui demande une centrale nucléaire et des terres rares pour faire un son pop, en retard et qui ne vient pas du bon endroit.

        • [^] # Re: Rock and roll all night

          Posté par  . Évalué à 10.

          Tu dis ça parce que tu es jaloux ! Essaie un peu de fabriquer une batterie qui fait « coincoin ! » pour voir. La mienne elle peut ! :p

          Plus sérieusement, sur le fond tu as tout à fait raison. Cependant, je déconseille vivement de fabriquer une batterie pour un enfant de 3 ans, parce que ça va rapidement ne plus être très ludique du tout pour les oreilles des parents.

          PS : pour ce qui est de faire coincoin, je suppose qu'on peut toujours enfermer un canard dans un sac et taper très fort dessus, ça pourrait marcher. Je vais en parler à mon mioche !

          La gent féminine, pas la "gente", pas de "e" ! La gent féminine ! Et ça se prononce comme "gens". Pas "jante".

          • [^] # Re: Rock and roll all night

            Posté par  . Évalué à 4.

            Cependant, je déconseille vivement de fabriquer une batterie pour un enfant de 3 ans, parce que ça va rapidement ne plus être très ludique du tout pour les oreilles des parents.

            Tu parles apparemment d'expérience, je ne peux donc que te donner raison. Toutefois, il me semble si l'enfant a appris à ne pas crier sans cesse sans qu'on ait pour cela besoin de le bâillonner, il pourra apprendre à faire de même avec une batterie qui ne s'éteint pas.

            Plus sérieusement, sur le fond

            Nous sommes d'accord ! Pour développer, apprendre le son rendu par chaque objet pour chaque manière de taper peut être passionnant, ou, par exemple, on peut être ravi lorsqu'on obtient soudain une résonance, un son tenu. Avec un objet électronique, la subtilité doit presque toujours être explicitement programmée, il est donc plus limité par nature et moins propice à l'exploration (en mettant peut-être à part les synthétiseurs modulaires).

          • [^] # Re: Rock and roll all night

            Posté par  (site web personnel, Mastodon) . Évalué à 2.

            Tu dis ça parce que tu es jaloux ! Essaie un peu de fabriquer une batterie qui fait « coincoin ! » pour voir. La mienne elle peut ! :p

            Là, effectivement, tu viens de gagner un point hackvalue ! Pour en avoir un deuxième, tu peux toujours proposer ton sample de canard aux gens…

  • # Conjugaison !

    Posté par  . Évalué à 5.

    et que le marmot l'a repéré ce soir…

    « repérée » bien sûr (la batterie) ! Désolé, je l'avais pas repérée, c'est réparé.

    La gent féminine, pas la "gente", pas de "e" ! La gent féminine ! Et ça se prononce comme "gens". Pas "jante".

  • # Bien joué

    Posté par  . Évalué à 8.

    Salut,

    Je suis super content que mes journaux aient fait des émules.

    Après, le plus important, c'est que cela fonctionne vite et bien, et que l'utilisateur soit content.

    • [^] # Commentaire supprimé

      Posté par  . Évalué à 2.

      Ce commentaire a été supprimé par l’équipe de modération.

      • [^] # Re: Bien joué

        Posté par  . Évalué à 3.

        Ah mais oui je l'avais oublié celui-ci ! Bon, clairement, on ne joue pas dans la même catégorie, ta batterie rockband permet de moduler la frappe, moi c'est plutôt un truc pour jouer des marches militaires.

        Il y a un salopard qui a passé ton journal à +43, il faut te moinsser pour rétablir l'équilibre dans la Force ?

        La gent féminine, pas la "gente", pas de "e" ! La gent féminine ! Et ça se prononce comme "gens". Pas "jante".

        • [^] # Re: Bien joué

          Posté par  . Évalué à 4.

          Il y a un salopard qui a passé ton journal à +43

          La question existentielle du jour : comment passer cette phrase en mode inclusif ?
          Je débute (et je pense en rester à ce stade). Je propose : Elle·Il y a un·e salop·e·ard qui …

          • [^] # Re: Bien joué

            Posté par  . Évalué à 1.

            Je pense qu'on dit un salopard / une saloparde, donc ta trollesque question tombe à l'eau.

            La gent féminine, pas la "gente", pas de "e" ! La gent féminine ! Et ça se prononce comme "gens". Pas "jante".

            • [^] # Re: Bien joué

              Posté par  (site web personnel) . Évalué à 0.

              Vous disputez pas, j'ai réglé le problème à la base en remettant le score à un joli 42.

              • [^] # Commentaire supprimé

                Posté par  . Évalué à -1. Dernière modification le 12 janvier 2018 à 14:42.

                Ce commentaire a été supprimé par l’équipe de modération.

                • [^] # Re: Bien joué

                  Posté par  (site web personnel) . Évalué à 2.

                  Bah moi je trouve ça vraiment classe d'avoir un journal à 42 et encore plus de le garder à 42 !

                  J'ai pensé que tu étais dans le même délire et non dans la course aux chiffres.

                  J'ai pertinenté le journal sur Pétrolette pour compenser le malentendu.

  • # Ça marche

    Posté par  (site web personnel) . Évalué à 5.

    Ça fonctionne super bien. J'ai mis le script sur mon portable et je ne remarque pas de latence :)

    Pour les samples j'ai trouvé quasiment tout sur freesound.org sauf le bass drum.

    Merci bien d'avoir partagé.

  • # moins de lag : pygame sait faire

    Posté par  . Évalué à 7.

    Je profite du dimanche soir pour revenir sur le code…

    Premio, au sujet du lag. Mes samples sont en 44100 Hz, et en initialisant proprement le mixer de pygame à 44100Hz je n'ai plus de lag perceptible.

    Deuxio, au sujet de la curieuse façon d'initialiser le mixer. Il suffisait de lire la doc ! Laquelle nous dit bien :
    « The top level pygame.init() takes care of this automatically, but cannot pass any arguments to the mixer init. To solve this, mixer has a function pygame.mixer.pre_init() to set the proper defaults before the toplevel init is used.»

    Donc je présente mes excuses aux développeurs de pygame, et ça m'apprendra à copier coller comme un cochon ;p

    Troisio (comme on ne dit pas), n'oubliez jamais que les notes des journaux sur linuxfr n'ont que peu d'importance, et n'hésitez pas à allez respirer un peu d'air frais quand la moutarde vous monte au nez.

    La gent féminine, pas la "gente", pas de "e" ! La gent féminine ! Et ça se prononce comme "gens". Pas "jante".

    • [^] # Commentaire supprimé

      Posté par  . Évalué à 5.

      Ce commentaire a été supprimé par l’équipe de modération.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.