如何合成声音?
我想制作一些听起来像真实乐器发出的声音。但我对怎么做到这一点几乎没有头绪。
到目前为止,我了解到真实乐器发出的声音通常都不是很干净。那么,怎么才能制作出这种不那么干净的声音呢?
到现在为止,我做到了这一点,但发出的声音很普通,我甚至不确定这是不是在正确使用alsa。
import numpy
from numpy.fft import fft, ifft
from numpy.random import random_sample
from alsaaudio import PCM, PCM_NONBLOCK, PCM_FORMAT_FLOAT_LE
pcm = PCM()#mode=PCM_NONBLOCK)
pcm.setrate(44100)
pcm.setformat(PCM_FORMAT_FLOAT_LE)
pcm.setchannels(1)
pcm.setperiodsize(4096)
def sine_wave(x, freq=100):
sample = numpy.arange(x*4096, (x+1)*4096, dtype=numpy.float32)
sample *= numpy.pi * 2 / 44100
sample *= freq
return numpy.sin(sample)
for x in xrange(1000):
sample = sine_wave(x, 100)
pcm.write(sample.tostring())
4 个回答
16
声音合成是一个复杂的话题,需要很多年的学习才能掌握。
这个领域并不是完全解决的问题,虽然最近的一些进展(比如物理模型合成)在模仿现实乐器方面取得了一些成果。
你有很多选择。如果你确定想深入了解合成,我建议你先学习FM合成。这种方法相对简单,容易在软件中实现,至少在基础形式上能产生各种有趣的声音。此外,可以看看Curtis Roads写的《计算机音乐教程》这本书。这本书是计算机音乐领域的经典,虽然出版有些年头了,但仍然是学习基础知识的首选。
如果你想更快地制作出逼真的声音,可以考虑使用采样技术:也就是说,录制你想要重现的乐器(或者使用现成的采样库),然后直接播放这些样本。这种方法更直接(而且通常更有效)。
8
Cheery,如果你想从头开始生成一些听起来“有机”的声音,也就是像真实物体发出的声音,最好先了解一下这些声音是怎么产生的。作为一个很好的入门,你可以看看Fletcher和Rossing的书《乐器物理学》。网上也有很多相关的资料,你可以看看James Clark的入门介绍,链接在这里。
至少浏览一下这些内容,会让你对要面对的挑战有个大概的了解。准确地模拟物理乐器是非常困难的!
如果你想要的是听起来像真实物体的声音,而不是特定乐器的声音,那你的工作会简单一些。你可以很容易地组合不同的频率,加上一点噪音,这样就能得到一些听起来不那么单调的声音。
了解一些傅里叶分析的基本知识会有帮助,频率调制(FM)技术也很有用。
祝你玩得开心!