SuperCollider 版本演进史:从 3.1 到 3.6 的核心功能与缺陷修复档案解读
SuperCollider 版本演进史:从 3.1 到 3.6 的核心功能与缺陷修复档案解读
本文以 CHANGELOG_archive.md(SuperCollider 官方归档变更日志)为骨架,系统梳理 3.1–3.6 各代版本在音频服务器(scsynth/supernova)、语言解释器(sclang)、类库与 IDE(sc-ide / QtCollider)四大层面上的功能增量与关键修复。读者可通过本文掌握各版本发布节奏、里程碑特性(如 LocalBuf、PartConv、BEQSuite、Pattern 重构、Qt GUI 迁移)及其在当今仓库源码中的落地形态,并学会如何利用归档日志定位历史问题与升级风险。
版本时间线与整体脉络
归档日志记录的版本区间为 SuperCollider v3.1(2007-10-31)到 v3.6.6(2013-11-27),其中 3.6 之后的版本记录已迁移至 CHANGELOG.md。结合两份文档可得到完整的 3.x 发布节奏:
| 版本 | 发布日期 | 备注 |
|---|---|---|
| 3.1 | 2007-10-31 | 首个 point release,引入 SparseArray、FFT/IFFT 重写 |
| 3.1.1 | 2007-11-16 | 修复 .asStringPrec 崩溃,加入解释器预处理器 |
| 3.2 | 2008-02-21 | 机器听觉 UGen 套件、FreeBSD 兼容 |
| 3.3 | 2009-04-30 | scvim 入发行版、VDiskIn、LocalBuf 系统 |
| 3.3.1 | 2009-06-19 | Safari 4 兼容、libsndfile 安全更新 |
| 3.4 | 2010-07 | 64 位 macOS 支持、iPhone 支持、nova-simd 引入 |
| 3.4.1–3.4.5 | 2010-11 ~ 2012-01 | 大量跨平台与稳定性修复 |
| 3.5 | 2012-03 | 重大版本,详见 "News in 3.5" |
| 3.5.1–3.5.7 | 2012-04 ~ 2012-11 | SCDoc 新解析器、QtCollider 优化 |
| 3.6 | 2012-11 | 重大版本,详见 "News in 3.6" |
| 3.6.1–3.6.6 | 2012-11 ~ 2013-11 | 基于 GitHub issue 追踪的密集修复期 |
从 3.6 系列起,变更日志的生成方式发生了重要变化:3.6.5 及之前的版本采用"按贡献者姓名分组"的格式,而 3.6.6 开始切换到由 github_changelog_generator 自动生成的 Enhancements / Fixed bugs / Closed issues / Merged pull requests 四段式结构——这是理解这份档案时需要首先注意的格式分水岭。
v3.6 系列:GitHub 时代的第一批密集修复
v3.6.6(2013-11-27)是归档中记录最详尽的一个版本,其分段结构本身就是一份"升级体检清单":
Enhancements(增强)
- "Exception when parsing synthdef: corrupted synthdef" 错误现在会报告具体是哪个 synthdef 导致问题(对应 supernova 侧 server/supernova/server/synth_definition.hpp 的解析路径);
- "start coding" 窗口标题改进;
- 修复默认文件扩展名缺失问题。
Fixed bugs(缺陷修复)——按子系统可归纳为几类:
- IDE / 文档管理:修复
ScIDE::DocumentManager::updateCurrentDocContents槽函数连接错误(指向 editors/sc-ide/core/doc_manager.cpp);多文件会话打开时 sclang 高 CPU 占用;IDE 帮助浏览器"如何使用 SuperCollider IDE"跳转导致浏览器脱离;关闭文档窗口在语言初始化期间报错。 - 语言 / 类库:
BinaryOpUGen的div运算符存在 off-by-one 且不是整数除法;SimpleNumber:curvelin对负数失效;prSimpleNumberSeries对错误输入抛出难懂异常;NodeProxy的 SynthDef 多声道展开损坏。 - 服务器 / UGen:Linux FFT/IFFT 在 hop size 0.25 时的 Hann 窗听感错误;
SendReply可杀死服务器/崩溃;Ramp UGen 未通过 LTI 测试;多个 UGen 未通过单元测试。 - 构建 / 平台:
SC_QT=OFF时 macOS 仍要求 Qt;Windows 无 SCIDE 图标;git clone --recursive 失效。
Closed issues 中的高频主题:Windows 安装器不注册文件关联/程序快捷方式(#855–#857)、OSCFunc.addr.hostname 返回 nil(#933)、PV_Copy 破坏 edge model(#896)、以及贯穿 3.5/3.6 的服务器 CPU 负载在 Windows 上偏大 100 倍问题(#849)。
Merged pull requests 中的重要合并:class library 修复 Pbind MIDI type 发送 sysex(#947)、supernova TCP 支持(#757)、s.sync 在 buffer 加载后过早返回(#750)、多声道 IO UGen 缓冲区溢出防护(#716)、Knob 背景色设置(#697)、Ndef 播放咔嗒声(#664)、Array:slide 缺陷(#645)等。
值得注意的是 3.6.6 的 PR 列表还包含大量来自维护者 Tim Blechmann 的 supernova 现代化改造(#1697、#1745、#1769),以及 boost 库的迭代升级(#1528、#1770)——这些在 external_libraries/boost 目录中仍可找到对应痕迹。
v3.6.0–3.6.5 的关键增量(按贡献者分组的格式记录):
- 3.6.0(2012-11):重大版本,功能细节指向 "News in 3.6" 帮助文档;
- 3.6.1:Windows 应用数据目录改为 local 而非 roaming,新增
Platform访问用户主目录的 primitive; - 3.6.2:QtCollider 的 QStethoscope2 重构、
QListView新增selection方法、cmake 的 FindPortmidi 真正实现自动查找;SCIDE 支持 doc/impl/ref 查找快捷键作用于脱离的 docklet; - 3.6.3:QtCollider 重新以 GPL2 授权、
String:speak支持(当 Speech 类可用时)、SCIDE 默认服务器启动快捷键改进、FreqScope 修复; - 3.6.4:
SinOsc/Osc相位在 ±8π 之外的错误修复(#815)、Server.scope解除 16 声道限制(对应 SCClassLibrary/Common/Server/Server.sc 的 scope 方法)、GrainBuf 捕获 inf/NaN phase 参数、Bus 多声道get修复、新增独立应用(standalone)创建指南; - 3.6.5:
Server:-scope回归修复、SCIDE 自动补全按类层次排序方法、PyrThread 槽类型安全、NodeProxy 源码替换导致的悬挂 pattern 修复。
v3.5 系列:SCDoc 重写与 Qt 时代奠基
v3.5.0(2012-03)同样标注为重大版本。3.5 系列最有影响力的工程事件是 Jonatan Liljedahl 的 41 项 SCDoc 提交(3.5.2):全新的 SCDoc 解析器与渲染器"更快、更稳定、更少 bug",实现了参数名自动填充与校验、broken link 警告、*.ext.schelp 文档附加元数据收集、setter/getter 组合渲染、foo: val 风格默认值显示等。这套机制对应今天仓库中的 SCDoc/SCDoc.cpp、SCDoc/SCDoc.y(bison 语法)与 SCDoc/SCDocPrim.cpp(primitive 层)。
其他值得记住的 3.5 增量:
- 3.5.2:QtCollider 支持 UTF-8 字符串、QEnvelopeView 节点选择 API 改进、QTextView 的
enterInterpretsSelection优化、跨进程拖放(drag-and-drop); - 3.5.3:
Mix.ar/Mix.kr恢复(带 rate 检查)、Scale.degreeToRatio 支持多八度范围、cmake 优先使用系统 boost; - 3.5.4:整数格式音频文件默认用**裁剪(clipping)而非环绕(wraparound)**写入(libsndfile 设置)、ARM 构建修复、GrainBuf 拒绝多声道 buffer;
- 3.5.5:GrainBuf 对 NaN position 崩溃修复、scsynth wire buffer 对齐、
Complex:exp修复; - 3.5.6:旧式
.htm帮助文件纳入 SCDoc 索引、HelpBrowser 支持 RTF 文件、docmap.js键名正确转义; - 3.5.7:
gcd/lcm修复、SoundFileView:-selectAll/selectNone修复、nova-simd 移至 GitHub 子模块、为 C++ 风格 UGen 提供 wrapper 类。
v3.4 系列:64 位、移动平台与 nova-simd
v3.4(2010-07)在 "Headlines" 中列出了至今仍影响架构的决定:
- 64 位支持:macOS 10.5+ 的 64 位 plugin 与 scsynth 构建;
- iPhone 支持(Axel Balley)与随后的 Android 音频驱动(3.4.1,经 JNI);
- nova-simd 框架引入,为 UGen 带来性能提升——该框架的代码痕迹保留在 external_libraries 与 server/supernova 中;
- GPL3 默认启用(3.4 记录于 2010-01-24 的条目),整体二进制许可证从 GPL2+ 升至 GPL3+,从而可以使用 libsimdmath 与 GNU readline;
- sclang 命令行默认启用 readline 接口(
-i选项可关闭); - OSC 规范合规:命令符号(如
\g_new)在分发前自动补上开头的斜杠; SC_SYSAPPSUP_PATH环境变量取代硬编码的 Windows 应用支持路径。
3.4.2 起日志转为带日期的 Bugfixes 列表,其中大量条目至今仍是排查"历史遗留行为"的线索:例如 Latch 首样本输出逻辑(trigger 初始为真时不应输出 0)、Pan2/Balance2/LinPan2/XFade2 的幅度收敛问题(零 amp 时仍有声)、PlayBuf 的音频速率参数问题、以及 Event type \note 支持复音 sustain/lag/timingOffset(3.4 的 Headlines,来自 julian rohrhuber)。
v3.3 系列:LocalBuf、VDiskIn 与 PartConv 的诞生
v3.3(2009-04-30)是"现代音频工作流"成型的一代:
- LocalBuf 系统(2008-10-09,julian rohrhuber):synth 可管理纯本地 buffer,无需全局 buffer 分配——这是 FFT UGen 与 KeyTrack 等分析类 UGen 摆脱共享 buffer 依赖的基础;
- VDiskIn(2008-09-03):可变速率磁盘播放 UGen,并向客户端发送文件位置;
- PartConv(2008-10-18):高效频域卷积;同批加入的还有
PV_Div(复频域除法)与PV_Conj(复共轭); - BEQSuite 滤波器组(2008-11-01)与 Pfxb pattern(2008-11-11);
- scsynth 新增
-P选项(s.options.restrictedPath),限制服务器可读写的路径——安全边界由此可配; - 多声道能力跃升:PlayBuf、RecordBuf、BufWr、BufRd、ScopeOut 从 16 声道上限扩展为"大规模多声道";
- ViewRedirect(2008-12-15):
Window等 GUI 类自动重定向到 SCWindow 或 JWindow,跨平台 GUI 语法大一统; - FFT/IFFT 增加可选
framesize参数实现零填充。
v3.3.1 的修复则集中在 GUI 层:SCUserView 的鼠标坐标与负边界问题、EnvGen 攻击/释放的 block 延迟 off-by-one、libsndfile 升级到 1.0.20 以修复溢出漏洞。
v3.2 与 v3.1:机器听觉与 FFT 重写的起点
**v3.2(2008-02-21)**的标志性内容是"机器听觉(machine listening)"UGen 套件——Loudness、BeatTrack、Onsets、KeyTrack、SpecCentroid、SpecPcile、SpecFlatness(nc、ds 贡献)。这些类在今天的 HelpSource/Classes 下依然有完整文档(如 BeatTrack.schelp、Onsets.schelp)。同时引入的还有:
- Pattern 库实现层面的改动:Pfx、Pbus、Pgroup 等(rk、jr、jh);
TDuty输出触发优先于电平,旧行为由TDuty_old保留(向后兼容范式的典型示例);Buffer.copy语义改为复制语言端对象,服务器端复制改用Buffer.copyData——这个命名差异一直延续到今天。
**v3.1(2007-10-31)**作为"首个 point release",奠基性条目包括:
- FFT 与 IFFT 重写(2007-10-01):使用更高效的库,允许用户调节 overlap 与窗类型,支持大尺寸 FFT;同期加入
UnpackFFT/PackFFT,使得在 synth 内做灵活的频域操作成为可能; - SparseArray、Help.gui、GeneralHID 跨平台 HID 包装器;
- Patterns 全面改造:"所有 pattern 都接受 pattern 作为参数"(2007-10-05)——这是 Pbind/Pseq 嵌套组合能力的设计基础;
- 数据落盘位置变更:不再自动向应用目录写数据(synthdefs、archive.scxtar),改写到 "app support" 目录,解决非特权用户运行问题;
Object:deprecated与DeprecatedError引入,为方法弃用提供机制。
归档日志中的高频主题:三大历史顽疾的修复轨迹
跨版本横向看,有几类问题被反复修复,构成了理解 SuperCollider 稳定性演进的暗线:
- GrainBuf 崩溃族:从 3.5.3(拒绝多声道 buffer)到 3.5.5(NaN position 崩溃)、再到 3.6.3(inf/NaN phase 双捕获),日志记录了该 UGen 输入合法性检查的逐步收紧过程;
- 正则表达式 /
prString_FindRegexp内存问题:3.4.2 的"match char array 过短"、3.4.3 的 GC 期间数组尺寸、3.4.5 的正则缓存修复,反映 GC 与原生 primitive 交互是 sclang 层的长期难点; - OSC 边界情况:从 3.3 的"未知 OSC 类型标签避免内存损坏"、3.4 的 OSC 地址规范合规,到 3.6 的嵌套 OSC bundle 支持与非标准类型支持(#881、#878、#877),服务器与语言的 OSC 栈在此阶段趋于成熟。
如何在当今仓库中继续使用这份档案
- 快速查阅近期版本:请打开 CHANGELOG.md,它从 3.1 起列出全部 3.x 发布日期(最新为 3.14: 2025-07-26),并记录了 3.14 的破坏性变更(如
Phasorinit sample 行为修正、Splay/SplayAz电平补偿调整、mod对负整数模的行为变化); - 回溯历史行为:当遇到"3.x 时代行为与当前不一致"的问题时,先在 CHANGELOG_archive.md 搜索对应 UGen 或类名,往往能直接找到引入修复的版本号;
- 结合源码验证:日志条目可与源码交叉印证——例如 supernova 的 synthdef 解析见 server/supernova/server/synth_definition.hpp,SCDoc 渲染管线见 SCDoc/SCDoc.cpp,SCIDE 文档管理见 editors/sc-ide/core/doc_manager.cpp,语言配置与终端客户端见 lang/LangSource/SC_LanguageConfig.cpp 与 lang/LangSource/SC_TerminalClient.cpp。
结语
从 3.1 的 FFT 重写到 3.6 的 GitHub 化维护流程,CHANGELOG_archive.md 完整记录了 SuperCollider 从桌面实验工具走向跨平台音频编程系统的关键七年。理解这些历史修复,不仅能帮助开发者判断 API 行为差异的来源,也能为排查当前版本的疑难问题提供宝贵的版本定位线索——这正是归档变更日志在源码仓库中的长期价值所在。