略述
数字声音
首先,音符是数字声音将产生的声音。简而言之,数字声音只是从计算机以一定速度传送给扬声器的数字序列。
关于CD音频,每秒会通过一些电路(DAC)将44100个数字(每个值都在-32,768到32,767之间)馈送到扬声器,这意味着CD音频采样率为44,100Hz,位深度为16位(有符号整数)。
因此,要生成声音,我们要做的就是创建一个有意义的整数流,并将该流指向扬声器或文件。这种指向的细微差别可以由库来处理。
延迟迭代
延迟迭代就像普通迭代一样,但是仅在需要时才评估值,例如,仅在按下键时才需要播放音符,因此可以在按下键时评估音符的值,而不是在此之前。
对于序列的延迟迭代,我们可以使用两种不同的Python功能:
生成器
迭代器
所有生成器都是迭代器,而对象只有在其类定义中实现了__next__和__iter__函数时,它才是迭代器。可以使用生成器表达式来实现生成器,例如:
这是一个具有yield而不是return的函数,这就是使其成为生成器的原因。一旦有了生成器或迭代器,就可以通过调用其上的下一个函数从其获取值,如下所示:
使用生成器和迭代器,我们可以生成无限的整数流,这些整数流可以馈送到扬声器或文件之类的某些输出,如果没有这些功能,则内存需求将非常高。
合成器
合成器是一种可以从头开始产生(合成)自己声音的东西。合成器是一种电子仪器,可以是模拟的或数字的。
合成器可以具有不同种类的控制器,例如压敏垫或键盘,这些控制器将控制信号发送到合成器,然后合成器将声音合成,然后将声音发送到扬声器进行播放。
为了简化合成器,可以理解为它由产生声音的组件(例如振荡器)和对声音进行塑形的组件(例如包络线和LFO(低频振荡器))组成,甚至可能还包括为声音添加效果的组件(例如颤音, 或颤音)。
振荡器
振荡器可能是合成器最重要的组成部分,它是生成一系列在一定间隔后重复的数字序列的组件。 最简单的振荡器是产生正弦波的振荡器。
正弦波以2π的时间周期重复,因此,如果我们必须以512 Hz的采样率生成1 Hz的信号,则必须在0到2π之间的数字线上创建512个分度,并且在每个分度处应用数学正弦函数,它为我们提供了该分频的正弦波输出样本。
由于我们不想一次生成所有样本,因此我们可以在需要下一个样本时,将输入到sin的步长增加一个步长,因此可以通过以下方式计算步长:
使用math和itertools库,我们现在可以使用上述公式创建一个正弦波发生器。
上面的函数返回一个生成器,因此要评估生成器的前512个样本,我们可以使用以下代码
在上面的代码段中,我正在使用python列表推到式来获取以512 Hz采样的1 Hz正弦波的前512个采样。
这是它的外观:
注意:对于所有其他曲线图和波形生成,我将使用44,100 Hz的采样率。
振荡器参数
在振荡器中,有几个参数是可以控制的,最明显的是振荡器的频率,改变它会给我们带来不同的提示。 例如:当调至音乐会音高时,即当A4的频率为440 Hz时,中音C或C4的频率为261.625565 Hz。
除了频率以外,我们还可以控制振幅,这样可以给我们带来诸如颤音的效果,或者仅仅是普通的旧音量控制。我们可以通过将振荡器的输出值乘以0到1之间的数字来控制它。
另一个不太明显的相位是相位,它可以给我们带来诸如移相器的效果。这可以通过在正弦函数输入中添加一个介于0到360之间的值的相位角来实现。
上面的所有三个图都是通过使用此函数获得的:
我们的振荡器正好适合4条线,但是如果我们可以即时调整这三个参数,那就更好了,即,无需在每次调整时都创建新的发生器,这将使我们能够将振荡器与 其他振荡器获得各种有趣的声音,这涵盖了合成器中发生的很多事情。