pygame.mixer.music.play()无法识别快速跟踪器(.xm音乐格式)重复位置

Max*_*nar 9 python pygame audio-player python-3.x

问题是:

我尝试在无限循环中播放快速跟踪器模块,但这样做只是从开始重放音乐,而不是跟随重复位置.

示例:( 这是模块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)
Run Code Online (Sandbox Code Playgroud)

我想要实现的目的:循环播放模块音乐,每次循环播放重复位置,而不是开始播放.使用pygame没有必要:我使用它是因为我找不到任何适合播放跟踪音乐的东西

提前致谢.

Cod*_*eon 7

更新:我在cython中编写了一个简单的演示,可以成功播放链接的.xm文件.它基本上是这个c演示代码的翻译.我的代码可以在这个github页面上找到.为了让它在Ubuntu中工作,我必须安装该libxmp-dev软件包.请注意,目前所有内容都是硬编码的,因此需要对其进行重构才能在项目中更直接地使用.


这绝不是一个确凿的答案.我遇到了许多潜在的陷阱,让我怀疑pygame是否适合这里的工作,但我会提出我迄今为止所发现的一些建议.

看起来.xmFast Tracker MOD ule格式与典型的wav/ogg/mp3文件不同,不仅仅是播放一组样本数据,您可以将不同的MIDI乐器和样本组合在一起,创建音乐,如(甜蜜的) )chiptune在问题中联系在一起.

事实证明,SDL/pygame可以播放这样的文件,但方式相当有限.看看pygame的音乐模块,有一个set_pos功能.但是,尝试使用它给了我一个pygame.error: set_pos unsupported for this codec.然而有趣的是,通过使用pygame.mixer.music.play可选start关键字,我能够解决这个问题.虽然start在大多数文件格式上只是在启动文件之前的秒数偏移(仅在歌曲的第一次播放时),但它对于MOD.xm问题中的文件这样的文件具有不同的含义.显然,它对应pattern于MOD文件中的数字.因此,根据每个模式在文件中的起始位置,可以在pygame中使用非常有限的潜在起点.

如果您想要从特定模式编号开始,那么以下代码就足以循环.请注意,我使用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)
Run Code Online (Sandbox Code Playgroud)

在这一点上,您可能想知道这些究竟是patterns什么?如果您的系统上安装了ffmpeg,则可以运行ffprobe您的文件并获得以下输出:

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
Run Code Online (Sandbox Code Playgroud)

看起来这个文件中有20个模式,您可以从中选择它作为循环的起始位置.要获得有关特定文件的更多信息,可以在类似工具中打开(并编辑!)文件,MilkyTracker并获得如下输出:

在此输入图像描述 在youtube上有一些关于MilkyTracker在线教程,但它看起来像一个非常复杂的软件.

似乎还有一个名为libxmp的库及其相应的python绑定.这应该处理将MOD文件数据"渲染"成一个简单的PCM数组所需的转换,该数组可以在类似于pyaudio或与OpenAL的任何python绑定中播放.无论哪种方式,看起来你已经为你做了工作!