Strudel 实时编程:在线用代码创作音乐
将音乐模式写成代码,并在内嵌的 Strudel 编辑器中立即聆听——浏览器中的 TidalCycles。
从下方选择一个入门模式,在编辑器中按播放按钮,然后在它运行时修改代码。这就是实时编程:重新求值的瞬间,音乐便会更新。
Strudel 实时编程:在线用代码创作音乐
将音乐模式写成代码,并在内嵌的 Strudel 编辑器中立即聆听——浏览器中的 TidalCycles。
Strudel 迷你记谱快速参考
解锁大部分模式语言的十种结构。双引号中的所有内容都是迷你记谱;一个带引号的序列恰好持续一个循环。
| 结构 | 示例 | 作用 |
|---|---|---|
| sound() / s() | sound("bd hh sd hh") | 播放指定名称的采样或合成器:bd = 底鼓,sd = 军鼓,hh = 踩镲。四个事件均分一个循环。 |
| note() | note("c4 e4 g4").sound("piano") | 按音名(c4、eb3)或 MIDI 编号播放音高,并发送给其后链接的声音。 |
| *(重复) | sound("hh*8") | 将 8 个踩镲压入一个事件的时长中——这是书写快速细分节奏的标准方法。 |
| ~(休止) | sound("bd ~ sd ~") | 一个静音位置。事件网格保持原有时序;波浪号只是不会播放任何声音。 |
| [ ](分组) | sound("bd [sd sd] bd sd") | 方括号将多个事件放入一个位置并细分其时间——这里两个快速军鼓共享第 2 拍。 |
| < >(交替) | note("<c2 eb2 g2>") | 尖括号每个循环播放一项并依次轮换——即时生成和弦进行。 |
| stack() | stack(sound("bd*4"), sound("hh*8")) | 叠加模式以同时播放——可用来构建完整鼓组,或在鼓下加入贝斯线。 |
| fast() / slow() | sound("bd sd").fast(2) | 加速或拉长模式:fast(2) 每循环容纳两次重复,slow(2) 将一次重复延展到两个循环。 |
| rev() | note("c4 e4 g4 b4").rev() | 反转每个循环内的模式——一个词即可改变旋律。 |
| .euclid(k, n) | sound("bd").euclid(3, 8) | 将 k 次击打尽可能均匀地分布在 n 个步点上。euclid(3,8) 就是无数舞曲和拉丁律动中的 tresillo 节奏。 |
关于 Strudel 与实时编程
实时编程是在音乐播放时不断书写和改写代码来表演音乐。你不必在时间线上排列音符,而是描述模式:每四分音符一个底鼓、每循环变化的和弦、压入三连音的踩镲;语言会立刻把描述变为声音。修改一行并重新求值,音乐会在下一个循环变化而不停下。这种实践形成了 algorave:表演者的代码投影给跳舞的观众阅读的俱乐部之夜。
Strudel 是 TidalCycles 的 JavaScript 实现。TidalCycles 是 Alex McLean 约在 2009 年以 Haskell 创造的模式语言,已成为实时编程音乐的共同语言。Strudel 在浏览器标签页中重新实现 Tidal 的理念:不需要 Haskell 工具链、SuperCollider 音频服务器或安装。本页在框架中嵌入来自 strudel.cc 的官方 Strudel REPL,提供真正的编辑器、求值闪烁、错误信息和内置声音;入门按钮会加载可运行的模式。完整 Strudel 链接会带着当前模式进入包含采样浏览器和可视化的完整环境。
Tidal 系列语言的核心是循环:默认约两秒、所有模式都据此衡量的重复时间段。双引号间的迷你记谱切分这个循环。以字符串写下 bd hh sd hh,即每循环获得四个均等事件:底鼓、踩镲、军鼓、踩镲。小修改能带来巨大的音乐变化:星号倍增事件,波浪号插入静音,方括号将一个位置细分为更快事件,尖括号在连续循环中交替数值,因此两字符的修改就能变成和弦进行。
模式语言令人上瘾之处在于变换可以组合。链接 rev() 翻转旋律、fast(2) 加倍速度,或 euclid(3,8) 将击打重新分布为古巴 tresillo 节奏;它们作用于整个模式而非单个音符,一处编辑就会改变全部织体。从鼓组模式开始,换一个采样名,加一个星号,你就在实时编程。
可在编辑器中尝试的模式配方
将任意一段复制到内嵌编辑器,按播放,然后每次改动一个标记来变形。
| 代码 | 听到的效果 | 展示的概念 |
|---|---|---|
| sound("bd hh sd hh") | 基础反拍:底鼓、踩镲、军鼓、踩镲,每循环一次 | 四个事件均匀分割一个循环——迷你记谱的 Hello World。 |
| sound("bd*4, hh*8") | 四拍底鼓下配八分音符踩镲流 | 引号内的逗号会叠加序列,如同紧凑版 stack()。 |
| note("<c2 eb2 g1 bb1>").sound("sawtooth").lpf(500) | 每循环切换根音的暗色滤波贝斯线 | 尖括号按循环交替;lpf(500) 是抑制锯齿波的 500 Hz 低通滤波器。 |
| sound("bd").euclid(3, 8) | tresillo:8 步中的第 1、4、7 步击打 | 欧几里得节奏将 3 次击打尽可能均匀地分布在 8 步中——从古巴 son 到 EDM 都可听到。 |
| note("c4 e4 g4 b4").rev().fast(2) | 每循环演奏两次的下行琶音 | 变换从左到右链接:先反转模式,再将速度加倍。 |
如何开始实时编程
- 点击入门模式——鼓组、旋律、贝斯线或复节奏——将代码载入内嵌 Strudel 编辑器。
- 在编辑器中按播放按钮(浏览器需要一次点击才能开始任何声音)。
- 播放时编辑代码:改采样名、为事件加上 *2 或替换音符;然后按 Ctrl+Enter(Mac 上为 Cmd+Enter)重新求值。
- 用 stack() 叠加更多模式,并使用上方速查表中的 fast、slow、rev 或 euclid 塑形。
- 当模式超出草图阶段时,使用“在完整 Strudel 中打开”进入带声音浏览器和视觉效果的完整环境。
Strudel 实时编程常见问题
Strudel 和 TidalCycles 有什么区别?
TidalCycles 是原始模式语言,以 Haskell 编写,通常与 SuperCollider 合成引擎搭配。Strudel 是官方姊妹项目,将相同模式系统移植到 JavaScript 和 Web Audio API,因此可零安装运行于任何现代浏览器。两者的模式和概念几乎一一对应。
为什么入门按钮会重新加载编辑器?
Strudel 可通过 URL 接收完整程序:模式源代码会以 base64 编码写入 # 符号后的地址。每个入门按钮都让嵌入编辑器指向携带相应模式的新 URL,这也是“在完整 Strudel 中打开”能带上当前模式的原因。
为什么在编辑器中按播放前没有声音?
浏览器会阻止音频,直到用户与产生声音的页面交互,这是自动播放保护。Strudel 框架是独立页面,因此首次播放必须在编辑器内点击。之后重新求值代码即可更新音乐而不会停止。
什么是循环?
循环是 Tidal 和 Strudel 的音乐时间单位:默认速度下约两秒的重复时段,所有模式均据此衡量。像 bd hh sd hh 的带引号序列把一个循环分成相等部分;fast(2) 将两个循环的内容放进一个;尖括号每循环给出一个值。
什么是 algorave?
algorave 是表演者通过编写代码现场生成音乐(通常还有视觉效果)的活动,屏幕通常会投影出来,让观众观看源代码变化。这个词约在 2012 年由 TidalCycles 社群提出,如今 algorave 在世界各地举办。
Strudel 免费吗?为什么嵌入在框架中?
是的。Strudel 是由 Strudel/TidalCycles 社群以 AGPL-3.0 许可证发布的免费开源软件。嵌入官方 strudel.cc 编辑器能让代码库保持在自己的来源中,与本站清晰分离,同时提供真实且始终最新的 REPL,而不是副本。