pygame.mélangeur.musical.play () ne reconnaît pas Fast Tracker (.XM music format) répétez la position

Le problème est:

j'essaie de jouer le module Fast Tracker en boucle infinie, mais en le faisant, je rejoue la musique dès le début, au lieu de suivre la position de répétition.

Exemple: (voici la source du module https://api.modarchive.org/downloads.php?moduleid=153915#zeta_force_level_2.xm)

import pygame

pygame.mixer.init()
pygame.mixer.music.load('/path/to/zeta_force_level_2.xm')
pygame.mixer.music.play(-1)

ce que j'essaie d'accomplir: jouer de la musique de module en boucle, à chaque fois boucle en position de répétition, pas au début de la piste. L'utilisation de pygame n'est pas nécessaire: je l'utilise parce que je n'ai pas trouvé quelque chose de convenable pour jouer tracker musique

Merci à l'avance.

9
demandé sur Andras Deak 2017-11-04 22:21:04

1 réponses

mise à jour: j'ai écrit une démo simple à cython qui joue avec succès votre lien .fichier xm. C'est essentiellement une traduction de c le code de démonstration. Mon code car il peut être trouvé sur cette page github. Pour le faire fonctionner à Ubuntu, j'ai dû installer le libxmp-dev package. Notez que tout est codé en dur pour le moment, il faudrait donc le refactoriser pour être plus directement utilisable dans votre projet.


Ce n'est pas un réponse concluante. J'ai rencontré beaucoup d'écueils potentiels en cours de route qui me font douter si pygame est l'outil adéquat pour le travail ici, mais je vais présenter ce que j'ai découvert jusqu'à présent ainsi que quelques suggestions.

Il ressemble à l' .xm Fast Tracker MOD le format ule est différent de votre fichier WAV/ogg/mp3 typique dans ce que plutôt que de simplement jouer un tableau de données d'échantillon, vous pouvez combiner différents instruments MIDI et des échantillons ensemble pour vous créer de la musique, comme le (doux) chiptune lié dans la question.

il s'avère que SDL / pygame, peut lire de tels fichiers, mais d'une manière plutôt limitée. En regardant pygame!--31-->musique module, il y a un set_pos fonction. Cependant, essayer d'utiliser cela m'a donné un pygame.error: set_pos unsupported for this codec. Fait intéressant, cependant, j'ai pu contourner cela en utilisant pygame.mixer.music.play avec l'option start mot clé. Alors que les start sur la plupart des formats de fichier est simplement le décalage en secondes avant de commencer le fichier (seulement sur le premier playthrough de la chanson), il a une signification différente pour MOD des fichiers comme le .xm fichier dans la question. Apparemment, correspond à un pattern numéro dans le fichier MOD. En conséquence, il y a un nombre très limité de points de départ potentiels qui peuvent être utilisés dans pygame, en fonction de l'endroit où chaque motif commence dans le fichier.

si vous avez un numéro de modèle spécifique que vous voulez commencer par en tête, alors le code suivant serait suffisant pour boucler. Notez que J'utilise le système d'événements de pygame pour voir quand le son est terminé à "boucler" le fichier sonore avec le "pattern offset" approprié:

import pygame

pygame.init()
pygame.mixer.music.load('zeta_force_level_2.xm')
pattern = 10
loop_event = pygame.USEREVENT + 1
pygame.mixer.music.set_endevent(loop_event)
pygame.mixer.music.play(start=pattern)

while True:
    for event in pygame.event.get():
        if event.type == loop_event:
            pygame.mixer.music.play(start=pattern)

À ce stade, vous vous demandez peut-être ce que sont exactement ces