Strudel 是一个基于 Web 的实时音乐编码环境,它忠实移植了 TidalCycles 的核心语义到 JavaScript,利用 WebAudio API 实现浏览器内的周期模式序列(cycle-based pattern sequencing)和声音合成。这使得开发者无需安装 Haskell 或 SuperCollider 等复杂依赖,即可在任意浏览器中进行直播音乐编码(live music coding),生成 polyrhythmic、多层效果链和采样驱动的算法音乐。相较原生 TidalCycles,Strudel 的优势在于即时性与可移植性:打开 strudel.cc 的 REPL,输入代码即可听到输出,支持 Tone.js 或纯 WebAudio 合成,甚至通过 OSC 桥接到外部 SuperCollider。
周期模式序列的核心机制
Strudel 的模式系统以 “周期”(cycle)为基本单位,默认周期长度为 1 个循环(cps=1 表示 1 秒一周期)。每个模式如 d1 $ sound "bd sn ~ bd" 在 [0,1) 时间弧内展开:bd 占据 0-0.25,sn 0.25-0.5,~ 为静默。这支持复节奏变换,例如 d1 $ sound "bd*4" . every 2 (rev) $ sound "sn":每 2 个周期反转 sn 模式,实现渐变演化。
证据显示,这种序列化源于 TidalCycles 的函数响应式模式:stack 层叠轨道,seq 线性展开,cat 串联周期。浏览器实现中,Strudel 使用 Tone.Transport 或自定义调度器将模式事件转换为 WebAudio 调度事件(AudioContext.currentTime + offset)。例如,输入 setcps 0.5; stack [sound "bd*2", sound "hh*8"] 生成半速 bass drum 与高密度 hi-hat,polyrhythm 效果明显。
落地参数清单:
- cps (cycles per second): 0.25-2.0,阈值 >2 易 CPU 峰值;监控:Chrome DevTools Performance 面板,目标 <30% CPU。
- 密度变换:
*n细分周期,slow n拉伸;示例n "0 2 4 7*2" # note生成琶音序列。 - 概率引入:
sometimes $ fast 2随机加速;回滚:purely $ every 4 (id)固定每 4 周期触发。
WebAudio 合成与效果链
Strudel 内置 WebAudio 合成器,支持振荡器(saw/square/sine)、噪声和采样。声音通过 # s "bd" 指定样本,或 # note "c3 e3 g3" 合成 MIDI 音高。效果链使用中缀运算符:sound "bd" # gain 0.8 # room 0.5 |~ delay 0.2 将延迟反馈叠加到主链,实现空间感。
合成链路:Pattern → Event → WebAudioNode(OscillatorNode + GainNode)→ BiquadFilterNode → Destination。采样支持 SuperDirt 库预载,或 samples {bd: '/samples/bd.wav'} 自定义。链式效果如 # lpf 800 # hpf 200 # distort 0.3 逐节点应用,避免长链阻塞(限 5-7 节点)。
可操作参数:
| 参数 | 范围 | 用途 | 监控阈值 |
|---|---|---|---|
| gain | 0-1.5 | 音量 | <1.0 防削波 |
| pan | -1~1 | 声像 | 动态 <0.8 |
| delay | 0.1-1s | 反馈 | feedback <0.4 |
| reverb (room) | 0-1 | 空间 | <0.6 防泥泞 |
| lpf/hpf | 100-5000Hz | 滤波 | Q<2 防共振 |
示例落地:samples 'bd sd hh'; stack [ s "bd*2 # gain 1", s "hh*16 # pan <0 1>" ] # crush 4 – 比特粉碎效果,适用于 glitch 风格。性能:AudioWorklet 优先,fallback ScriptProcessorNode;阈值:块大小 256,延迟 <10ms。
采样与直播编码实践
采样是 Strudel 的强项:sample "bd@2:0.5" 播放 bd 样本第 2 个变体,速度 0.5x。链式如 s "bd" # speed "0.5 1 2" # pitch "<0 12>" 实时变调。直播场景:REPL 支持热重载,hush 静音所有轨道。
监控与回滚:
- 延迟阈值:WebAudio latencyHint 'playback',测试 <50ms。
- CPU 监控:PerformanceObserver API,警报 >80%。
- 回滚策略:简化模式至
d1 $ s "bd";浏览器兼容:Chrome/Edge 优先,Safari 需 user-gesture。 - 扩展:OSC 输出至 SuperSonic/SuperCollider,
osc {port: 57120}。
Strudel 降低了直播编码门槛,适用于 Algorave、教育与实验音乐。通过上述参数,用户可快速构建复杂序列,确保稳定输出。
资料来源:
- Strudel 官网:strudel.cc(REPL 示例与文档)
- TidalCycles 主站:tidalcycles.org(语义参考)
- GitHub:tidalcycles/strudel(源码与本地运行)