简要地
这是一个基于Web音频API的实验,向用户展示了一系列音序器。 设置了排序按钮的大小,因此无论是按钮还是像素,都感觉模棱两可。 用户可以四处走动,这将导致序列。 每种颜色都代表一个音频文件,它会在许多音序器中重复,这是因为每个音序器都有自己的音色,运行速度和长度。 所有的速度和长度都是2的幂,因为意图是使循环,而4/4的度量是最容易理解的。
在GitHub上查看,或尝试运行的示例,多人游戏版本,或我博客上的此文档。 一个很好的入门方法是打开窗口,然后只需将光标拖动一次。
概念
在这里,我尝试使用来自不同音序器的同一声音的多个引用。 这种交互的有趣之处在于,您可以生成分形模式,而不必显式声明音符的每个实例。 为了进行这个项目,我遵循自己的直觉,从未计划太多。
分形图案
用一个例子更容易解释这个想法。 电子舞曲的最标准,基本模式如下:
(在表达式中,N代表步骤号)
小军鼓,每8拍`N%8 == 0`
踢,每四拍`N%4 == 0`
踩hat,每秒钟跳动一次’N%2 == 0′
这样就创建了一个非常简单的图案,没有张力。 因为我们以非常正交的方式突出显示最强的度量:如果度量是因子2的倍数,则它是一个强度量。 它是“最强”的因子,乘数从到。 换一种说法,
N%2 ^ S
其中S是此强度因子。
可以将其应用到4/4以外的其他度量。 用小节拍替换2。 例如,一个3/4小节的分形图案将是“ N%3 ^ S”。 我们可以轻松地制作一个音序器,每个小节只有一个节拍参数。 分形节奏的一个很好的例子是Risset模式。
张力
现在,我们当然不想创建分形图案:它们很无聊。 我们希望通过在强度较低的小节中设置事件来带来某种音乐上的紧张感,同时保留强度相同或更高的静默小节,从而产生这种不平衡或紧张感。
在16步音序器中,我们将编程一些非常正交的序列(遵循%2 ^ s规则),最重要的是,一些其他序列将不遵守这些规则。 与正交序列相比,非正交序列张力表现得最好。
转换为界面
我使用的大多数音乐创作界面都旨在避免交互上的冗余。 就音乐创作界面设计而言,对于一个相同的事件触发器具有两个不同的音序器,这是荒谬的。 有点像一架钢琴的一把锤子有两个键。 另一方面,我想尝试一个可以鼓励用户制作分形图案的界面,在该界面上,正交节奏的图层将覆盖较低正交节奏的图层。 巨大的灵感来自于GeinōYamashirogumi集体的Akira Ost主题
这就是每个声音控制都是多余的原因:对于每个样本,可能有任意数量的音序器。 关键是,根据N%2 ^ S公式,每个音序器的运行速度都不同。 这意味着对于相同的音色,如果用户在某些音序器中启用了所有事件,则事件将在每个半小节,每个小节,每两个小节,每个小节的十六分等等上发生。
我希望用户在任何会话上都可以创建大量事件,并且这种想法是为了鼓励用户通过界面进行操作,因此音序器按钮的控制工作在“画笔”模式下,这意味着用户可以拖动鼠标并在整个过程中创建事件所有鼠标路径,给人一种类似于MsPaint的使用感觉。 这就是为什么我不得不选择构建自己的用户界面片段的原因:我能找到的大多数片段都不允许对交互的细微差别进行如此详细的控制。 同样,当我完全研究两个因数(使用4/4度量)时,启发了我运用复古技术美学。 使用CSS属性可以轻松实现Windows 95样式。 因此,Windows 95的装饰风格为交互式作品。
从制作这些交互式片段的过程中,我发现制作干净代码的意图通常不利于探索过程。 在某些情况下,人们对要实现的目标有一个总体规划,并且知道所有细节。 在这种情况下,最好的办法是制定一个宏伟的计划,并开始有序地制作所有原型。 在JavaScript的情况下,这意味着将开始使用清晰的模块,并开始使用诸如Gulp和Browserify之类的转译管道。 该项目的情况恰恰相反:我不清楚探索将带我到何处,甚至不清楚我将使用什么技术。 我做了很多尝试以这种有序的方式启动该项目。 首先,对代码整个结构的关注是从探索过程本身开始的,因此,我常常以结构良好的代码结束,但是并没有取得任何有趣的结果。 碰巧的是,当我感到突然的直觉时,结构良好的代码也不允许我重新构建某些东西。 对于这个探索过程,最适合我的技术是仅在一个JavaScript文件中启动整个项目,一旦它变大,我就将其拆分,但是所有原型都保持全球化。 我很小心地创建一个包装器函数来与每个抽象或可见实体相关的实例。 滥用全局变量的软件无法走得太远,因为代码变得不可读,并且无法跟踪其更改。
声音设计
节奏音序器最明显的声音设计是类似于流行音乐鼓的声音,就像八十年代的所有商业音序器一样。 这种打击乐器的两个问题主要是我们非常习惯于某些模式。 这意味着通过使用此工具包,我们的直觉将始终使我们模仿这些工具。 我们甚至对听起来相似但不相同的事物感到厌恶。 感觉好像该模式试图模仿我们习惯于听到的其他模式,但被认为是“错误的”。 我需要避免的正是这种对与错的观念,以便让玩家在没有先入为主的情况下进行探索。 我会说我选择设计一套打击乐器而不是一套鼓。
多人游戏
我还开发了两种协作游戏模式,即所谓的“多人游戏模式”。 第一个假设每个播放器都使用带有鼠标,扬声器和屏幕的类似网络浏览器,并为每个播放器提供相同的界面。 来自每个电镀程序的交互被传输到节点服务器,由服务器存储,然后以每个客户端将侦听相同模式的方式从服务器广播到所有客户端。 第二种多人游戏模式假设有一台计算机显示完整的界面并产生声音,而玩家则将使用手机并从中央计算机收听声音。 我专门设计了这种模式,以在2016年Dash Festival中展示它。
设计多人游戏的第一种模式时面临的挑战是音序器之间的同步。 在任何客户端的计算机上,除非已编程一个音序器,否则音序器将不会运行。 这意味着每个音序器的第一步都不会限制于任何特定的度量倍数。 我以这种方式设计了它,因此结果模式会有更多变化。 这就带来了一个问题,即如果某个模式在一个播放器的浏览器中很有趣,那么如果另一个播放器稍后连接,它将同时接收所有模式,因此所有模式的第一步都将同时发生,并且产生的模式会导致第一个播放器的浏览器与第二个播放器的浏览器不同。 为了解决这个问题,我对全局节拍器中的节拍进行了绝对计数(首先,每个音序器从程序开始就拥有自己的节拍数),并且当任何音序器启动时,它将计算相对于绝对节拍的位移倍数,并将其添加为位移变量,依次评估步长。
第二种多人游戏模式(与智能手机一起玩)显示了玩家音序器与产生的声音之间关系的挑战。 尽管每个玩家都有四个音序器,这些音序器清晰地显示在屏幕上,具有相同的颜色并响应了玩家的输入,但每个玩家都很难理解他的音序是如何真正影响最终图案的。 最终,碰巧玩家输入主要是随机成分的随机性来源(在单个玩家版本中也经常发生)。 我认为虽然单人游戏版本可以随机运行,但在社交互动的背景下却没有太大意义,因为如果无法有目的地选择他的成绩,那么与玩家互动就没有意义了。而不是只听别人的作品。 此外,如果演奏者无法理解他的互动和声音之间的关系,那么我本可以为构图获取一个完全任意的数据源,其结果将是相似的。 在这方面,唯一积极的方面是相互作用和结果之间的关系(尽管太难理解了)显然是直接和一致的。
当不止一个音乐家使用许多机器演奏时,即兴演奏的专业音乐制作硬件中也会出现此问题。 一台机器长时间播放同一声音可能会发生,或者每个演奏者都认为该声音是另一声音的意图,或者两个人都不知道哪个机器在产生某种声音。 我从中了解到,声音用户界面很容易反映声音控制器的状态或合成器的状态。 真正困难的是,界面还综合地反映了系统的实际声音结果。 我认为,要想更好地理解这个想法,每个玩家都需要
- 一种非常独特的声音,其交互作用清晰可见(这使整个声音表达限制了协作表演的概念)
- 在任何给定时间,与作品互动的用户数量应有限,因此,几乎没有声音可以区分自己的作品。
- 在此之上,应该有一个非常清晰的综合视觉反馈,它将某种声音与某种声音控制器相关联。
技术细节
依存关系
- 音调Js,用于处理声音事件触发器,节拍器和样本加载。
- Nexus ui,专门用于在屏幕底部显示波形。
- jQuery,因为所有排序器,按钮和滑块都是DOM元素。
- 节点,对于多人版本
- MsComponents,实际上不是依赖项,但我正在努力将交互元素转换为库。
音序器
该程序从创建Tone.Js Samplers开始。 创建每个采样器后,将在窗口中创建滑块和波形控制器。 音序器是独立于采样器的实体,因为每个采样器可能有多个。 节拍器功能遍历每个音序器,如果当前测量值与音序器的步调相对应,它们将触发一个步骤。
每个音序器的长度和节奏都不同。 长度是事件的数量。 速度是推进音序器的一个事件所需的测量量(即,速度为4表示每个事件之间有四个测量值)
this.len = Math.pow(2,(seqProg%5)+1); //长度
this.evry = Math.pow(2,(seqProg%4)+1); //步伐
调音台和范围选择器
下面显示的面板具有一系列按钮,垂直推子以及用于循环起点和终点的选择器。 按钮和推子纯粹是由DOM元素制成的,许多交互事件都附加在DOM元素上。 开始和端点选择器是从Nexus UI库模块中提取出来的,并绘制在画布上。 所有这些都是在加载每个声音文件时构造和创建的。
声音的产生
该套件完全使用Native Instruments的Massive合成器制作。 我利用了以前的工作,在该工作中,我设计了一个大型的鼓组,并更改了该鼓组的一些参数,以便尽可能消除与鼓组的关联,同时保持不同声音之间的区别。 这就是为什么MsCompose套件在某种程度上类似于鼓的原因,因为它存在一些基于低音,基于振荡器的声音,同时也存在一些基于滤波的噪声的声音。 整个套件的特性是通过使用梳状滤波器(我怀疑是高反馈延迟,加上高谐振低通)和带通滤波器来实现的。 我还选择了非常电子的发声振荡器,例如三角波或方波,而非正弦波的自然声,这非常适合梳状滤波器。