以一种非常出人意料的方式开启这一切,让我来介绍一下 CZP-1,这是一个在网页上实现的完整乐器,采用了 相位失真合成技术的软件实现。
使用 CZP-1,你可以 . . .
. . . 以及你能想到的任何其他事情。
“相位失真合成” 是 Casio 在 20 世纪 80 年代初开发的一种声音生成技术,并应用于 CZ-101 等产品中。我从未刻意靠近过 CZ 系列合成器,但我一直想尝试一下相位失真合成器,那么 2026 年的开发者该怎么做呢?显然是用智能体 (agents) 做一个。
不,这并不是一次性的“氛围编程” (vibe coding)。如果你那样做,声音听起来会不太对劲,UI 也会非常糟糕,但它确实能让你走得比预想的更远。这类东西的关键在于如何让其他人也能使用并将其完成。
前往 网页 并开启它。然后触摸按键,或使用电脑键盘弹奏音符。
如果你听不到任何声音,可能是你的音量调低了,或者手机处于静音模式。
在 Library 面板中,声音被组织成音库 (banks,即一组声音) 和程序 (programs,即单个声音)。应选择现有的 “Factory Presets” 音库,其中的不同声音展示了其潜力。
所以你制作了一个很酷的声音,并希望你的朋友也能使用它 . . . 没问题!你可以发送一个带有你特定声音的 CZP-1 网页链接。这是我之前制作的一个。
将其复制/粘贴到你常用的即时通讯软件中,或者保存在文档里,随你便。声音的数据就在链接本身,服务器上没有任何东西。
对于熟悉 MIDI 的人来说,MIDI 支持应该非常容易,它可以让你使用外部键盘或通过序列器 (sequencer) 来驱动它。它还支持映射到常用控制器的踏板和轮控。表情踏板会影响程序的力度敏感部分。
欲了解更多关于其他所有内容的详细信息,请查看 CZP-1 手册
这些年来,在尝试并放弃了几个音频项目后,我开始认为这是编程中最难的领域之一;那么,这正好可以作为对当前智能体编程 (agentic programming) 热潮的一次合适测试。
我的工作流程涉及让不同的智能体相互碰撞(至少使用了 Claude Code、Pi 中的 DeepSeek 和 Codex)。出于某种原因,它们似乎拥有互斥的盲点,因此这能通过迭代达到比任何单个智能体独立完成的结果都要成功得多的成果。
我开始时是提示 Claude 在网页上使用 JavaScript 实现一个相位失真合成器。最初的尝试令人惊讶,包括它决定使用浏览器自动化来将音频输出与从……某处获取的参考音频进行对比。问题在于声音听起来不对,参数被误解了,而且用户界面非常糟糕。但它实际上确实能跑通,即便 Claude 在其中幻觉出了一些极其离谱的预设。
随后,我带着关于 Claude 编写的音频引擎的评论将其转交给 DeepSeek,它进行了大量研究,并成功确定了基本波形的各个方面是错误的、混合函数是错误的等等,并完成了一轮修正。
这种来回碰撞的过程持续了大约一周,它们逐步挖掘了几乎每一个关于实现相位失真合成技术的主题信息源,不断迭代,最终达到了一个双方都无法再进行实质性改进的水平。
正是这一切促成了现在的音频引擎能够正常工作,且仅需极少数高度具体的干预。
但接下来还有整个用户界面和大量的面向用户的特性,比如复音(同时演奏多个音符的能力)、调制、带有滑音 (portamento) 的连奏 (legato) 滑动。所有这些都必须根据情况进行单独的沟通、设计、实现和调试。这一切都不是自动完成的,而且通常需要知道精确的算法(例如复音的轮询分配机制),并针对性地提出提示词才能完成该功能。
主要的教训是:
如果我再做一次,我会从 UI 工作开始的那一刻起就同步编写手册,因为事实证明,这是保持概念一致性的一个有用切入点。
为了强调低层级工作的现状有多疯狂,在做这件事时,我也感到很惊讶,并决定进行一项测试:将我在 Luduxia 制作的 Web 游戏从他们自定义的手写 WebGL2 渲染器移植到 WebGPU —— 这是一项我因为 iOS Safari 等原因一直拖延的任务。这项任务是在智能体的协助下完成的,并在非常宽松的 24 小时内完成了部署。你对 WebGL 和 WebGPU 越熟悉,就越觉得这令人震惊。(作为 CZP-1 工作的一部分,Luduxia 的构建系统本身也是由智能体移植的,并且正是它执行了合成器的最终构建)。
我们生活在一个新的时代,了解底层知识对于设计目的很有用,但在实现方面,你会被机器超越。对抗这一趋势只会带来痛苦,但它将会让很多人感到不安。
从 80 年代的合成器中可以获得很多伟大的灵感,例如跨厂商的 MIDI 互操作性、使用极少量内存和相对较少的计算量来表示和生成有趣声音的能力,以及一种信念:如果能帮助用户实现目标或仅仅是为了好玩,他们就会学习复杂且深奥的东西。希望以后会有更多关于此话题的内容。