题
我想制作的声音类似于真正的乐器的音频。问题在于我几乎没有知道如何获得这个问题。
我所知道的远非真正的乐器是,他们输出的声音很少干净。但是如何产生这种不洁的声音呢?
我已经做到了这一点,它会产生相当简单的声音,我不确定它甚至正确地使用了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())
解决方案
令人愉悦的话,如果您想生成(从头开始)真正听起来“有机”的东西,即像物理对象一样,最好了解这些声音的产生方式。为了进行扎实的介绍,您可以看一本书,例如Fletcher和Rossings 乐器的物理学. 。网络上也有很多东西,您可能想看看詹姆斯·克拉克(James Clark) 这里
至少要浏览这种东西将使您了解自己所面对的事情。准确地对物理仪器进行建模非常困难!
如果您想做的是听起来很身体,而是听起来像乐器X的东西,那么您的工作要容易一些。您可以很容易地构建频率,并将它们堆叠在一起,添加一点噪音,并且您会得到至少听起来不像纯音的东西。
一般而言,阅读一些有关傅立叶分析的信息将有所帮助,频率调制(FM)技术也将有所帮助。
玩得开心!
其他提示
声音合成是一个复杂的主题,需要多年的研究才能掌握。
这也不是一个完全解决的问题,尽管相对较新的发展(例如物理建模合成)在模仿现实世界的仪器方面取得了进展。
您有许多选择对您打开。如果您确定要进一步探索合成,我建议您首先了解FM合成。至少以基本形式学习和实现,它相对容易学习和实现,并且会产生各种有趣的声音。另外,请查看柯蒂斯路(Curtis Roads)的《计算机音乐教程》。这是所有计算机音乐的圣经,尽管它已经使用了几年了,但它是学习基础知识的首选。
如果您想要一种更快的方式来产生像寿命一样的声音,请考虑使用采样技术:也就是说,记录要复制的仪器(或使用先前存在的样本库),然后播放样品。这是一种更直接(通常更有效)的方法。
正如其他人所说,根本不是一个琐碎的话题。在编程方面(尤其是在关心低延迟)和合成部分都存在挑战。朱利叶斯·O·史密斯(Julius O. Smith)的页面是声音合成的金矿。有 很多 合成技术 http://ccrma-www.stanford.edu/~jos/.