Partage
  • Partager sur Facebook
  • Partager sur Twitter

Créer un cotroleur de music

Créer un cotroleur de music avec pygame sous Kunbuntu 22.04 (Linux)

    20 juillet 2023 à 11:45:13

    Bonjour !

    j'essaye de créer un écran de veille en python qui affiche le spectre sonore avec un écran de contrôle.

    sur cette écran je voudrais pouvoir passer a la musique suivante, a la musique précedante et mettre pause, quelque soit l'apli qui joue la musique.

    J'utilise Kunbuntu 22.04.

    voici mon code actuellement (j'affiche le spectre avec des couleur aléatoir) :

    import pygame
    import numpy as np
    import pyaudio
    import matplotlib.colors as mcolors
    import random
    
    pygame.init()
    
    WIDTH = 800
    HEIGHT = 600
    WHITE = (255, 255, 255)
    BLACK = (0, 0, 0)
    COLORS = [
        (255, 0, 0),    # Rouge vif
        (0, 255, 0),    # Vert vif
        (0, 0, 255),    # Bleu vif
        (255, 255, 0),  # Jaune vif
        (255, 0, 255),  # Magenta vif
        (0, 255, 255),  # Cyan vif
        (255, 128, 0),  # Orange vif
        (128, 0, 255),  # Violet vif
        (0, 255, 128),  # Turquoise vif
        (128, 255, 0)   # Vert clair vif
    ]
    
    # Vous pouvez également ajouter plus de couleurs vives à la liste si nécessaire.
    
    
    
    # Crée une fenêtre pour afficher les bars
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption("Live Audio Spectrum")
    
    # Initialise PyAudio
    p = pyaudio.PyAudio()
    
    # Définit les paramètres d'enregistrement
    CHUNK = 2048
    FORMAT = pyaudio.paInt16
    CHANNELS = 1
    RATE = 44100
    
    # Ouvre un stream d'enregistrement audio
    stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK)
    
    # Crée une échelle de couleurs allant du bleu au rouge
    color_scale = mcolors.LinearSegmentedColormap.from_list("color_scale", [(0, 'blue'), (1, 'red')])
    
    # Boucle principale
    running = True
    while running:
        # Récupère les données audio
        data = stream.read(CHUNK, exception_on_overflow=False)
        # Convertit les données en un tableau numpy
        data_array = np.frombuffer(data, dtype=np.int16)
        # Calcule la transformée de Fourier discrète (DFT)
        fft = np.fft.fft(data_array)
        # Calcule les amplitudes de la DFT
        fft_abs = np.abs(fft)[:int(CHUNK/2)]
        # Normalise les amplitudes entre 0 et 1
        fft_norm = fft_abs / (CHUNK * 32768)
        
        # Affiche les bars correspondant aux amplitudes avec différentes couleurs en fonction de la fréquence
        screen.fill(BLACK)
        for i in range(0, len(fft_norm), 2):
            bar_width = 8
            bar_height = int(fft_norm[i] * HEIGHT * 2)
            # Calcule la fréquence correspondante à la barre actuelle
            # Mappe la fréquence à une valeur normalisée dans l'intervalle [0, 1]
            pygame.draw.rect(screen, random.choice(COLORS), (i * bar_width, HEIGHT - bar_height, bar_width, bar_height * 2))
        pygame.display.update()
    
        # Vérifie si l'utilisateur veut quitter la fenêtre
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
    
    # Arrête le stream d'enregistrement audio et PyAudio
    stream.stop_stream()
    stream.close()
    p.terminate()
    
    pygame.quit()

    P-.S : Si quelqu'un sait comment organiser les barre en cercle, un peux comme si dessous, je suis preneur ^^ :


    Spectre-fon | Sound waves design, Music visualization, Light background ...

    • Partager sur Facebook
    • Partager sur Twitter
      20 juillet 2023 à 18:14:47

      Bonjour,

      Des couleurs aléatoires ?

      -
      Edité par Phil_1857 20 juillet 2023 à 18:19:24

      • Partager sur Facebook
      • Partager sur Twitter
        20 juillet 2023 à 19:10:04

        Voilà un sujet intéressant
        • Partager sur Facebook
        • Partager sur Twitter

        Python c'est bon, mangez-en. 

          20 juillet 2023 à 19:47:52

          pour dessiner en cercle, je pense qu'il faut se baser sur pygame.draw.arc

          peut-être s'inspirer de ce code là https://github.com/SimisFul/py-clock/tree/master 

          • Partager sur Facebook
          • Partager sur Twitter
            21 juillet 2023 à 10:12:42

            Bonjour.

            Pour les couleurs, c'est un détail que je pourrais réglé après avoir tous créer.

            L'un⋅e de vous aurait-t-il⋅elle un idées pour le controleur ?

            umfred a écrit:

            pour dessiner en cercle, je pense qu'il faut se baser sur pygame.draw.arc

            peut-être s'inspirer de ce code là https://github.com/SimisFul/py-clock/tree/master 

            Je sais pas si je pourrais "attacher" les barre au cercle mais je vais creuser cette piste. Merci



            • Partager sur Facebook
            • Partager sur Twitter
              21 juillet 2023 à 11:49:38

              "L'un·e de vous aurait-t-il·elle un idées pour le controleur ?"

              heuuu, c'est quoi ce charabia ?

              • Partager sur Facebook
              • Partager sur Twitter
                21 juillet 2023 à 11:56:50

                Rebonjour.

                J'ai trouver comment controler la musique :

                import pygame
                import numpy as np
                import pyaudio
                import matplotlib.colors as mcolors
                import random
                import subprocess
                
                pygame.init()
                
                WIDTH = 800
                HEIGHT = 600
                WHITE = (255, 255, 255)
                BLACK = (0, 0, 0)
                NUM_BARS = 512
                
                # Crée une fenêtre pour afficher les bars
                screen = pygame.display.set_mode((WIDTH, HEIGHT))
                pygame.display.set_caption("Live Audio Spectrum")
                
                # Initialise PyAudio
                p = pyaudio.PyAudio()
                
                # Définit les paramètres d'enregistrement
                CHUNK = 2048
                FORMAT = pyaudio.paInt16
                CHANNELS = 1
                RATE = 44100
                
                # Ouvre un stream d'enregistrement audio
                stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK)
                
                # Crée une échelle de couleurs allant du bleu au violet
                color_scale = mcolors.LinearSegmentedColormap.from_list("color_scale", [(0, 'blue'), (1, 'red')])
                
                # Bouton play
                button_play_image = pygame.image.load('playpause.png')
                
                # Position du bouton sur l'écran
                button_play_rect = button_play_image.get_rect()
                button_play_rect.center = (WIDTH // 2, HEIGHT // 2)
                
                # Bouton next
                button_next_image = pygame.image.load('next.png')
                
                # Position du bouton sur l'écran
                button_next_rect = button_next_image.get_rect()
                button_next_rect.center = (WIDTH // 2 + 100, HEIGHT // 2)
                
                # Bouton previous
                button_previous_image = pygame.image.load('previous.png')
                
                # Position du bouton sur l'écran
                button_previous_rect = button_previous_image.get_rect()
                button_previous_rect.center = (WIDTH // 2 - 100, HEIGHT // 2)
                
                commandes = {
                    'play-pause': 'playerctl play-pause',  # Commande pour play/pause
                    'next': 'playerctl next',              # Commande pour la piste suivante
                    'previous': 'playerctl previous'       # Commande pour la piste précédente
                }
                
                # Boucle principale
                running = True
                angle = 0  # Angle initial de rotation du rectangle
                
                while running:
                    # Récupère les données audio
                    data = stream.read(CHUNK, exception_on_overflow=False)
                    # Convertit les données en un tableau numpy
                    data_array = np.frombuffer(data, dtype=np.int16)
                    # Calcule la transformée de Fourier discrète (DFT)
                    fft = np.fft.fft(data_array)
                    # Calcule les amplitudes de la DFT
                    fft_abs = np.abs(fft)[:int(CHUNK / 2)]
                    # Normalise les amplitudes entre 0 et 1
                    fft_norm = fft_abs / (CHUNK * 32768)
                
                    # Affiche les bars correspondant aux amplitudes avec différentes couleurs en HSV
                    screen.fill(BLACK)
                    for i in range(NUM_BARS):
                        bar_width = WIDTH // NUM_BARS+ 5
                        bar_height = int(fft_norm[i * len(fft_norm) // NUM_BARS] * HEIGHT * 2) * 2
                        # Calcule la fréquence correspondante à la barre actuelle
                        # Mappe la fréquence à une valeur normalisée dans l'intervalle [0, 1]
                        hue = i / NUM_BARS * 360  # Valeur de teinte en degrés (0 à 360)
                        saturation = 1.0  # Valeur de saturation (0 à 1)
                        value = 1.0  # Valeur de luminosité (0 à 1)
                        color_rgb = pygame.Color(0, 0, 0)  # Initialiser la couleur en noir (valeur par défaut)
                
                        # Convertir les valeurs HSV en RGB
                        color_rgb.hsva = (hue, saturation * 100, value * 100, 100)
                
                        rect = pygame.draw.rect(screen, color_rgb, (i * bar_width, HEIGHT - bar_height, bar_width, bar_height))
                
                        # Crée une nouvelle surface pour représenter le rectangle
                        rect_surface = pygame.Surface(rect.size)
                        pygame.draw.rect(rect_surface, color_rgb, rect)
                
                    screen.blit(button_play_image, button_play_rect)
                    screen.blit(button_next_image, button_next_rect)
                    screen.blit(button_previous_image, button_previous_rect)
                
                    pygame.display.update()
                
                    # Vérifie si l'utilisateur veut quitter la fenêtre
                    for event in pygame.event.get():
                        if event.type == pygame.QUIT:
                            running = False
                
                        if event.type == pygame.MOUSEBUTTONDOWN:
                            if button_play_rect.collidepoint(event.pos):
                                subprocess.run(commandes['play-pause'], shell=True)
                
                            elif button_next_rect.collidepoint(event.pos):
                                subprocess.run(commandes['next'], shell=True)
                
                            elif button_previous_rect.collidepoint(event.pos):
                                subprocess.run(commandes['previous'], shell=True)
                
                # Arrête le stream d'enregistrement audio et PyAudio
                stream.stop_stream()
                stream.close()
                p.terminate()
                
                pygame.quit()
                

                Si quelqu'un sait comment faire tourner les rectangle...
                Je voudrais également le definir comme fond d'ecran sous linux/ecran de veille. quelqu'un sait si s'est possible ?

                Merci 

                -
                Edité par Le pythoneur 21 juillet 2023 à 13:45:16

                • Partager sur Facebook
                • Partager sur Twitter

                Créer un cotroleur de music

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown