绘画音乐:Pure Data中的棺材舞

编程和模因


编程是一个濒临科学和创造力的过程。没有精心设计的程序,计算机就是无用的设备,会耗电。大多数现代专家都使用声明性符号语言-他们使用文本命令编写程序:简单-赋值,乘法;复杂-检查条件,循环执行例程。

但是并不是所有的编程语言都旨在解决系统问题。有些是为培训,演示和数字表演而创建的。当性能和功能逐渐淡出背景时,诸如Pure Data可视化编程环境之类的原始解决方案应运而生。

2020年,来自加纳的达达·阿乌(Dada awu)机构葬礼仪式的录像带中的舞蹈成为了俄罗斯最受欢迎的模因。今天,我们必须使用算法声音描述“纯数据”环境逐步创建传奇的音乐主题“棺材之舞”。

关于视觉编程


通过视觉编程,习惯上理解使用功能性图形元素描述用于计算设备的程序的过程。因此,在Visual Studio开发环境中使用WPF表单设计器可以称为界面的可视化编程。平面设计师与第一批个人计算机一同出现。现在,在计算机科学课程中,一些学校正在研究Visual Pascal。无需编写任何代码即可完成1C中一半的标准改进。

但是后来出现了成熟的可视化编程环境。在创建仅由图形命令组成的编程语言时,会出现许多困难,因此必须缩减语言本身的功能。
因此,程序员自然会在C ++代码的不同部分多次调用同一子程序。在图形环境中,子例程调用可以例如由从主程序文本中的对象到对象子例程的箭头表示,并且当此类箭头太多时,图形代码将变得不可读。教育开发环境的开发人员通常会自己施加限制(调用次数,程序中的对象,使用的变量),以保护用户并使可视化的编程过程更加可视化。
一个简单的Sanscript程序的示例:

图片

但是,如果您从广义上分散了编程的注意力,那么您会发现重要的应用问题,这些问题在图形上比在符号中更容易,更有效地解决。一个这样的任务:虚拟仪器的描述。早在上世纪80年代,大多数音乐唱片就被制作成现场音乐。数字合成器的音质不如声学乐器,真正的“音乐”数字系统价格昂贵。

随着VST技术的引入,一切都发生了变化,VST技术于1996年引入,是一个庞大的声音处理库。功能性VST使我们能够描述真正的数字合成器,效果处理器的体系结构,并非常准确地在计算机上模拟其工作。但是,只有一支合格的程序员和声音工程师团队才能构建这样的描述。创建自定义虚拟乐器的问题仍然存在。

在那些年里,为了在业余爱好者中普及声音合成,出现了实验性的Pure Data项目-一个专注于简单合成器描述的可视化开发环境。在Pure Data周围,由一群“粉丝”组成,他们在FB,Youtube中推广视觉编程:他们编写和翻译了培训材料,发布了合成器示例,并在一个补丁上混合了整个音乐(这是Pure Data程序的名称,类似于模块化硬件合成器中的补丁。 )但是环境尚未在世界范围内得到广泛分布。

纯数据基础


可以从官方网站免费下载Pure Data开发环境。该程序是开源的,可供Windows,Linux和MacOS X的用户使用。安装并运行Pure Data。在“文件”菜单中,创建一个新补丁。将出现以下编辑窗口:

图片

“放置”菜单包含一个图形对象列表,我们将从中创建第一个合成器。选择适当的项目后,该元素将添加到当前修补程序的图形字段(画布)。可以编辑元素(更改会影响其行为的签名以及移动元素)并通过线连接(通过在源对象的输出之一上按住鼠标左键,将光标移动到目标对象的输入并释放它)。例如,我们将使用名称键创建一个“ Object”类型的元素和一个“ Number”类型的元素。元素的输入以黑色突出显示,并位于元素本身框架的上方,而输出则位于其下方。将键对象的输出连接到Number元素的输入。
我们得到:

图片

