gpt4 book ai didi

python-3.x - 创建不同音高但仍具有相同基频的 .wav 文件

转载 作者:行者123 更新时间:2023-12-04 12:48:32 25 4
gpt4 key购买 nike

我正在使用 pygame 播放 .wav 文件,并希望随着游戏中每个级别的进行更改特定 .wav 文件的音高。解释一下,我的游戏是旧版 Oric1 计算机 OricMunch Pacman 游戏的近似副本,其中每个级别都有数百颗药丸需要咀嚼,并且每咀嚼一次药丸都会播放一段短促的声音,其音高为每吃一粒药丸,声音就会略有增加。

现在这是我尝试过的 :

1)我使用pythons波形模块创建了声音文件的多个副本,每个新创建的文件的音高略有增加(通过更改params()中的第三个参数帧率,有时称为采样频率)为每个for 循环的循环。实现这一点后,我可以在循环中创建多个声音对象以添加到列表中,然后在列表中索引以在每个药丸被吃掉时播放声音。

问题是,即使我可以创建数百个文件(使用 wave 模块),当使用 windows 媒体播放器甚至 python winsound 模块播放时,它们可以完美地播放它们自己独特的音高,pygame 似乎并没有解释音高的差异。

现在有趣的是,我下载了的免费试用版。 Power Sound Editor 它有改变音高的选项,所以我只创建了几个 .wav 文件来测试,当在 pygame 中播放时,它们显然以不同的音高播放。

观察 :
通过在我的 for 循环中打印参数,我可以看到帧速率/频率正在按预期变化,因此显然这就是声音通过 windows 媒体播放器和 winsound 按预期播放的原因。

在 pygame 中,我怀疑他们不玩不同音高的原因是因为频率参数是固定的,要么是默认设置,要么是通过使用 pygame.mixer.pre_init,我确实尝试过。
然后我检查了 Power Sound Editor 创建的每个 .wav 文件的参数,并注意到即使音调在改变,频率保持不变,这并不奇怪,因为你必须选择 3 个选项中的一个来保存文件,22050、44100 或 96000Hz

所以现在我想是时候检查音高和频率之间的差异,特别是在声音方面,因为我认为它们是相同的。我发现声波似乎有两个主要方面:1)帧率/频率和 2)基于该频率的多个波的变化幅度。现在我还没有清楚地理解这一点,但意识到 Power Sound Editor 必须通过操纵多个波的变化幅度来改变声音的形状/音高,上面的点 2),而不是通过改 rebase 频,上面的点 1) .

我是 Python、pygame 和编程的初学者,我一直在努力寻找一种简单的方法来改变声音文件,以在不改变帧率/基频的情况下逐渐增加音高。如果我可以导入一个模块来帮助我通过操纵多个波的变化幅度来改变音高(而不是更改通常为 22050 或 44100Hz 的帧率/采样频率),那么它根本不需要花费任何时间如果为了不减慢游戏速度而即时完成。如果潜在模块打开,更改然后保存声音文件,而不是即时更改它们,那么我想它是否很慢并不重要,因为我只会创建声音文件,以便我可以从它们中创建声音对象pygame 玩。

现在,如果在 pygame 中实现不减速的唯一方法是像我已经完成的那样从声音文件创建声音对象,然后播放它们,那么我需要一种方法来操纵声音文件,例如 Power Sound Editor(我再次强调不是通过更改帧率/采样频率(通常为 22050 或 44100)然后保存更改的文件。

我想简而言之,如果我可以神奇地自动化 Power Sound Editor 生成 3 到 400 个声音文件,而不必单击更改音高选项,然后每次都保存,这就像拥有我自己的 Python 方式一样它。

结论 :
假设从声音文件创建声音对象是不降低游戏速度的唯一方法(我怀疑可能是这样),那么我需要以下内容:

相当于 python 波形模块,但它像 Power Sound Editor 那样改变音高,而不是像波形模块那样改 rebase 频。

请有人可以帮助我,如果有办法,请告诉我。

我正在使用 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()

听起来编写不同的数据与 Power Sound Editor 改变音高的方式等效或相似。

所以请你告诉我你是否知道一种修改/操作 wdata 以有效改变音高的方法,而不是改变 params() 中的采样率。这是否意味着在从我的 .wav 文件中读取 wdata 后,会对它进行一些相对简单的操作。 (我真的希望如此)我听说过使用 numpy 数组,但我不知道如何使用它们。

请注意,在上述代码中修改的任何 .wav 文件确实可以使用 winsound 在 Python 中播放,或者在 Windows 媒体播放器中播放,音调增加听起来像预期的那样。只有在 Pygame 中他们没有。

正如我所提到的,似乎是因为 Pygame 有一个设定频率(我猜这个频率也是采样率),这可能是音高听起来相同的原因,好像它根本没有增加。而当玩,例如windows media player,采样率的变化确实会导致更高的音调。

我想我只需要通过更改文件数据而不是文件参数来实现相同的音调增加,所以如果你知道一种方法,请告诉我。

再次感谢您的帮助。

总结一下我最初的问题,又来了:

您如何通过使用 python 编程语言而不是某种单独的软件程序(例如 Power Sound Editor)在不更改帧率/采样频率的情况下更改 .wav 文件的音高?

再次感谢你。

最佳答案

您应该更改样本中波的频率,而不是更改采样率。似乎 python 正在以相同的采样率(这很好)播放您的所有波形文件,因此您的更改不会反射(reflect)出来。

采样率有点像声音文件的元信息。阅读 http://en.m.wikipedia.org/wiki/Sampling_rate#mw-mf-search .

当您将连续波形转换为离散波形时,它会告诉您样本之间的时间量。尽管您对它的(ab)使用很酷,但通过以相同的采样率在不同的文件中编码不同频率的声音会更好地为您服务。

我查看了 wave 模块的文档( http://docs.python.org/3.3/library/wave.html ),看起来您应该在调用时将不同的数据写入音频文件

 Wave_write.writeframes(data)

这就是实际将音频数据写入音频文件的方法。

您描述的方法负责写入有关音频文件本身的信息,而不是音频数据的内容。
 Wave_write.setparams(tuple)

“...元组应该在哪里(nchannels,sampwidth,framerate,nframes,comptype,compname),值对 set*() 方法有效。设置所有参数...”(也来自文档)

如果您发布代码,也许我们可以修复它。

关于python-3.x - 创建不同音高但仍具有相同基频的 .wav 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13430727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com