小故障:超越字节拍

毛刺起初是Bytebeat音乐合成器。 Bytebeat具有一些真正独特的功能:简单的概念,简洁的符号,肮脏的老式声音。 但是在同一点上,Bytebeat受其超简单性的限制。

如今,许多好奇的人都在尝试算法音乐创作和可编程音乐。 在大多数情况下,这意味着配置一些软件并学习一些新的编程语言。

Glitch的目标是将Bytebeat的简单性与功能齐全的可编程音乐环境的灵活性相结合。

Glitch的核心思想是从Bytebeat借来的-音乐家输入一个数学表达式,然后Glitch在每个离散的时间范围内对其进行评估,返回的值描述了波形的幅度。 假定输出在[-1..1]范围内,并且如果超出给定范围,则会对其进行裁剪。 您可以使用数学表达式,变量和一些函数。 一切都是数字,这意味着您可以通过将数字从一个函数传递到另一个函数来轻松组合事物。 现在,我们应该添加多少功能才能将Glitch变成真正的音乐编程工具?

震荡器

使用Bytebeat技术,将输入时间变量t转换为波形很可能会导致锯齿状或方波状,这就是为什么您会听到嗡嗡声的原因。 为了获得一些旋律,我们可能需要正弦和三角振荡器。 因此,Glitch现在具有一些振荡器功能:

  • sin(freq) -生成给定频率的正弦波
  • tri(freq) —生成给定频率的三角波
  • saw(freq) -产生给定频率的锯齿波
  • sqr(freq,[width]) -生成给定频率的方波。 也可以指定脉冲宽度。 默认为0.5。

所有这些功能可在内部提高振荡器相位,并以一种智能的方式应用频率变化,以减少咔嗒声。 例如,公式w =(t >> 10)&7,(tri(w * 220)+ sin(w * 220))/ 2 (单击以在Glitch中打开)将具有相同频率的三角和正弦振荡器混合在一起(随着时间t的增加而变化)。 在这里,我们将体积除以2进行归一化,以避免幅度溢出时产生嗡嗡声。

当一个振荡器的输出变为另一个振荡器的输入时,例如w =(t >> 7)&31,sin(100 * tri( w * 4)+400) 。 此处的w值(随时间在0..31范围内变化)是三角振荡器的输入,该三角振荡器会产生一个低频信号。 该振荡器的输出会修改外部正弦振荡器的频率,并在diapason 400..500 Hz中产生调频声音。

别忘了还有一个特殊的r([max])函数可以返回[0..max)范围内的随机数。 在某些情况下(例如合成鼓),它可用作振荡器。

调频合成器

