如何合成声音?

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/。

【讨论】:

以上是关于如何合成声音?的主要内容,如果未能解决你的问题,请参考以下文章

关于如何在视频中合成声音

如何在 C 中进行声音合成?

如何使用流体合成器从 C# 中的声音字体生成声音

如何将 SoundEffectInstances 组合成一个新的声音文件 /mp3 或 wav

如何在 OSX 上的 C++ 应用程序中播放合成器声音?

AS3 加色合成。播放多个生成的声音