展开的 iPhone 上运行的 Accorduon,展示手风琴键盘和贝司按钮。

Accorduon:把折叠 iPhone 当手风琴来演奏

Accorduon 把 iPhone Duo 的铰链变成了手风琴的风箱。本文介绍它能做什么、如何构建,以及 MIT 许可允许你对代码做什么。

要点摘要
  • Accorduon 是一台可以演奏的手风琴:折叠角度驱动风箱,琴键驱动簧片。
  • 它采用 MIT 许可,因此合成引擎和铰链处理都可以搬进商业应用。
  • 它需要 Xcode 27.1+ 和 iOS 27.1 SDK,因为铰链 API 是全新的。
  • 合成器由 PolyBLEP 脉冲构成而非采样,所以乐器本身不带任何音频文件。

折叠屏手机有铰链,而铰链本质上是一个传感器。大多数读取它的应用都做同样几件可预期的事:拉伸布局、把列表拆到两半屏幕,或者在其中一侧放一条工具栏。Accorduon 读取同一个角度,却把它当作音乐表现控制器。手机就是乐器,折叠就是演奏动作。

这是一个很小的项目,只有一个提交,作者是 Artem Novichkov。它值得一写的原因在于,它把三件单独看都很棘手的事完整、清晰地摆在一起:iOS 27 的铰链 API、Swift 的实时音频合成,以及 SwiftUI 中的多点触控键盘处理。

它能做什么

在 iPhone Duo 上打开应用,你会看到一台双面板手风琴。上面板是高音键盘,用一只手的手指弹奏钢琴排列。下面板是贝斯和弦按钮,就像手风琴左手侧的操作方式:F、C、G、Dm、Am、Em。

铰链角度就是风箱。把手机展开,音符会更快、更开阔;把它合拢,音符就收拢下去。音高也随折叠而弯折,上面还叠了一层类似呼吸的气流噪声,因为真正的手风琴并不是干净的正弦波,簧片噪声是它听起来像手风琴的重要原因。

内置了五首曲子,以音符数据而非音频文件的形式写就:欢乐颂、小星星、铃儿响叮当、生日快乐和喀秋莎。每一首都是一串小节,可以在键盘上完整弹下来。

如何安装

Accorduon 目前没有公开的 App Store 版本,也没有可下载的 GitHub Release 资源,因此只能从源码构建。你需要 Xcode 27.1 或更高版本以及 iOS 27.1 SDK,因为应用依赖的铰链 API 在更早的版本中并不存在。音频代码采用的并发模型还需要 Swift 6。

克隆仓库并构建 scheme。模拟器目标是折叠屏 iPhone Duo:

git clone https://github.com/artemnovichkov/Accorduon.git
cd Accorduon

xcodebuild -project Accorduon.xcodeproj -scheme Accorduon \
  -destination 'platform=iOS Simulator,name=iPhone Duo' build

在模拟器中可以通过设备控制来驱动铰链,所以没有真机也能试出折叠手势。在真机上,就是真的去折这部手机。

如何使用

高音键盘按常规弹奏即可——它支持多点触控,所以能按和弦,而且它是基于 SpatialEventGesture 而不是一堆可点击视图的网格构建的。这一点很重要,因为用按钮拼成的键盘无法让手指在多个琴键上滑动,而演奏乐器恰恰就是这个动作。

另一只手按贝斯按钮做和弦伴奏。然后操作铰链。折叠角度会持续送入合成器;应用不靠轮询,而是通过铰链回调捕捉变化:

.onHingeChange { _, newContext in
    guard let degrees = newContext.hinge?.angle.degrees else { return }
    let speed = abs(degrees - last.degrees) / seconds
    audio.synth.pump(speed / 120)
}

仔细读就能看出设计意图:这个处理函数计算角度变化有多快,按参考速率归一化后送入合成器。也就是说,塑造声音的不是角度本身,而是折叠的速度——风箱由运动驱动,这正是真实手风琴的行为。

