您的提交听起来像什么?

carwow的产品团队拥有许多音乐家,因此您经常会偷听吉他,合成器和录音机的对话。 一次关于音乐和编程的对话让我想起了我多年前编写的旧吉他标签解析实验,其中一项实验使用了一种叫作micromidi的超棒宝石

回到使用我喜欢的编程语言(Ruby)和我喜欢的另一种兴趣(歌曲创作)的想法,使我开始思考我可以用这个gem做什么,这可能有用,对我的团队和开发社区的其他人有帮助大体上…

不幸的是,我很快就迷上了一些不那么有用的事情,但绝对是一样有趣— 提交听起来像什么?


在我深入了解如何实现这一目标之前,让我介绍一下micromidi 和GarageBand一起工作。

如何用Ruby演奏合成器

基本设置是:

  1. 在机器上打开一个MIDI通道
  2. 设置GarageBand在将音符发送到通道时弹奏乐器
  3. 编写并运行Ruby代码以向通道发送注释

在Macbook上,您需要打开“ 音频MIDI设置”程序,然后转到“ 窗口”->“显示MIDI Studio” 。 您应该会看到一个深灰色面板,如下面的屏幕快照的左侧。

双击“ IAC驱动程序”项以打开右侧的面板,然后在单击“ 应用”之前确保选中“ 设备在线”复选框。 您现在将打开一个MIDI通道。

要设置GarageBand,请打开程序并创建一个新项目,然后选择Keyboard Collection作为基础。 一旦我们演奏了音符,这将为您提供多种乐器供您选择。 打开后,选择任何乐器轨道,然后转到GarageBand->首选项->音频/ MIDI ,并确保您可以看到检测到的MIDI输入,如下面的屏幕截图所示。

Micromidi提供了一种简洁的DSL,可让您将音符发送到MIDI输出,从而允许您发送命名的音符(或音符数组)以及持续时间。 这是一个例子:

  require“ midi”#gem install micromidioutput = UniMIDI :: Output.open(:first)MIDI.using(output)做 
播放“ F4”,0.5
结束

上面代码中的第二行将仅返回检测到的第一个MIDI输出,在本例中为在步骤1中打开的通道。然后DSL提供了一个using方法来接受该输出通道,并且该模块内部的所有调用都将使用该方法。渠道。

如果运行上面的ruby代码,则希望您会听到以下片段:

由于这只是Ruby,因此您可以访问常规编程语言的所有功能,例如以下示例中的循环。

  require“ midi” o = UniMIDI :: Output.open(:first)MIDI.using(o)做 
4.times | oct |
八度oct + 2
播放“ C”,0.25
播放“ D”,0.25
播放“ E”,0.25
播放“ G”,0.25
播放“ C6”,0.254.times | oct |
八度5-八度
播放“ G”,0.25
播放“ E”,0.25
播放“ D”,0.25
播放“ C”,除非oct == 3,否则0.25
结束
结束

现在是有趣的部分。

如何将任何提交的SHA变成旋律

标准的简短形式git commit消息采用8个十六进制字符79759e3b的形式。 偶数表示我们可以轻松地将其转换为一系列音符,以进行顺序演奏,类似于琶音。

这使我想到了一种简单的算法,该算法为每个8个字符的提交SHA创建一个8音符序列:

  1. 取SHA的第一个字符,并将其在16个十六进制字符列表中的位置映射到半音阶中从C开始的12个音符列表中。这为我们提供了音符将来自的音阶的根音,例如作为F#
  2. 取第二个字符,并使用其在16个十六进制字符列表中的位置从一组比例尺中选择,在这种情况下,仅是主要和次要比例尺。 结合了根音便为我们提供了一个键,例如F#Major
  3. 这些音阶的长度为8个音符,并且定义为沿彩色音阶偏离根音符的步长,因此,主音阶将为[0,2,4,5,7,9,11,12]
  4. 下一步是将提交SHA中每个音符的位置映射到16个十六进制字符列表中的等效位置,然后将其映射到一半,从而为我们提供最高的8位位置。然后反转列表以尝试确保多数时候不要从根音开始。 例如,上面的提交为我们提供了以下列表: [5,1,7,4,4,2,3,4,3]
  5. 下一步是获取由8个数字组成的列表,并将每个项目都视为标尺中的索引,在列表上进行映射,以拉出标尺中该索引处的数字。 在这个提交的情况下,这给了我们: [9,2,12,12,7,4,5,7,5]。
  6. 最后,我们在该步骤列表上进行映射,并沿色度标度按该步骤的数量对根音( F# )进行转置,以在每个位置上为您提供一个新的音符,最后给出一个音符列表,例如[“ Eb5”,“ G#4”,“ F#5”,“ C#5”,“ Bb4”,“ B4”,“ C#5”,“ B4”]

这是上面的最终代码:

证据

运行此代码将记录该算法的结果一行,然后使用micromodi将注释发送到GarageBand。

  $ ruby​​ music_commit.rb〜/ path / to / repo_a 
bb5f3455:A4专业的键:[“ C#5”,“ C#5”,“ C#5”,“ B4”,“ A5”,“ C#5”,“ F#5”,“ F#5 “] $ ruby​​ artistic_commit〜/ path / to / repo_b
79759e3b:F#4专业的键:[“ Eb5”,“ G#4”,“ F#5”,“ C#5”,“ Bb4”,“ B4”,“ C#5”,“ B4”]

现实情况是,算法产生任何可听的东西的机会在很大程度上取决于提交中8个字符的变化,因此输出的确变化很大。 但是,还是取得了一些成功-我们对内部工具的最新承诺之一产生了令人困扰的民间旋律:

稍微扩展算法,然后通过不同的乐器演奏相同的模式,有助于产生低音音符和另一个回音的鼓音轨:

总而言之,该算法并不是特别聪明,在这里显然还有很多可以探索的地方–例如,从GarageBand处理MIDI输入,或者使用commit SHA的功能来更改正在演奏的音符的时序。跨多个轨道。

希望这将激发人们对音乐和程序设计的进一步探索-您的提交听起来像什么?

别处

当然,Ruby并不是唯一可以帮助您创作音乐的语言,因此这里有一些我用其他语言知道的有用的库-请随时在评论中发布其他任何库。

Tone.js

Tone.js是用于在浏览器中创建交互式音乐的框架。 它提供了高级计划功能……

tonejs.github.io

泛音/泛音

协同可编程音乐。 通过在GitHub上创建一个帐户来促进泛音/泛音开发。

github.com

阿尔达朗

一种针对音乐家的音乐编程语言。 :notes:– alda-lang / alda

github.com