SuperCollider 版本演进史:从 3.1 到 3.6 的核心功能与缺陷修复档案解读

原创2026-10-07 23:58:49606 阅读
文章标签:音频处理编程语言

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 稳定性演进的暗线:

  1. GrainBuf 崩溃族:从 3.5.3(拒绝多声道 buffer)到 3.5.5(NaN position 崩溃)、再到 3.6.3(inf/NaN phase 双捕获),日志记录了该 UGen 输入合法性检查的逐步收紧过程;
  2. 正则表达式 / prString_FindRegexp 内存问题:3.4.2 的"match char array 过短"、3.4.3 的 GC 期间数组尺寸、3.4.5 的正则缓存修复,反映 GC 与原生 primitive 交互是 sclang 层的长期难点;
  3. OSC 边界情况:从 3.3 的"未知 OSC 类型标签避免内存损坏"、3.4 的 OSC 地址规范合规,到 3.6 的嵌套 OSC bundle 支持与非标准类型支持(#881、#878、#877),服务器与语言的 OSC 栈在此阶段趋于成熟。

如何在当今仓库中继续使用这份档案

结语

从 3.1 的 FFT 重写到 3.6 的 GitHub 化维护流程,CHANGELOG_archive.md 完整记录了 SuperCollider 从桌面实验工具走向跨平台音频编程系统的关键七年。理解这些历史修复,不仅能帮助开发者判断 API 行为差异的来源,也能为排查当前版本的疑难问题提供宝贵的版本定位线索——这正是归档变更日志在源码仓库中的长期价值所在。

登录后查看全文
supercollider