Hotdry.
application-security

Strudel 中基于周期的模式序列与 WebAudio 合成:浏览器直播音乐编码实践

Strudel 移植 TidalCycles 语义到浏览器,利用 WebAudio API 实现周期模式序列、效果链与采样,支持零安装直播编码音乐。详解核心语法、参数调优与性能监控要点。

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(源码与本地运行)
查看归档