问题是:
我尝试无限循环播放 Fast Tracker 模块,但这样做只是从头开始重播音乐,而不是跟随重复位置。
示例: (这里是模块 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)
我想要实现的目标: 循环播放模块音乐,每次都在重复位置而不是轨道开始处循环。 pygame 的使用不是必需的:我使用它是因为我没有找到任何适合播放跟踪器音乐的东西
提前致谢。
最佳答案
更新:我用 cython 编写了一个简单的演示,它成功播放了链接的 .xm 文件。它基本上是 this c demo code 的翻译.我的代码可以在 this github page 上找到.为了让它在 Ubuntu 中运行,我必须安装 libxmp-dev 包。请注意,目前所有内容都是硬编码的,因此需要对其进行重构才能更直接地用于您的项目。
这绝不是一个决定性的答案。一路上我遇到了很多潜在的陷阱,这让我怀疑 pygame 是否是完成这项工作的正确工具,但我将介绍到目前为止我发现的内容以及一些建议。
它看起来像 .xm Fast Tracker MODule 格式不同于典型的 wav/ogg/mp3 文件,而不仅仅是播放样本数据数组,您可以将不同的 MIDI 乐器和样本组合在一起来创作您的音乐,例如问题中链接的(甜蜜的)chiptune。
事实证明,SDL/pygame 可以播放此类文件,但方式相当有限。查看 pygame 的 music模块,有一个set_pos函数。然而,尝试使用它给了我一个 pygame.error: set_pos unsupported for this codec。然而,有趣的是,我能够通过使用带有可选 start 关键字的 pygame.mixer.music.play 来解决这个问题。虽然 start 在大多数文件格式上只是开始文件之前的秒数偏移(仅在歌曲的第一次播放时),但它对 MOD 文件有不同的含义,例如问题中的 .xm 文件。 Apparently , 它对应于 MOD 文件中的一个 pattern 编号。因此,根据每个模式在文件中的起始位置,可以在 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)
此时,您可能想知道这些模式到底是什么?如果您的系统上安装了 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
看起来这个文件中有 20 个模式,您可以从中选择作为循环的起始位置。要获取有关您的特定文件的更多信息,您可以在 MilkyTracker 等工具中打开(并编辑!)您的文件并获得如下输出:
youtube 上有一些关于 MilkyTracker 的在线教程,但它看起来是一个相当复杂的软件。
似乎还有一个名为 libxmp 的库及其对应的python binding .这应该处理将 MOD 文件数据“渲染”成一个简单的 PCM 数组所需的转换,该数组可以在像 pyaudio 这样的库或任何绑定(bind)到 OpenAL 的 python 中播放。无论哪种方式,看起来您的工作都已完成!
关于python - pygame.mixer.music.play() 无法识别 Fast Tracker(.xm 音乐格式)重复位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47114665/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
我在pry中定义了一个函数:to_s,但我无法调用它。这个方法去哪里了,怎么调用?pry(main)>defto_spry(main)*'hello'pry(main)*endpry(main)>to_s=>"main"我的ruby版本是2.1.2看了一些答案和搜索后,我认为我得到了正确的答案:这个方法用在什么地方?在irb或pry中定义方法时,会转到Object.instance_methods[1]pry(main)>defto_s[1]pry(main)*'hello'[1]pry(main)*end=>:to_s[2]pry(main)>defhello[2]pry(main)
我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'