如何合成声音?

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())

这在 music21 中是完全可能的。您可以使用库对象组装乐谱,然后播放它。您只需使用音符和节奏等音乐概念来创建音乐。更多信息,还有这个 问题。渲染使用 MIDI 音色库。Music21 是一个高级框架,可深入操作乐谱和音符并对其进行分析。 - mins
4个回答

16

声音合成是一个复杂的主题,需要多年的学习才能精通。

尽管相对较新的发展(如物理建模合成)在模拟真实乐器方面取得了一定进展,但这并不是完全解决的问题。

有许多选择供您选择。如果您确定想进一步探索合成,那么我建议您先学习调频(FM)合成。它相对容易学习,在软件中实现也比较简单(至少基本形式),并且可以产生各种有趣的声音。此外,还应查看Curtis Roads的书《计算机音乐教程》。虽然这本书已经有些年头了,但它是学习基础知识的首选圣经。

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


我不想使用示例库。我想要一些类似乐器的东西,但并不真实。 - Cheery

8
如果你想从零开始生成真正“有机”的声音,即像物理对象一样的声音,最好学习一些有关这些声音是如何产生的知识。对于一个扎实的入门,你可以看看Fletcher和Rossing的《乐器物理学》这本书The Physics of Musical Instruments。网络上也有很多相关内容,你可能会想看看James Clark在这里here的入门指南。
至少浏览一下这类内容将让你了解你要面对的问题。准确地模拟物理乐器非常困难!
如果你想做的是让某些东西听起来像是物理的,而不是像X乐器,那么你的工作就容易一些。你可以很容易地建立频率并将它们堆叠在一起,加一点噪音,你至少会得到一些听起来不像纯音的东西。
阅读一些有关傅里叶分析的内容以及频率调制(FM)技术的文章会有所帮助。
玩得开心!

1

我认为这非常不平凡,也没有固定的“正确方法”,但你应该考虑从一个(或自己制作)MIDI SoundFont 开始。


0

正如其他人所说,这绝非一个琐碎的话题。在编程方面存在挑战(特别是如果您关心低延迟),合成部分也同样如此。Julius O. Smith 的页面是声音合成的宝藏。有很多合成技术可以参考http://ccrma-www.stanford.edu/~jos/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接