生成调频声音的更好方法是使用特殊函数fm(freq,[feq,[f1,a1,f2,a2,f3,a3]) 。 该功能模仿具有以下拓扑的3操作员FM-合成器:

如果您不熟悉FM合成的工作原理,请在此处阅读更多内容。

fm函数大致等于sin(freq + a1 * sin(freq * f1 + a3 * sin(freq * f3))+ a2 * sin(freq * f2))

如果这个公式看起来很复杂,不要惊慌。 让我们看看如果将除频率以外的所有参数都设置为零,会发生什么。 在这种情况下, fm(440)sin(440)相同,您将听到一个简单的正弦波。 现在,让我们配置第一个运算符。 它影响主(载波)振荡器的频率。 第一参数f1是倍频器。 让我们将其设置为2,这样我们的振荡器#1将以2 * 440 = 480 Hz的频率运行。 另外,为了使声音可听,我们将幅度增益a1设置为1。我们得到fm(440,2,1)函数,该函数与sin(440 + sin(880))相同 ,您可以听到声音如何获得更高的音高和时间如何变化。 尝试调整f1a1参数,以了解它们如何影响主振荡器。

现在,您可以通过并行添加另一个振荡器(更改f2a2 )来增强合成器。 在这种情况下,这两个振荡器的输出将被求和,并用于偏移主振荡器的频率。 或者,也可以改用f3a3f2a2设置为零。 第三振荡器的输出将被转发到控制主振荡器的第一振荡器。 比较fm(440,0.5,0.5,0,0,0.5,0.8)fm(440,0.5,0.5 有何不同。 当然,没有什么可以阻止您为所有三个振荡器设置参数,因此,如果您听到有趣的声音,请随时分享!

这种FM拓扑结构很容易理解,可以构建基本的单操作员FM合成器,两操作员FM合成器O1 + O2O1(O3)以及更复杂的O1(O3)+ O2变体。 我是否提到过您也可以将多个FM合成器组合在一起,因为它们只是功能?

笔记

演奏单一音调很无聊。 让我们播放一些音乐。 但是我们怎么能写出没有音符的旋律呢? 好吧,我们可以使用频率…在Glitch的第一个版本中,有一个特殊的“数组”函数a(index,[a0,a1,a2,…])返回由索引定义的参数。 如果索引超出数组范围,并且它是您可以构建的最简单的音序器,它将溢出—例如, sin(a(t >> 10,440,523,659))通过A4,C5和A3播放简单的琶音循环E5笔记。

但是没有人想记住所有的音符频率。 这就是为什么新Glitch具有帮助器hz(note)可以返回给定音符的音符频率的原因。 零代表第四个八度音阶的音符。 您也可以使用浮点音符值来获取微调音乐。

另一个辅助函数是scale(note,[mode]) ,它在给定比例尺的给定位置返回音符。 默认模式是爱奥尼亚模式,这是传统的大比例尺。 模式1..6是dorian,phrygian,lydian,mixolydian,aeolian和locrian模式。 如果您不熟悉音乐理论,请记住零是主要音阶,而五个是次要音阶。 还有另外两个小调音阶-谐波小调(7号模式)和旋律小调8号模式。 吉他演奏者可能会检查五音阶:#9是大五音,而#10是小五音。 #11是布鲁斯音阶。 #12是整体音阶,而#13是八音阶。 高于13的值会退回到半音阶,即连续包含所有12个音符的半音阶。

音序器

用音符而不是音调来简化事情,但是我们也要考虑节奏模式,而不仅仅是数字数组。 因此,这里有两个音序器功能:

  • loop(bpm,…) —以给定速度循环其参数
  • seq(bpm,…) —与循环非常相似,但每个节拍仅计算一次参数

您可能会对这种差异感到困惑,因此让我们来看一些示例。

sin(hz(seq(240,0,5,9,5))) -以每分钟240拍的速度从大音阶演奏琶音。

现在,让我们播放嵌套的音序,例如播放两个互相改变的琶音。 如果您编写sin(hz(seq(30,seq(240,0,5,9,9)seq(240,1,6,6,10,6)))),您将听不到预期的结果。 这是因为seq函数仅对参数进行一次评估,并将其存储到节拍的其余部分。 将最外面的seq更改为循环可修复该问题。

根据经验,使用seq对普通音符进行排序,使用循环对内部序列进行调度。

seq内,您可以放心使用r()函数,因为它将被评估一次并且不会产生白噪声。 相反,它将为每个节拍返回一个随机数。 当内部序列比外部循环所允许的时间长时,使用loopseq还会产生有趣的副作用。 在这种情况下,内部序列将在每次调用时滚动。 您可以尝试使用不规则的速度比率以获得有趣的节奏模式。

声音形状

现在我们可以播放音乐了,但我们的振荡器音量不变。 您可以为信号提供一个包络,使其听起来像真实的乐器—具有打击(快速音量升高),释放(音量逐渐消失)和其他参数。 有一个特殊的可变参数函数env(signal,(dt,val),(dt,val)…) ,可以将信号包装成某种包络形状。 没有参数env(sin(440))会播放不变的正弦波。

使用所谓的打击乐信封(仅具有攻击和释放的信封)非常普遍。 在小故障中, env(sin(440),(0.5,0))变为淡出的500毫秒蜂鸣声, env(sin(440),(0.5,1),(0.1,0))的攻击时间为0.5秒,释放时间为0.1秒,听起来像是淡入和截止。 您可以提供更复杂的信封,例如env(sin(440), (0.01,1),(0.1,0.7),(0.1,0.3),(0.1,0)),这会导致快速攻击(10ms),在110毫秒时,音量为70%;在210毫秒时,音量为30%;在310毫秒时,音量将恢复为零。

现在,您可能已经注意到信封仅播放一次。 如何重置? Glitch中的所有函数均采用数字参数并返回数字。 但是,有一个特殊的“非数字”值具有非常特殊的含义,即-重置信封,效果和振荡器。 当拍子变化时,定序器会自动返回非数字值,并且该值会从一个功能传播到另一个功能,因此包络功能一定会收到它。

特效

为了使Glitch保持简单,目前只有一种声音效果可用-低通滤波器。 函数lpf(signal,[freq])切断低于给定频率(默认为200 Hz)的所有频率,并返回修改后的信号。 高通滤波器呢? 由于lpf返回的信号没有高音调频率-您可以通过从主信号中减去lpf值来构建高通滤波器。 您可以嵌套低通滤波器并多次应用。 您还可以使用某些低频振荡器改变截止频率值,并获得一些有趣的颤音效果。

混合信号

在音乐中,您可能会有许多乐器和零件。 如果仅添加它们的信号,也可以将信号的总和除以对其进行归一化,但是有一个特殊的辅助函数mix(…)为您完成。 根据输入的数量, mix添加它们并将其标准化。 它还柔和削波输出信号,以避免意外的过驱动效应。

摘要

这是所有可用的Glitch功能的完整列表。 我们添加了15个易于记忆和使用的功能:

  • 振荡器:sin(freq),tri(freq),saw(freq),sqr(freq,[width]),fm(freq,…)
  • 定序器:循环(bpm,…),seq(bpm,…),幻灯片(bpm,…)
  • 实用程序:a(索引,…),scale(索引,[模式]),r([最大值]),hz(注释),lpf(信号,[频率]),env(信号,…),mix(…)

总结一下我的理论故事-这是我最近与Glitch一起制作的一首快速演示歌曲:

Glitch 使用简单数学公式 的最小型 开源 算法音乐作曲家。 它易于学习(全都是算术表达式),易于使用(在浏览器中运行),易于共享(只需发送链接)。