2017-11-04 31 views
9

問題がある:pygame.mixer.music.play()の高速トラッカーを認識しない(.xm音楽フォーマット)リピート位置

私は無限ループに高速トラッカーモジュールを再生しよう、そうすることリピートポジションに従うのではなく、最初から音楽を再生するだけです。

例:私が達成しようとしている何

import pygame 

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

(ここではモジュールhttps://api.modarchive.org/downloads.php?moduleid=153915#zeta_force_level_2.xmのソースです):ループ内プレイモジュールの音楽を、それぞれの時間がない上、リピート位置にループがトラックの開始。 pygameを使用する必要はありません:トラッカー音楽を再生するのに適したものが見つからなかったので使用します。

ありがとうございます。

答えて

7

更新:リンクされた.xmファイルを正常に再生するシンプルなデモをcythonで作成しました。基本的にはthis c demo codeの翻訳です。私のコードはthis github pageにあります。 Ubuntuで動作させるためには、libxmp-devパッケージをインストールしなければなりませんでした。現時点ではすべてがハードコードされているので、プロジェクトでより直接的に使用できるようにリファクタリングする必要があります。


これは決して決定的な答えではありません。私はパイガムがここの仕事のための正しいツールであるかどうか疑問に思う多くの潜在的な落とし穴に遭遇しましたが、私が今までに見つけたものといくつかの提案を提示します。

それは.xm高速トラッカーMOD ULE形式ではなく、単にサンプルデータの配列を再生するよりもその中にあなたの典型的なWAV/OGG/MP3ファイルと異なっているように、あなたが作成するために一緒に別のMIDI機器とサンプルを組み合わせることができます見えますあなたの質問にリンクされている(甘い)チプーンのような音楽。

SDL/pygameはこのようなファイルを再生できますが、かなり制限されています。 pygameのmusicモジュールを見ると、set_pos関数があります。しかし、それを使用しようと私にpygame.error: set_pos unsupported for this codecを与えた。興味深いことに、私はこれを回避するには、キーワードを使用してpygame.mixer.music.playを使用して対処することができました。ほとんどのファイル形式のstartは、ファイルを開始する前の秒単位のオフセット(曲の最初の再生時のみ)ですが、.xmファイルのようにMODファイルの意味が異なります。 Apparentlyの場合は、MODファイルのpatternに対応します。その結果、ファイル内で各パターンがどこから始まるかに基づいて、パイゲームで使用できる潜在的な出発点が非常に限られています。

開始したい特定のパターン番号がある場合は、ループするには次のコードで十分です。私は音が「ループ」「オフセットパターン」適切なとサウンドファイルに終了したときに表示するpygameののイベントシステムを使用することに注意してください:この時点で

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) 

、あなたは正確にこれらのpatternsをしているか疑問に思うかもしれませんか?あなたはffmpegのは、システムにインストールしている場合は、次の出力をファイルにffprobeを実行して取得することができます:

あなたがのためのスタート地点として選択することができ、そこからこのファイル内の20個のパターンがあるように見えます
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 

ループ。あなたの特定のファイルに関する情報を入手するには、開く(および編集!)あなたのファイルをMilkyTrackerのようなツールにし、このような出力を得ることができます。

enter image description here がユーチューブでオンラインMilkyTrackerのためのいくつかのチュートリアルがありますが、それが見えますかなり複雑なソフトウェアのように。

そこもlibxmpと呼ばれるライブラリのように見えるし、そのはpython binding対応します。これはMODファイルのデータを、pyaudioなどのライブラリやOpenALにバインドされたPythonで再生できるシンプルなPCM配列にレンダリングするために必要な変換を処理する必要があります。いずれにせよ、あなたの仕事はあなたのために切り取られているようです。

+0

libxmp-pythonは面白そうですが、正しく再生するかどうかテストする必要があります。私は答えを受け入れるだろうとにかく、とにかく返信してくれてありがとう。 – MaxLunar

+0

@MaxLunar週の残りの部分(4日以上)の間、賞金を開いたままにしておき、徐々にあなたの質問に大きな視界を与えます。受け入れられていない質問が回答を得る可能性がさらに高いことを考慮して、他の回答が表示されるかどうかを確認するために、最後まで受け入れを待つことをおすすめします。 –

+0

@MaxLunarちょうど私がリンクしていたライブラリを試して、どのOSプラットフォームとPythonバージョンを使用しているのだろうかと思っていましたか? libxmpのpythonバインディングがpython2で書かれているようです... – CodeSurgeon

関連する問題