2017-11-04 20 views
9

Problem polega na:pygame.mixer.music.play() nie rozpoznaje Szybka Tracker (format muzyczny .xm) powtórzenie pozycji

próbuję odtwarzać szybko moduł Tracker w nieskończonej pętli, ale robi tak po prostu odtwarzaj muzykę od początku, zamiast powtarzać pozycję.

Przykład:(tutaj jest źródło dla modułu 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) 

Co usiłuję osiągnąć: Odtwórz modułu muzyki w pętli, za każdym razem pętli powtarzania pozycji, a nie na początek utworu. Używanie numeru pygame nie jest konieczne: używam go, ponieważ nie znalazłem nic odpowiedniego do odtwarzania muzyki z trackera.

Z góry dziękuję.

Odpowiedz

7

Aktualizacja: Napisałem proste demo w cytoninie, które z powodzeniem odtwarza powiązany plik .xm. Jest to w zasadzie tłumaczenie this c demo code. Mój kod do tego można znaleźć na this github page. Aby go uruchomić w Ubuntu, musiałem zainstalować pakiet libxmp-dev. Zauważ, że w tej chwili wszystko jest na stałe zakodowane, więc musi zostać ponownie przetworzone, aby było bardziej bezpośrednio użyteczne w twoim projekcie.


Nie jest to w żadnym wypadku rozstrzygająca odpowiedź. Natknąłem się na wiele potencjalnych pułapek po drodze, które sprawiają, że wątpię, czy pygame jest właściwym narzędziem do pracy tutaj, ale przedstawię to, co odkryłem do tej pory, a także kilka sugestii.

Wygląda jak .xm Szybka Tracker MOD Format ule różni się od typowego pliku WAV/OGG/MP3 w tym, że zamiast po prostu grać tablicę przykładowych danych, można łączyć różne instrumenty MIDI i próbki razem, aby stworzyć ty muzyka, jak (słodki) chiptune związany z pytaniem.

Okazuje się, że SDL/pygame, może odtwarzać takie pliki, ale w raczej ograniczony sposób. Patrząc na moduł pygame music, dostępna jest funkcja set_pos. Jednak próba użycia tego dała mi pygame.error: set_pos unsupported for this codec. Co ciekawe, udało mi się obejść ten problem, używając pygame.mixer.music.play z opcjonalnym słowem kluczowym start. Podczas gdy start w większości formatów plików jest po prostu przesunięciem w sekundach przed uruchomieniem pliku (tylko przy pierwszym odtworzeniu utworu), ma inne znaczenie dla plików MOD, takich jak plik .xm w pytaniu. Apparently, odpowiada numerowi pattern w pliku MOD. W rezultacie istnieje bardzo ograniczona liczba potencjalnych punktów początkowych, które mogą być użyte w pygame, w oparciu o to, gdzie każdy wzorzec zaczyna się w pliku.

Jeśli masz określony numer wzoru, od którego chcesz zacząć, to poniższy kod wystarczy do zapętlenia. Należy pamiętać, że używam systemu zdarzeń Pygame, aby zobaczyć, gdy dźwięk jest gotowy do „pętli” pliku dźwiękowego z odpowiednim „wzór offset”:

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) 

W tym momencie, można się zastanawiać, co dokładnie są te patterns?Jeśli ffmpeg zainstalowane w systemie, można uruchomić ffprobe na pliku i pojawia się następujący komunikat:

Input #0, libmodplug, from 'zeta_force_level_2.xm': 
    Metadata: 
    name   : zeta force level 2 
    instrument  : by zabutom -- 
        : bye bye computer.. 
        : see you in a week 
    sample   : zeta force level 2 
    extra info  : 20 patterns, 10 channels, 3/14 instruments, 1/14 sample 
    Duration: 00:01:01.00, bitrate: 3 kb/s 
    Stream #0:0: Audio: pcm_s16le, 44100 Hz, 2 channels, s16, 1411 kb/s 

Wygląda istnieją 20 wzorów w tym pliku, z którego można wybrać jako lokalizację wywoławcza pętla. Aby uzyskać więcej informacji na temat danego pliku, można otworzyć (i edytować!) Plik w narzędziu jak MilkyTracker i uzyskać wyjście takiego:

enter image description here Istnieje kilka tutoriali dla MilkyTracker Online na YouTube, ale wygląda jak dość skomplikowany kawałek oprogramowania.

Pojawia się również biblioteka o nazwie libxmp i odpowiadająca jej python binding. Powinno to obsłużyć konwersję wymaganą do "renderowania" danych pliku MOD do prostej tablicy PCM, którą można odtwarzać w bibliotece takiej jak pyaudio lub dowolnego powiązania z pythonem dla OpenAL. Tak czy inaczej, wygląda na to, że masz dla ciebie swoją pracę!

+0

Wygląda na to, że libxmp-python jest interesujący, ale muszę przetestować, czy odtwarza poprawnie. Przyjmuję odpowiedź, jeśli tak, w każdym razie dziękuję za odpowiedź. – MaxLunar

+0

@MaxLunar Będę trzymać nagrodę otwartą przez resztę tygodnia (4 kolejne dni), a to stopniowo zwiększy widoczność twojego pytania. Sugeruję, aby poczekać z akceptacją do końca, aby sprawdzić, czy pojawią się inne odpowiedzi, biorąc pod uwagę, że pytania nieakceptowane są również o wiele bardziej prawdopodobne w celu uzyskania odpowiedzi. –

+0

@MaxLunar Po prostu wypróbowanie biblioteki, z którą się łączyłem i zastanawiałem się, jakiej wersji używasz platformy OS i Pythona? Wygląda na to, że bindowanie pythona libxmp mogło być napisane z myślą o python2 ... – CodeSurgeon