
在这篇文章中,我将讨论基本的细胞自动机,它们的历史,为什么它们如此吸引人,以及我们如何从中提取一些音乐。 我还将看一下(以我的观点)什么是对这些超音速的有趣。
什么是细胞自动机?
广义上讲,细胞自动机是一个包含细胞网格的系统,其中每个细胞都有一个状态。 系统以不连续的时间步长前进,并且在每个新的时间步长,信元可以根据某些规则或条件(通常与相邻信元的状态相关)来更改其状态。 最著名的蜂窝自动机是Conway的《生命游戏》,它使用2D方格。 在以后的文章中,我将介绍一些我最喜欢的CA,但是在这篇文章中,我将讨论基本一维元胞自动机(ECA)。
- 我如何建立我的第一个网站。
- 新的iOS应用:MIDI手势
- 做雷米
- Spotify希望成为文化平台,而不仅仅是音乐; 玛丽亚·凯莉(Mariah Carey)的“圣诞节我想要的就是你”创造了Spotify记录
- 痴情,自由,快车:自动驾驶和泰勒·斯威夫特
基本细胞自动机
在基本细胞自动机的情况下,我们的“网格”本质上是一维单元格数组,每个单元格可以具有两种可能状态之一。 确定每个时间步长的状态变化的规则与单元本身及其直接邻居的位置有关。 因此,如果我们处于时间步t ,并且想知道在时间t +1位置n处的单元格的新状态,则需要查看位置n-1 , n和n + 1处的单元格的状态,在时间t 。 由于每个单元只有两种可能的状态,因此只有三种可能的方式可以配置三元组n-1 , n和n + 1 。 如果我们定义了这八种配置中的每一种可能发生的情况,则可以详尽地定义CA的行为方式。 通常使用颜色在视觉上显示状态,例如,一种状态为白色,另一种状态为黑色。 然后,可以通过显示这三个三元组以及它们产生的状态来轻松显示规则系统。例如,在以下规则系统中,我们从左侧的规则中看到,如果n-1 , n和n + 1为在t处全黑,则在t +1处n将为白色。 左规则的第二个规则表示,如果n-1和n为黑色,但n + 1为白色,在t + 1时 ,n将为黑色,依此类推。

如果我们从一行白色单元格的中心处的单个黑色单元格开始,并将此规则系统迭代应用约15个步骤,则会得到以下结果:

规则编号
继斯蒂芬·沃尔夫拉姆(Stephen Wolfram)(稍后会详细介绍)之后,通常会使用常规的编号系统来引用规则。 由于只有八个配置,每个配置可以有两个值,因此我们可以用8位数字表示所有可能的规则系统。 如果我们说白色为0
,黑色为1
,则可以用8位数字01101101
表示上面的规则系统。(即,black-black-black生成0
,black-black-white生成1
,black-white-black生成1
,依此类推)。 如果将其转换为以10为基数,则得到109,因此我们可以将此规则系统称为规则109。
一维基本细胞自动机的有趣之处是什么?
斯蒂芬·沃尔夫兰姆(Stephen Wolfram)在其2002年出版的《一种新型的科学》一书中对细胞自动机和宇宙的本质提出了非常强烈的主张。 这本书有些争议,我对沃尔夫拉姆的许多说法都不了解。 关于这本书,我要说的两件事是,其中的许多绝对令人着迷,而其中的许多却非常令人发指。 我将以Wolfram的说法大为削弱,我认为大多数人都可以同意。 他声称,从根本上讲,过去,我们倾向于总是假设复杂现象仅就复杂的底层系统而言是可以理解的,例如,使用偏微分方程来解释流体动力学。 正如我们可以轻易看到的那样,基于算法的系统(如元胞自动机)可以非常简单,但是却产生难以置信的复杂结果。 这是规则126( 01111110
)的图像,该规则生成称为Sierpinski垫片的分形图案:

如果仅切换第4位,则得到规则110( 01101110
)。 规则110具有可预测的周期性成分,但其他部分则是混乱的,也就是说,除非实际推导了推导中的每个中间步骤,否则都是不可预测的。

