基于变动输入的Python实时声音合成器
我想做一个效果器 [¹],目的是为了让输入的声音变得扭曲。
因为我是从零开始,所以我想用Python生成一个持续的声音,并且当我滑动一个滑块(或者类似的控件)时,让这个声音的频率发生变化。
我试过使用tkSnack这个Python库来生成声音,但它在生成音调之间会停顿。我希望我的程序能持续播放声音,即使声音在变化也不停止。
我在Arduino上用tone()这个简单的函数得到了不错的效果 [²]。可能是因为延迟时间非常短,所以声音听起来是连续的。请问在我的电脑上用Python库在Linux系统下能做到类似的效果吗?
感谢任何能帮我的人!:)
2 个回答
1
PyAudio 是一个为 portaudio 提供 Python 接口的工具。使用它,你可以进行实时的音频处理,尽管 Python 在处理数字计算方面的性能不是特别高。
4
你好,我去年用这个公式做了一个效果器。
M = 2*D/(1-D);
x = (1+M)*(x)./(1+k*abs(x));
X = 输入信号
D = 失真效果,可以试试不同的值,比如0.1、0.5、0.9等等,看看效果如何。
这个可以在实时输入线上使用,结合Python和pyaudio,声音听起来就像一种过载效果。
更新:
用Python写的实时简单效果器失真。
#ederwander
import pyaudio
import numpy as np
import wave
chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 8800
K=0
DISTORTION = 0.61
p = pyaudio.PyAudio()
stream = p.open(format = FORMAT,
channels = CHANNELS,
rate = RATE,
input = True,
output = True,
frames_per_buffer = chunk)
print "Eng Eder de Souza - ederwander"
print "Primitive Pedal"
while(True):
data = stream.read(chunk)
data = np.fromstring(data, dtype=np.int16)
M = 2*DISTORTION/(1-DISTORTION);
data = (1+M)*(data)/(1+K*abs(data));
data = np.array(data, dtype='int16')
signal = wave.struct.pack("%dh"%(len(data)), *list(data))
stream.write(signal)
stream.stop_stream()
stream.close()
p.terminate()
改变变量DISTORTION可以看到不同的效果:
我稍微改了一下我的源代码,让它可以播放录制的样本,做了一些测试,得到了这个音频: http://www.freesound.org/people/eriatarka/sounds/15753/ 然后应用了这里描述的公式,你可以在这里听到变化后的文件: http://www.freesound.org/people/ederwander/sounds/146277/