工科生的音乐浪漫 - Sonic Pi

说起音乐创作,大多数人立刻就会将其划入艺术的范畴。而除非有专门学过相关的才艺,对于大多数像我们这样的工科生来说,中间仿佛横亘着一条巨大的鸿沟。但今天,我想向大家介绍一款神奇的软件,它在两者之间架起了一座桥梁。

这款软件叫做 Sonic Pi ,来自剑桥大学计算机实验室,目前支持 Windows、Mac、树莓派三个平台。它也是一款开源软件,在 Github 上获得了 5k+ stars 。

从功能上来说,它可以被视为一个简单的 DAW(Digital Audio Workstation ,数字音频工作站),类似 Cubase 和 FL Studio 等的下位替代。但它的特点在于,使用编写代码而不是输入音符的方式来完成乐曲的制作(←但用到的代码很简单)。它的设计旨在于简单、强大和富有乐趣间取得平衡,而它也的确做到了。一方面,它被用于校园之中, 在创造乐曲的过程中教授学生以编程思维;另一方面,它强大的实时编码作曲能力,也被不少专业的艺术家和 DJ 作现场表演和音乐可视化等用途。

我花了点时间用 Sonic Pi 简单复刻了一首我非常喜欢的 BGM —— 来自《塞尔达传说 旷野之息》的 Kass' Theme,但加入了些电音的风格。不如让我们在音乐声中,探索一下 Sonic Pi 的独特之处吧。

简单易上手的程序设计

阻碍大众进入音乐世界的第一道坎就是识谱了,各种五花八门的符号往往令人望而却步。不少人或许会觉得自己与音乐缘尽于此,但其实不然,作为艺术的音乐却与理工科有着不可分割的联系。让我们回想起曾经学过的知识。声音的本质是机械波。音乐的三要素中,响度对应波的振幅,音调对应波的频率,音色虽复杂些,但也逃不过是波形和频率的组合。而一首乐曲,无非是一系列声音在时间维度上的排列罢了。而五线谱,就是描述这一种排列的 DSL(Domain Specific Language, 领域特定语言)。能被沿用至今,它形象直观、信息密度大,一定程度上代表了业界的最佳实践。

但这东西毕竟还有不小的学习成本,而且在如今的信息时代,五线谱的图形化特征却也带来数字化表示与传播上的不便。那该怎么办呢?改用代码实现便再自然不过了。我们早已熟悉使用代码对全世界建模,区区一个音乐当然更是不在话下。随时间流淌的音符,是顺序结构;有时会有整段的重复,那就加个循环;重复中又会带点变化,一个 if-else 了事。Sonic Pi 使用 Ruby 作为它的宿主语言,利用它灵活、可读性强的优势,封装了一整套用于音乐制作的 API,即使对代码知之甚少的用户也能很快理解它的含义。而对熟悉代码的用户而言,能够编写代码,就意味着强大的可扩展性、无限的可能性。

example


以随机性激发灵感

Sonic Pi 并不只是一个冷冰冰的代码编辑器而已,相反,它为了让初学者顺利进入音乐的世界,准备了齐全的教程,事无巨细地讲解了各类音乐和代码的基础知识,以及软件使用的技巧。作者鼓励大家多做尝试,他的口头禅是 there are no mistakes, only opportunities

在教程中,我印象最深刻的是作者花了不小的篇幅讲解在音乐制作过程中随机数的应用。在学会软件的基础操作后,我们除了临摹现成的曲子,如果想要自己创作些新的旋律出来,往往会容易陷入无从下手,没有灵感的局面。这时候随机性就可以派上用场了,我们可以让计算机随机演奏,毫不费力地就可以让计算机帮我们擦出灵感的火花。Sonic Pi 也很贴心地为我们封装了好几种随机函数,免去了我们从零开始自己处理随机数的麻烦。

可能有人会问,我自己随便乱弹琴,不也能达到类似的效果么?且不说你的个人习惯是不是真的能让你的弹奏那么随机(想想自己乱按键盘的时候,是不是翻来覆去也就那么几个类似的 pattern),就算是有灵感产生了,过段时间以后你还确保自己能记得当时的旋律吗?但计算机的随机数就不一样了,它是一种伪随机数,只要设定相同的随机种子,得到的随机数序列永远是一样的,再也不用担心相同的旋律无法复现的问题。你甚至可以把它分享给朋友,让他们也能听到你的灵光一闪。

interface


互操作性与工作流

Sonic Pi 毕竟不是十全十美的软件,我在使用过程中也遇到一些问题,例如音源种类太少且难以加入新的音源、软件本身也不太稳定等。而且它毕竟是个小众软件,如果想要拿它认真做点东西,也要考虑到和主流软件的互操作性。换句话说,如果我们能把 Sonic Pi 的作品放入功能更加强大的软件中进行二次加工,那像音源或是功能缺失的问题都将不再是问题。

那么如何做到这一点呢?容易想到利用 MIDI 这一通用的计算机音乐格式。Sonic Pi 本身支持作为 MIDI 的输入或输出设备,但一般连接的都是实体的设备。理论上来说,我们也可以将另一个软件作为 Sonic Pi 的虚拟 MIDI 输出端,但本人对这方面实在是知之甚少,做了些尝试但都不算成功,不同系统下的区别也比较大。但换个思路想, MIDI 本来就是记录音乐的一种格式而已,只要我们知道它的格式定义,就可以把文件写出来,而写 MIDI 文件的方法,想必有现成的轮子可用。果然我找到了 MidiWriterJS 这个开源库,亲测可用。至于具体的用法我就不详细介绍了,有需要的朋友可以留言私下交流。


替代品

使用代码编写音乐的工具并非只有 Sonic Pi 一个。正如有句名言所说:“任何可以使用 JavaScript 来编写的应用,最终都会由 JavaScript 编写。” 有一个开源库 Tone.js 也可以实现同样的目标。但相比于 Sonic Pi,它就简陋了很多。它更像是 Three.js 之于 WebGL,是对 Web Audio API 的一层简单封装。如果你事先没有对 Web Audio API 的概念有一定了解的话,将会很难上手使用,更不用说没有 GUI 与各种音源、效果了。至于优点嘛,就是无需下载客户端,以及可以更方便地与我上文提到的 MidiWriterJS 互相调用。有进阶编程经验的同学可以尝试一下。


附本文介绍的各种工具地址:

Sonic Pi

MidiWriterJS

Tone.js

TAGS:  midi
正在加载,请稍候……