🥥Python音乐合成器
Last updated
Last updated
Python | 合成器 | 音乐信号 | Matplotlib | seaborn | Numpy | 振荡器
首先,音符是数字声音将产生的声音。简而言之,数字声音只是从计算机以一定速度传送给扬声器的数字序列。
关于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个采样。
这是它的外观: