Jack&Jill:MIDI音乐即兴演奏和生成音序器

我最近完成了一个名为“ Jack&Jill”的基于Arduino的附带项目,所以我想分享自己的经验。

Jack&Jill是一个小盒子,可以生成量化为音阶的MIDI音符。 它会产生伪随机音乐,偶尔会重复播放。

您可以在这里听到并看到它的作用:

当我听到由Arduino触发的Ableton Live播放声音时,我就迷上了! 我注意到随机生成的音符听起来很无聊,所以我决定构建一个随机音符生成器,​​该音符也可以将音符量化为音阶。 杰克和吉尔出生。

它是如何工作的?

有两个即兴演奏者和一个指挥。 杰克在MIDI ch上输出音符。 1和MIDI ch上的Jill。 2.通常,杰克输出低音音符,而吉尔输出更高的音符。 该范围可以通过“范围”电位器来改变。

指挥者确保即兴演奏者及时演奏,但最终由即兴演奏者决定演奏哪些音符以及演奏频率。

每个改进器都有两个属性:稀疏性和强度。 稀疏度决定音符的频率和密集度。 强度决定演奏音符的力度或力度。

每个即兴演奏者都遵循乐谱。 有8种音阶可供选择:大调,谐波小调,五声调大调,五声调小调,全音调,
阿拉伯,匈牙利吉普赛人和东方人。

即兴创作的要素

这是一个有趣的话题。 通过算法生成音乐时,最具挑战性的部分是使声音听起来好音乐。 但是什么使某事“具有音乐性”? 什么是音乐? 是什么使某些音乐变得有趣,而另一些则没有呢? 因为它是如此主观,所以几乎不可能回答。

也就是说,以下是一些我发现有用的准则:

  1. 变化重复之间找到平衡。 当事情永远重复时,人们会感到无聊,但是当事情永远不会重复时,人们就会感到不安。
  2. 时机和速度会有所不同。 不完美是使音乐变得人性化的原因
  3. 开箱即用。 偶尔可以玩偶然的事 (音符不会落在音阶上)。
  4. 跟随紧张和释放的潮起潮落。 增强紧张感,然后释放它。 冲洗并重复,但不要过度使用。

我仅合并了第1点和第2点。即兴创作者有时会重复主题,以使事情变得有趣。 另外,速度在音符之间随机变化。

早期阶段

我开始在纸上画出想法。 最初,我同时考虑了硬件和软件。 这效率低下,令人沮丧。 决策瘫痪使我不知所措,瘫痪了。

我决定退后一步,专注于一件事:简单性。

简洁对我很重要,原因有两个:

  1. 在早期阶段不必花太多时间来帮助我保持专注。
  2. 作为用户,我更喜欢简单的界面,其中每个参数都可以直接控制而不需要菜单潜水。

简单的麻烦在于它很难。 真的很难。 即使我的直觉说“保持简单”,我的头脑也一直说“再增加一件事!”。 部分原因是我真的很兴奋,想尝试各种各样的东西。 保持简单最困难的事情是对自己的想法说“不”。

我的第一个设计想法是要控制不少于16个参数! 它还有大约32种秤可供选择。 还有一个带有128×64 OLED屏幕的完整菜​​单,整个东西都是使用Arduino Mega构建的。 我所做的与简化相反。

我也开始使用旋转推编码器和8×8 LED矩阵分散注意力。 不用说我要钻一个兔子洞,那不是很漂亮。 在这段时间里我学到了很多东西,但是我知道我走错了路。

当我接近功能性软件时,我开始考虑硬件设计(这对我来说是很陌生的软件工程师)。 我尽可能地开始使用Googling和YouTube-ing。 我给一些我最喜欢的音乐设备公司发了电子邮件,并寻求建议。

(感谢OTO Machines,BASTL和Critter and Guitar的帮助!)

经过数小时的研究,我决定使用激光雕刻机(受Amanda Ghassaei的Arduino Waveform Generator启发)制作带标签的木质外壳。

这次,我在当地的Techshop上了激光蚀刻和雕刻课程,开始学习PCB设计并在Fritzing设计了电路。 此时,未知数的数量开始变得太大。 我告诉自己,如果不进行简化,我将永远无法完成这个项目。 正如他们所说:“做胜于完美”。

这是一个周末/周末的项目,所以时间不是我的奢侈。 我决定暂时放弃PCB,并坚持在Adafruit的Perma-Proto板上手动构建电路。

我给自己的下一个任务是弄清楚如何将Arduino移到面包板上。 我发现本文和该视频是有用的资源。

后来我才意识到Arduino Mega的微控制器仅以SMD形式提供。 在这个时候,我是焊接的新手,更不用说SMD了。 因此,我决定简化该项目并将其移至Uno。

我开始使用Mega的主要原因是要有多个输入。 请记住,当时这个项目有不少于16个模拟输入和多个输出,包括OLED。

从Mega迁移到Uno不仅意味着我必须减少输入量,而且还要放弃很多内存。 这浮出了一些挑战。

为了保留我的16个输入,我发现Sparkfun正在出售这些准备好使用的16通道多路复用器。 因此,我决定订购一个并尝试一下。 这出奇地好。 我为感兴趣的人提供了一些示例代码。

更大的挑战是OLED。 对于Uno而言,存储用于128×64像素显示屏的缓冲区所需的内存量实在太大了,而其他任何空间都很少。 所以我放弃了OLED显示器。 通常,简化需要减少损失。

我回到了绘图板上,并决定在考虑Uno的情况下重新考虑这个项目。 在强调削减什么和留下什么之后,我最终得到了只有6个锅和5个按钮的新设计。 这非常适合UNO,而无需多路复用器。 我依靠简单的LED来指示状态。

软件

我了解了一些第三方库做很多事情的艰难方法,这使它们消耗了大量内存。 最后,我自己编写了文件,只提取了我需要的部分(用于图形库和MIDI库)。 无论如何我都不需要图形库。

该项目严重依赖于随机数生成器。 不幸的是,每次重新启动时,Arduino中的随机函数都会重复相同的顺序。 推荐的技巧是使用一个浮动模拟输入引脚将其作为种子。 从理论上讲,这是可行的,但在实践中,我仍然发现每2到3次重启就会重复出现数字序列。 为了我的目的,我需要一些随机的东西。

我想到了将一个整数存储在EEPROM中并将其用作种子的想法。 每次项目启动时,我都会增加该数字并将其放回EEPROM。 这样,每次启动项目时,它将使用不同的整数为生成器提供种子。 当然,它最终将以16位环绕,但是那时用户将不会注意到该模式再次出现。 如果您有兴趣,我会举一个简短的要点来说明它是如何工作的。

建立一个外壳

剧透警报:我最终没有最终构建外壳。

试图为该项目构建外壳非常复杂。 我经历了许多失败的尝试。

尝试1: “我要使用激光切割机来制作定制案例!”

TechShop给我带来了不便,我想在家中快速构建一些东西,以便对其进行迭代。 另外,我只需要一个简单的矩形,从头开始构建一个盒子就太过分了。

失败尝试2: “我的盒子很简单,我只会使用吉他踏板罩”

我使用Affinity Designer在计算机上布置零件。 然后,我将这些尺寸手动转移到方格纸上,然后将纸粘贴到外壳上。 最后,我使用中心打孔机在纸张上打孔,以指示要在哪里钻孔。 事实证明,如果没有适当的设备,很难在金属上钻5/8“孔(用于MIDI插孔),这就是我放弃这种方法的原因。

失败尝试3: “金属很难。 让我们尝试一下木头。”

我找不到能使电位器和按钮滑过的足够薄的预制木箱。 我经过了2或3个盒子,它们都太厚了。 从好的方面来说,这些内容更容易钻研。

失败尝试4: “很明显,我不能操练,所以让其他人去做。”

最后,我决定付钱给别人为我钻孔。 我找到了几个执行此操作的地方:Mammoth Electronics和PedalPartsPlus。 我之所以选择PedalPartsPlus,是因为猛mm象至少需要订购10个踏板,这使成本大大增加。 PedalPartsPlus外壳的钻孔效果很好,但我愚蠢地忘记考虑外壳内部组件的实际尺寸。 箱子太小了,没有地方放下锅和纽扣了。 重复进行此操作的周转时间太慢,因此我放弃了这种方法。

失败尝试5: “金属无效。 木不起作用。 外包太慢。 让我们试试塑料吧!”

我在亚马逊上找到了一些ABS塑料外壳,并购买了一些。 它们既足够大又易于钻孔。 到目前为止一切都好吧? 不完全的。 我很快意识到将所有组件布线在一起所需的电线数量变成了巨大的老鼠窝。 这是不可能的工作,看起来真的很丑。

F̶a̶il̶e̶d̶尝试#6: “冲浪板和老鼠的窝是一种痛苦。 让我们做一个PCB,然后称之为一天”

我决定硬着头皮,学习如何制作PCB。 我放弃制作一个外壳,因为它变成了一个巨大的兔子洞。 PCB将使我拥有一个干净的独立项目版本,对我而言这已经足够了。

我决定使用Eagle,因为它对于简单的PCB是免费的,并且在Maker / DIY社区中得到了广泛的采用。 我拿起这本书,在YouTube上观看了杰里米·布鲁姆(Jeremy Blum)的《鹰》系列,并且很快就可以启动并运行。 值得庆幸的是,Sparkfun已开放其MIDI Shield原理图的源代码,因此我能够从那里借用许多零件和组件。

在布置了PCB几天后,我从OSHPark订购了前3个板,并在几周后收到了它们。

此时,这就像焊接组件一样简单。 做完了!

得到教训

  • 把事情简单化。 从简化开始。 继续简化。 如果您认为它太简单了,请简化一些。 然后退后一点,您就完成了!
  • 减少损失。 认为“我花了很多时间和金钱,我不妨继续前进”可能会导致滑坡。 我倾向于掉入这个陷阱很多。 我发现休息一下项目(1-2周)并保持客观的想法会有所帮助。
我引用自己很奇怪吗?
  • 订购零件并快速尝试。 许多硬件限制将决定项目的结果。 我意识到,我越快地实施硬件,就越快发现任何无法预料的问题。
  • 通过实际使用来测试您的产品。 这听起来很明显,但是我犯了一个错误,那就是花太多的时间编写代码,而没有足够的时间在真实的音乐环境中测试该项目。 我认为很酷的许多功能听起来都不是很好。 除非代码使产品有用,否则它是无用的。

下一步是什么?

我想最终建立一个合适的外壳。 大概使用前面板设计师之类的东西。 我也对构建eurorack模块感兴趣,因此最近一直在研究它。

最后的想法

总而言之,我对结果非常满意。 它远未达到完美,但至少已完成(ish)。 我学到了很多东西,还有很多东西要学。 希望这篇文章对其他人有用。 如果您正在从事类似的项目,我希望知道他们!

和平。