在个人层面上,我发现这些内容非常有趣,而探索CA是我学会编写代码的原因之一。 我写过的第一个重要程序就是用纯数据语言对ECA进行音乐化处理,可以在这里找到。 从那时起,每次我学习一种新语言时,我的入门项目就是实施某种CA(通常是ECA)。 除了Pure Data,我还用Java,Python,Chuck,SuperCollider,Swift和JavaScript实现了音乐ECA。
细胞自动机的声化
在对ECA进行声音处理时,通常会采用两种基本方法,一种是生成可用于控制的参数,例如合成器。 另一种方法是将单元状态映射到音乐事件(MIDI音符,鼓样本等),这是我深入研究的方法。
这些事件可以通过多种方式进行映射。 例如,我们可以取一个由8个单元格组成的网格,并从左到右依次播放它们,黑色单元格表示事件(例如击鼓声),白色单元格表示休息。 这8个单元格的网格将生成一个单一的节奏小节-从中我们可以得出第二个小节,依此类推。 如果我们拥有一个带有许多状态(即,没有ECA)的CA,可以将每个状态映射到不同的音调,则这种方法会更有趣(我将在以后的文章中使用模块化算术CA探索该示例)。
另一种方法是将每个单元格映射到特定的音高或样本,如果该单元格是黑色的,则播放该音符或样本,而当其为白色时则不播放。 在推导的第一步中的所有相关事件将同时播放(或停止)。 当我们以正常速度进行推导时,我们会根据该步的状态触发或停止音符。 这种方法使我们能够听到推导中可能出现的循环模式。 这或多或少是WolframTones采取的方法(这是一个令人着迷的虫洞,但实际上发生的事情可能令人沮丧地变得不透明)。
如何映射细胞?
这给我们留下了如何映射细胞的问题。 如果单元格的数组很短,我们可以将每个单元格按比例尺映射到音符,例如C大调。 第一个单元格为C,第二个单元格为D,依此类推。 这基本上是可行的,但是我们有许多规则集,这些规则集可能导致同时存在多个相邻单元,从而导致一些严重的簇弦。 总的来说,我发现在这方面使用五音阶更安全一些。 另一个听起来不错的选择是将每个像元按比例尺映射到下一个全音阶,例如,第一个像元是C,第二个像元是E,第三个是G,然后是B,D,F,A,最后是C两个八度音阶。 这为这些群集提供了更多的空间。
如果我们有一个小阵列,这很好用,但是在大阵列上会出现视觉上有趣的CA,分形等,因此很快就会用完音符。 如果我们有7个包含一个八度的单元,那么100个单元将超过14个八度–我们没有足够的音符。 大多数人(例如WolframTones)为此采取的解决方案是使用大型阵列生成CA,但只能对其中包含的5-15个单元窗口进行声处理。
这是我使用此方法制作的CodePen(单击CodePen应该可以在此处的页面中运行它)。 它会让您听到这些结果。 您可以使用左右箭头键移动窗口。

另一方面,规则105和150具有更多的本地模式,因此我们可以在此处轻松设置一个窗口(或几个窗口)并获得一些有趣的模式。


从随机数组开始
到目前为止,我一直在显示的模式都是从一个“ on”单元开始的。 如果我们从on单元的随机数组开始,那么这些规则中的许多规则都会生成可在本地窗口中观察到的事件,通常会显示特征性重复出现的数字。 但是,确定这些图形如何组合的系统仍然是全局的,而不是局部的,因此,即使模式是可区分的,仅考虑局部窗口,结果仍然相当混乱。 以下是此类规则的一些示例:



我最喜欢的规则:109/73
但是我遇到了至少一个规则系统,其中本地模式既是独立的又有点有趣,这就是规则109(在某种程度上也就是规则73)。 对于此系统,随机数组将快速形成多个独立的局部重复模式,由于规则的左右对称性,它们不会相互干扰。 一些模式是稳定的单个开或关单元,但是许多模式是具有变化周期性的较宽边界模式。 重复周期为两个,三个和四个的小模式很常见。 每5、10、11、12步重复一次的较宽模式并不罕见。 这是两个示例推导:

在上述系统中,我们有重复的部分,其周期分别为18、2、24和3。

这里有8、12、3和2的重复周期。
我发现通过移动正在收听的单元格窗口,我们可以使其跨过具有不同周期性的多个模式,从而创建有趣的多用表。 例如,如果上图的最左列的周期为8,右邻的周期为12。如果我们将两个窗口的一部分都包含在一个窗口中,则我们有一个带有周期的“元模式” 24个,其中将包含3个左侧模式的重复和2个右侧的重复。 这些节奏听起来很酷。
我在旧的Github Repo中编写了一些用于探索此规则的SuperCollider脚本。 我让窗口自动遍历数组,检测它何时发现重复的模式,让它播放两次或四次(取决于长度),然后向右移动一个单元格。 这样一来,它就可以快速跳过琐碎的部分,并在有趣的地方花更多的时间。 这是一个视频演示。 这些视频没什么好看的(很抱歉,音频有点安静),但它产生了一些非常酷的节奏:

我承认,这没有太多的音乐应用。 但这很酷,如果您读过这篇文章很深的话,您可能是那种会觉得有趣的人–所以我想与您分享。