Strudel 实时编程:在线用代码创作音乐

将音乐模式写成代码,并在内嵌的 Strudel 编辑器中立即聆听——浏览器中的 TidalCycles。

从下方选择一个入门模式,在编辑器中按播放按钮,然后在它运行时修改代码。这就是实时编程:重新求值的瞬间,音乐便会更新。

Strudel 实时编程:在线用代码创作音乐
将音乐模式写成代码,并在内嵌的 Strudel 编辑器中立即聆听——浏览器中的 TidalCycles。
入门模式

模式: 鼓组

sound("bd hh sd hh")

只有在编辑器内按播放后才会开始发声。想要带采样浏览器和视觉效果的完整环境吗? 在完整 Strudel 中打开

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)每循环演奏两次的下行琶音变换从左到右链接:先反转模式,再将速度加倍。

如何开始实时编程

  1. 点击入门模式——鼓组、旋律、贝斯线或复节奏——将代码载入内嵌 Strudel 编辑器。
  2. 在编辑器中按播放按钮(浏览器需要一次点击才能开始任何声音)。
  3. 播放时编辑代码:改采样名、为事件加上 *2 或替换音符;然后按 Ctrl+Enter(Mac 上为 Cmd+Enter)重新求值。
  4. 用 stack() 叠加更多模式,并使用上方速查表中的 fast、slow、rev 或 euclid 塑形。
  5. 当模式超出草图阶段时,使用“在完整 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,而不是副本。