7

我想产生类似于真实乐器音频的声音。问题是我几乎不知道如何获得它。

我所知道的与真实乐器相去甚远的是,它们输出的声音很少是干净的。但是如何产生这种不干净的声音呢?

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

4 回答 4

16

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

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

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

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

于 2009-04-26T14:43:37.177 回答
8

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

至少浏览一下这类东西会让你知道你要面对什么。准确地为物理仪器建模是非常困难的!

如果你想做的是一些听起来像物理的东西,而不是听起来像乐器 X 的东西,你的工作会更容易一些。你可以很容易地建立频率并将它们叠加在一起,添加一点噪音,你会得到至少听起来不像纯音的东西。

阅读一些有关傅立叶分析的一般知识会有所帮助,调频 (FM) 技术也会有所帮助。

玩得开心!

于 2009-04-26T16:32:34.277 回答
1

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

于 2009-04-26T15:28:41.420 回答
0

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

于 2009-06-15T04:46:25.397 回答