演示

上面的截图展示了双面板布局。静态图无法传达的是这种耦合:键盘、贝斯按钮和铰链汇入同一个音频图,乐器同时对这三者做出反应。如果你想在构建之前先听听效果,请到 README 里找有没有录音,因为仓库里只有截图。

这件乐器值得在真机上跑,而不是模拟器。铰链手势是这款应用的核心,用模拟器控件来代替折叠,效果远不如真的去折。

音频是怎么实现的

如果你是冲着代码来的,这是最值得读的部分。项目里没有任何采样文件。簧片音色是从零生成的,其做法由一系列刻意的选择构成,叠加起来才有簧片乐器的味道:

每个音用三片簧片,相隔 12 音分——一片偏低、一片准音、一片偏高。这就是让手风琴或口琴产生颤动感的失谐簧片技巧,也是把合成簧片音与普通音色拉开差距的最大单一因素。

再加一片低一个八度的簧片来增加厚度,避免低频发虚。

振荡器使用 PolyBLEP 脉冲。朴素的方波或脉冲波在高频会有严重混叠;PolyBLEP 以极低成本平滑了不连续点,这正是它能在移动应用里充当软合成器的原因。

滤波路径中有两个谐振,用来替代乐器箱体的共鸣。

弯音和一层气流嘶声。这两者让声音在风箱运动时不会僵住,而是随折叠做出反应。

输出经过 AVAudioSourceNode,也就是直接写入采样的回调式节点。这意味着音频线程是实时的,它触碰的状态必须是安全的,所以共享状态放在 Mutex 之后。如果你要自己做发声的东西,这里就是该读的地方。

许可:你可以做什么

Accorduon 采用 MIT 许可,© 2026 Artem Novichkov。对这类项目来说,实务上的解读简单而宽松:

可以商用。围绕这个合成器做付费应用,或者把铰链处理放进你销售的产品里。MIT 并不在意你的应用是否闭源。

可以修改和再分发,包括作为采用其他许可的更大作品的一部分。

在复制的实质性部分中必须保留版权声明和许可文本。义务就这一条——没有 copyleft,不要求公开你的修改,也不限制你如何使用成果。

不提供担保。与任何 MIT 项目一样,即使运行出问题,作者也不承担责任。

实际上:注明出处,你就可以自由使用。如果你真要拿它做点什么,最可复用的两处是 PolyBLEP 簧片合成器和 onHingeChange 的处理逻辑——它们都属于从空文件写起比看起来更麻烦的那类代码。

值得构建吗

如果你有折叠屏 iPhone 并且会弹点什么,那值得——构建很小,而且它确实能当乐器演奏。如果你是 iOS 开发者,价值在别处,而且可能更大:这是极少数把 iOS 27 折叠 API 用于布局以外目的的开源示例之一,而它的音频架构对任何需要实时发声的应用来说都是一个干净的起点。无论如何,克隆并构建只需要几分钟。

项目概况

许可证
MIT
平台
iOS 27.1+ / Xcode 27.1+
开发语言
Swift 6, SwiftUI
查看版本
main @ 2026-09-20

安装

git clone https://github.com/artemnovichkov/Accorduon.git
cd Accorduon

xcodebuild -project Accorduon.xcodeproj -scheme Accorduon \
  -destination 'platform=iOS Simulator,name=iPhone Duo' build

演示

手风琴界面在折叠屏 iPhone Duo 上的运行效果——一侧是高音键盘,另一侧是贝斯按钮。
手风琴界面在折叠屏 iPhone Duo 上的运行效果——一侧是高音键盘,另一侧是贝斯按钮。

许可说明

MIT 是宽松许可:只要你在复制的实质性部分中保留版权声明和许可文本,就可以在商业应用和闭源应用中使用、修改并再分发这些代码。不提供任何担保。实际义务只有署名一项。