一直以来,我们都处于补丁编辑模式。要进入运行模式,请转到“编辑”菜单,然后取消选中“编辑模式”项。轮廓上的鼠标指针应从手变为箭头。现在按主键盘上的任意键。我们将看到按下时Number的值如何变化:

图片

让我们分析补丁的结果。将名称键分配给对象后,它具有一个输出,但没有输入。具有此名称的对象每次在运行时被按下时都会监听键盘并发送键代码。 Number元素具有一个输入和一个输出。以数字作为输入,数字将其显示在屏幕上,并将相同的值发送到输出。请注意,松开键后,数字将继续显示。这表明输入保留了它们接受的最后一个值。

返回编辑模式并添加另一个名为sel 49的对象。它将具有两个输入和两个输出。每当值到达一个输入且该对象与存储在另一个输入上的值匹配时,此对象就会向第一输出发送信号。如果输入接收到的不是累加值,则信号将发送到第二个输出。 sel名称的第一部分指定对象的类型,第二部分49-写入第二个输入的默认值。 49是键码“ 1”。

信号是一种特殊的数据类型,不能简单地输出,例如,通过将Number发送给输入。但是借助信号,您可以“开始”某些元素的工作。

返回“放置”菜单,然后将“爆炸”元素添加到我们的补丁中。将Number输出连接到第一个sel 49输入,将第一个sel 49输出连接到Bang输入。我们将收到以下补丁:

图片

我们将进入执行模式。通过按各种键,它们的代码将出现。当您用代码49按下“特殊键”时,sel对象将生成一个信号,当按下bang按钮时,它将自动按下该

图片

信号:在运行模式下,bang对象在其唯一输出处生成信号,该信号或值会击中输入。向我们的项目添加一点声音。为了使修补程序能够正确处理音频数据,“媒体”菜单的“ DSP开启”项目对面应带有一个选中标记。您还需要进入Midi Settings菜单并安装输出设备。在Windows上:

图片

单击确定,然后返回到编辑模式。要使用Midi信号,最常使用2个元素:makenote和noteout对象。添加一个这样的对象,并创建具有以下值的多个Message消息:

图片

Message是具有复杂行为的可视化编程的元素。如果该消息被称为某个号码,则通过单击该消息或在其输入处接收到信号后,将同时输出该号码和信号。

注释对象在第一个输入上接收到值时,会在MIDI通道之一上产生声音。通道号可以在对象名称(在我们的情况下为1-钢琴)中明确指出,或转移到第三个输入音符。第一个输入采用中音表示的音高:(60-这是第一个八度音阶,然后+1-增加半音调,-1-减少半音调),第二个输入-音符描述:音量,持续时间,声音产生的性质。
makenote对象接收到第一输入和第二音量的音高(0-静音,127-最大音量),将音高转换到第一输出,并在第二输出上生成第二输入音符的音符描述。第一个和第二个makenote输入的默认值在对象名称之后立即指定。如图所示连接元素,然后进入运行模式:

图片

单击一条消息时,将发出与消息名称中音高相对应的音符。 60-注意,62-重新,67-la。现在处于编辑模式,将选择器(sel对象)的第一个输出与消息60连接。再添加2个选择器,它们具有键盘上键2和3的代码,并获得最简单的合成器:

图片

按makenote中的1-3键将以适当的音调发送一条消息,并且会发出音符。在下一节中,我们将尝试描述一种复杂的旋律,当仅发送一个信号时,将逐个音符顺序播放。

重塑棺材之舞


音乐


要描述复杂的旋律,我们需要研究2个重要对象-Metro和f,以及许多辅助对象。考虑一个简单的例子:

图片

Metro对象具有两个输入。接收到第一个信号。除停止以外的任何信号都包括节拍器。要禁用,请使用带有文本停止符的消息的输出信号。第二个输入Metro的间隔以毫秒为单位。当节拍器打开时,它将立即向其唯一的输出发送信号,并每n毫秒重新发送一次信号。间隔n可以由对象名称中的默认值指定,也可以传送到第二个输入。进入运行模式后,我们可以使用节拍器上方的爆炸按钮启动节拍器,并查看每0.4秒如何按下节拍器。通过以新的间隔发送消息,我们将加快或减慢发送信号的频率。发送停止消息后,信令停止。

