如何合成声音?

时间:2009-04-26 14:37:33

标签: python numpy alsa

我想制作类似于真实乐器音频的声音。问题是我很少知道如何获得它。

我所知道的远离真实乐器的是它们输出的声音很少干净。但是如何产生这种不洁的声音?

到目前为止,我已经做到了这一点,它产生了非常简单的声音,我不确定它是否正确地使用了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 个答案:

答案 0 :(得分:16)

声音合成是一个复杂的话题,需要多年的学习才能掌握。

这也不是一个完全解决的问题,尽管相对较新的发展(例如物理建模综合)在模仿现实世界的仪器方面取得了进展。

您可以选择多种选择。如果您确定要进一步探索合成,那么我建议您先了解FM合成。它在软件中相对容易学习和实现,至少在基本形式中,并产生各种有趣的声音。另外,请查看Curtis Roads的“计算机音乐教程”一书。它是所有计算机音乐的圣经,虽然它已经存在了几年,但却是学习基础知识的首选书。

如果您想更快地制作逼真的声音,请考虑使用采样技术:即,记录您想要再现的乐器(或使用预先存在的样本库),然后再播放样本。这是一种更简单(通常更有效)的方法。

答案 1 :(得分:8)

很高兴,如果你想(从头开始)生成一些真正听起来像“有机”的东西,比如一个物理对象,你可能最好先了解一下这些声音是如何产生的。要获得可靠的介绍,您可以查看一本书,例如Fletcher和Rossings The Physics of Musical Instruments。网络上也有很多东西,你可能想看看James Clark的here

至少撇开这种东西会让你知道你的反对意见。准确地建模物理仪器非常困难!

如果您想要做的事情是听起来像物理的东西,而不是听起来像仪器X的东西,那么您的工作就会轻松一些。你可以很容易地建立频率并将它们叠加在一起,增加一点噪音,你会得到至少听起来不像纯音的东西。

阅读有关傅立叶分析的一般信息将有助于调频(FM)技术。

玩得开心!

答案 2 :(得分:1)

我同意这是非常重要的,而且没有“正确的方式”,但你应该考虑从(或制作自己的)MIDI SoundFont开始。

答案 3 :(得分:0)

正如其他人所说,根本不是一个微不足道的话题。在编程方面(特别是如果你关心低延迟)和综合部分都存在挑战。 Julius O. Smith的页面是声音合成的金矿。 有许多合成技术http://ccrma-www.stanford.edu/~jos/