我正在使用pygame播放.wav文件,并希望随着游戏中每个级别的进展更改特定.wav文件的音高.为了解释,我的游戏是旧Oric1计算机OricMunch Pacman游戏的近似副本,每个级别上都有几百个药丸被打磨,并且对于每个被打磨的药丸,都会播放一个短暂的声音.对于每个吃过/碾过的药丸,声音会略微增加.
现在这是我尝试过的:
1)我使用了pythons波形模块来创建声音文件的多个副本,每个新创建的文件的音高略有增加(通过改变params()中的第3个参数,有时称为采样频率) for循环的循环.完成此操作后,我可以在循环内创建多个声音对象以添加到列表中,然后通过列表索引以播放每个药丸被吃掉时的声音.
问题是即使我可以创建数百个文件(使用波形模块),当使用Windows媒体播放器,甚至是蟒蛇winsound模块播放时,它们可以完美地播放自己独特的音高,但pygame似乎并不能解释音高的差异.
现在有趣的是,我已经下载了Power Sound Editor的免费试用版,它可以选择改变音高,因此我只创建了几个.wav文件进行测试,并且在pygame中播放时它们显然会以不同的音高播放.
观察:从我的for循环打印params,我可以看到帧速率/频率正在按预期变化,因此很明显这就是为什么声音通过Windows媒体播放器和winsound播放.
在pygame中,我怀疑他们不使用不同音高的原因是因为频率参数是固定的,无论是默认设置还是使用pygame.mixer.pre_init,我已经尝试过.然后,我检查了Power Sound Editor创建的每个.wav文件的params,并注意到即使音调声音发生变化,频率也保持不变,这并不奇怪,因为您必须选择3个选项之一来保存文件,22050,44100或96000Hz
所以现在我想时间检查音高和频率之间的差异,特别是声音,因为我认为它们是相同的.我发现似乎声波有两个主要方面:1)帧速率/频率和2)基于该频率的多个波的变化幅度.现在我还没有清楚地理解这一点,但是实现Power Sound Editor必须通过操纵多个波的变化幅度来改变声音的形状/音高,上面的点2),而不是通过改变基频,点1) .
我是python,pygame和编程的初学者,并且一直在努力寻找一种简单的方法来改变声音文件,以便在不改变帧速率/基频的情况下逐渐增加音高.如果有一个模块我可以导入以帮助我通过操纵多个波的变化幅度来改变音高(而不是改变帧速率/采样频率,通常是22050或44100Hz),那么它需要相对没有时间如果在飞行中完成,以免减慢游戏速度.如果潜在的模块打开,更改然后保存声音文件,而不是动态改变它们,那么我想它是否慢,因为我只是创建声音文件所以我可以创建它们的声音对象玩pygame.
现在,如果在pygame中实现没有减速的唯一方法是从声音文件创建声音对象,就像我已经完成的那样,然后播放它们,那么我需要一种方法来操作声音文件,如Power Sound Editor(我再次强调不是通过改变通常22050或44100的帧率/采样频率,然后保存更改的文件.
我想在坚果壳中,如果我可以神奇地自动化Power Sound Editor来生成3到4个声音文件而不必单击更改音高选项然后每次保存,这就像拥有我自己的python方式它.
结论:假设从声音文件创建声音对象是不减慢我的游戏速度的唯一方法(我怀疑它可能是),那么我需要以下内容:
相当于python波形模块,但它像Power Sound Editor那样改变音高,而不是像波形模块那样改变基本频率.
请有人帮助我,让我知道是否有办法.
我正在使用python 3.2.3和pygame 1.9.2
另外我只是使用pythons IDLE而且我不熟悉使用其他编辑器.
我也知道Numpy和各种声音模块,但绝对不知道如何使用它们.此外,任何潜在的模块都需要使用上面的python和pygame版本.
先感谢您.
加里汤森德.
我对Andbdrew的第一个答复的回复如下:
谢谢您的帮助.
听起来好像改变波形文件数据而不是波形文件参数是我需要做的.这里参考的是我用来创建多个文件的代码:
framerate = 44100 #Original .wav file framerate/sample frequency
for x in range(0, 25):
file = wave.open ('MunchEatPill3Amp.wav')
nFrames = file.getnframes()
wdata = file.readframes(nFrames)
params = file.getparams()
file.close()
n = list(params)
n[0] = 2
n[2] = framerate
framerate += 500
params = tuple(n)
name = 'PillSound' + str(x) + '.wav'
file = wave.open(name, 'wb')
file.setparams(params)
print(params)
file.writeframes(wdata)
file.close()
Run Code Online (Sandbox Code Playgroud)
这听起来像编写不同的数据与Power Sound Editor如何改变音高相同或类似.
那么请你告诉我你是否知道修改/操纵wdata以有效改变音高的方法,而不是改变params()中的采样率.这是否意味着从我的.wav文件读取后应用于wdata的一些相对简单的操作.(我真的希望如此)我听说过使用numpy数组,但我不知道如何使用它们.
请注意,在上面的代码中修改过的任何.wav文件确实在使用winsound或者在Windows媒体播放器中使用Python播放,并且音调增加听起来如预期的那样.它只是在Pygame中没有.
正如我所提到的,似乎因为Pygame有一个设定频率(我猜这个频率也是采样率),这可能是音调听起来相同的原因,好像它根本没有增加.然而,当使用例如Windows媒体播放器播放时,采样率的改变确实导致更高的发声音调.
我想我只需要通过更改文件数据而不是文件参数来实现音调声音的相同增加,所以如果你知道一种方法,请告诉我.
再次感谢您帮助解决这个问题.
总结一下我的初步问题,这里又是:
如何在不改变帧速率/采样频率的情况下改变.wav文件的音高,使用python编程语言,而不是某种单独的软件程序,如Power Sound Editor?
再次感谢你.
您应该更改样本中波的频率,而不是更改采样率。看起来 python 正在以相同的采样率播放所有波形文件(这很好),因此您的更改不会反映出来。
采样率有点像声音文件的元信息。请访问http://en.m.wikipedia.org/wiki/Sampling_rate#mw-mf-search阅读相关内容。
它告诉您将连续波形转换为离散波形时样本之间的时间量。尽管您(滥用)使用它很酷,但通过以相同的采样率在不同文件中编码不同频率的声音会更好。
我查看了wave模块的文档(http://docs.python.org/3.3/library/wave.html),看起来你应该在调用时将不同的数据写入音频文件
Wave_write.writeframes(data)
Run Code Online (Sandbox Code Playgroud)
这是实际将音频数据写入音频文件的方法。
您描述的方法负责写入有关音频文件本身的信息,而不是音频数据的内容。
Wave_write.setparams(tuple)
Run Code Online (Sandbox Code Playgroud)
“...元组应该在哪里(nchannels、sampwidth、framerate、nframes、comptype、compname),其值对 set*() 方法有效。设置所有参数...”(也来自文档)
如果您发布代码,也许我们可以修复它。
| 归档时间: |
|
| 查看次数: |
1576 次 |
| 最近记录: |