回忆棺材舞的音乐:


主旋律可以通过一系列的音符和第8个持续时间的暂停来描述,即在4/4中有8个小节。因此,我们需要组织将第64个信号循环发送到相应的音符消息。为此,请使用对象f。

浮点数中的F代表实数变量。对象f有两个输入。在第二个输入处,您可以提交一个数值(例如,来自消息的输出或Number的输出),该数值被写为变量的值。默认值为0。在第一次进入和退出时,情况会有些复杂。考虑一个例子:

图片

因此,我们发现“按F致敬”和“棺材舞”这两个模因之间有着神奇的联系。让我们切换到运行模式。当您单击消息3时,该值将被写入对象变量f,但是在数量上我们看不到这一点。如果使用bang按钮将信号提交到第一个输入f,则在Pure Data方面会发生迭代,即:

  • 输出f将发送变量的当前值(3)
  • Object + 5将在第一个输入上接收数字3,并将返回两个输入8的总和(此处,第二个输入的值在名称+加法对象之后默认设置)
  • Object%40将在第一个输入上接收数字8,并返回将8除以40的余数(默认情况下设置第二个输入的值)
  • 变量f在第二个输入上将收到(3 + 5)%40 = 8的值,迭代完成。

因此,在第一次迭代之后,我们在输入数字处看到值3,并且变量f的实际值为8。在下一次迭代中,数字将得到较早保存的8个数字,f将再增加5并获得值13。当涉及到输出38的迭代时,变量f的值为(38 + 5)%40 = 3。因此,f值和输出值将循环重复。使用加法和除法模可让您获得一个具有任何周期和任何值的循环进行迭代。

将节拍器输出连接到第一个输入f,并在输出f上设置几个选择器和按钮。启动节拍器,看看按钮是如何依次点亮的,并且在自动按下最后一个按钮之后,循环重复进行。补丁:

图片

为了使循环每次从值3开始运行,我将停止消息的输出连接到消息3的输入,并将消息的初始值发送给f。

让我们描述一下旋律。为此,请创建一个干净的音色,并以230的间隔(正好230毫秒,持续一段八分音符)和一个64音符的周期来描述节拍器。为了选择值,我们使用变量f和新元素moses为其功能,下面将对其功能进行描述。我们还添加了一些makenote对象,带注释的消息,带通道1(钢琴)和10(鼓)的注释,并将每次迭代的moses选择器与相应的注释组合在一起。获取补丁:

图片

如您所见,在可视化编程中,大量对象的使用降低了程序的可读性。实际上,补丁是简单元素的组合。考虑以下“例程”:

图片

Moses对象在第二个输入上存储一个数字,该数字可以默认设置。如果第一输入接收到的数字小于第二输入的存储值,则从摩西的第一输出发送信号,否则从第二输出发送信号。因此,摩西1的第一个输出的行为类似于sel 0的第一个输出。让我们来看一堆+ 63%64.它使您可以将循环中的值减少一个。如果输入了一个,则输出将为0,对于输入0,输出将为63-我们将获得相反顺序的64个元素的循环。如果我们将此束的输出连接到下一个结构+ 63%64的输入并将moses 1连接到每个束的输出,但是对于f的64个可能值中的每一个,恰好一个moses将向第一个输出发送信号。因此,数字7需要减少7倍,减少1,要获得0,则第7次迭代的第7个摩西1将在第一个输入上接收0,并向相应的音符发送信号。如果对于64个选择器,您需要手动编辑参数的默认值,则可以复制例程+ 63%64摩西1并将先前%64的输出连接到输入+ 63,以获得复杂的64位循环选择器。

