如何合成声音?
Posted
技术标签:
【中文标题】如何合成声音?【英文标题】:How to synthesize sounds? 【发布时间】:2010-10-21 21:58:24 【问题描述】:我想制作类似于真实乐器音频的声音。问题是我几乎不知道如何获得它。
我所知道的与真实乐器相差甚远的是,它们输出的声音很少是干净的。但是如何产生这种不干净的声音呢?
到目前为止,我已经做到了这一点,它会产生非常简单的声音,我什至不确定它是否正确使用了 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())
【问题讨论】:
music21 完全可以做到这一点。您可以使用库对象组合乐谱,然后播放。您只使用音符和速度等音乐概念创作音乐。 More,还有这个question。渲染使用 MIDI 库。 Music21 是一个先进的框架,用于处理乐谱和音符并对其进行深入分析。 【参考方案1】:声音合成是一个复杂的课题,需要多年的学习才能掌握。
这也不是一个完全解决的问题,尽管最近的发展(例如物理建模合成)在模拟真实世界的仪器方面取得了进展。
您有多种选择。如果您确定要进一步探索合成,那么我建议您从学习 FM 合成开始。它相对容易在软件中学习和实现,至少在基本形式上是这样,并且可以产生各种有趣的声音。另外,请查看 Curtis Roads 的“计算机音乐教程”一书。这是一本关于所有计算机音乐的圣经,虽然它已经有几年历史了,但它是学习基础知识的首选书籍。
如果您想要更快地产生逼真的声音,请考虑使用采样技术:即录制您想要重现的乐器(或使用预先存在的样本库),然后播放样本。这是一种更直接(而且通常更有效)的方法。
【讨论】:
我不想使用样本库。我想要一些类似于乐器的东西,而不是栩栩如生的东西。【参考方案2】:很高兴,如果您想(从头开始)生成听起来真正“有机”的东西,即像一个物理对象,您最好了解一下这些声音是如何生成的。对于可靠的介绍,您可以查看 Fletcher 和 Rossings The Physics of Musical Instruments 之类的书。网上也有很多东西,你可能想看看 James Clark 的入门书 here
至少浏览一下这类内容会让您了解自己面临的挑战。准确地为物理仪器建模非常困难!
如果您想做的是听起来像物理的东西,而不是听起来像乐器 X 的东西,那么您的工作会容易一些。你可以很容易地建立频率并将它们叠加在一起,添加一点噪音,你会得到至少听起来不像纯音的东西。
阅读一些有关傅立叶分析的一般知识会有所帮助,调频 (FM) 技术也会有所帮助。
玩得开心!
【讨论】:
【参考方案3】:我同意这是非常重要的,并且没有固定的“正确方法”,但您应该考虑从(或自己制作)MIDISoundFont 开始。
【讨论】:
【参考方案4】:正如其他人所说,这根本不是一个微不足道的话题。在事物的编程方面(特别是如果您关心低延迟)和综合部分都存在挑战。声音合成的金矿是 Julius O. Smith 的页面。有很多合成技术http://ccrma-www.stanford.edu/~jos/。
【讨论】:
以上是关于如何合成声音?的主要内容,如果未能解决你的问题,请参考以下文章