旋律补丁使用注释对象的重复项。此技术使您可以绕过极限标记增加音量。因此,如果将相同的makenote 67 127连接到2个noteout 1,但是从第一个makenote输入发送信号时,音符la(代码67,第一个八度)将以127 * 2 = 254的音量播放。Pure Data中的MIDI乐器非常安静,因此此技术可用于创建合奏旋律(在我们的示例中,在通道1和5上演奏2架钢琴,在音量为三倍的架子鼓10上演奏)。

为了修饰模拟(在运行时在补丁代码的对象之间移动数据的过程),使用重复的按钮很方便。在上面的示例中,它们的6个爆炸对象具有“播放”按钮的轮廓,当在右侧按下极端爆炸按钮时,该轮廓会自动突出显示。爆炸信号处理是一个资源密集型过程,但是在下一节中,我们将放置一整排这样的按钮,并尝试在它们的帮助下描绘视频中的舞蹈。

动画


对于动画,我们需要所有相同的变量f,对象-算术运算符和节拍器以及选择器。这次我们只需要8帧,因此我们将使用sel对象。从爆炸按钮创建一个20x10的字段(我们将使用复制操作)。将带有旋律的音色放置在中央之后,我们得到下图:

图片

您可以简单地将每个选择器的左输出连接到应在该帧上按下的按钮,并将节拍器的信号发送到周期f的新变量的输入。但是这种方法有两个缺陷:

  • 每帧0.23秒-对于我们的舞蹈来说太快了。第二个节拍器的使用将使我们不满意:音符和砰砰声对信号的响应有不同的延迟;
  • 从收到信号的那一刻起,按钮将保持按下状态0.05秒,这意味着在剩下的0.18秒内,动画的“屏幕”将为空白,并且循环中的图片将闪烁。

为了解决这些问题,我们使用除法。以下结构:

图片

取主循环旋律的输入f值。除以2后,我们得到了帧变化的减速:对于0和1,将显示帧1,对于2和3,将显示帧2,依此类推。对于每一帧,仍然每0.23秒发送一个信号。现在让我们使用另一个循环:

图片

为了与主旋律同步,添加了一个延迟:包含信号首先从选择器通过按钮,然后才到达节拍器的第一个输入。现在,如果您创建一个爆炸并将其输出连接到特定帧的所有像素按钮,则上方的帧可以每0.046秒突出显示该帧,这比按钮的更新频率快,即该框将持续点亮,直到下一帧改变为止。由于0.046 * 5 = 0.23秒(帧选择器的周期),因此5次迭代的周期可确保帧不会分层。

制作动画时,计算机经常崩溃,但设法绘制了5张不同的图片,并从中按顺序创建了8帧的循环:

1 2 3 2 1 4 5 2

在编辑模式下,带有棺材之舞的最终补丁(添加了许多装饰元素-添加了按钮和注释):

图片

很难在这张地狱图片中解析模拟的源代码,但是补丁正常运行:

图片

在第121个位置的右下角,有一个计数器用于自动停止播放器笔记。最初,应该使用48x24像素的动画,但是计算机断然拒绝了它,同时悲惨地听到了冷却器的轰鸣,并意外地以安全模式重新启动了Windows。视频末尾附有来自艺术家LikaLou的原始像素艺术48x24。因此,经过3天的“绘画音乐”,我们在纯数据中有了棺材之舞:


结论


模因的可视化编程是一项有趣的活动,尽管它会花费很多时间,并且有时会破坏您的硬件。即使这样看似简单的葬礼舞蹈任务也需要模块化的方法来创建程序,不仅要了解实现语言的特征,还要了解开发环境的特征。

使用Coffin Dance的示例补丁,您可以判断视觉编程的开发水平。如果方便的开发环境,有一些图形语言可以很好地处理一些应用程序任务。但是可视化编程行业总体上还处于起步阶段。

参考文献


Pure Data官方网站Pure Data中
的视觉编程基础
关于
Wikipedia上的VST标准Coffin Dance文章,
Coffin Dance in Pure Data:原始视频

All Articles