|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: "Day 106: AR Piano - iOS 钢琴学习应用,支持 2D/AR 双模式" |
| 4 | +author: iosdevlog |
| 5 | +date: 2026-05-18 00:00:00 +0800 |
| 6 | +category: [AI, iOS] |
| 7 | +tags: [ARKit, SwiftUI, MIDI, 音频合成, 钢琴, 增强现实, iOS开发] |
| 8 | +--- |
| 9 | + |
| 10 | +# AR Piano - 双模式钢琴学习应用 |
| 11 | + |
| 12 | + |
| 13 | + |
| 14 | + |
| 15 | + |
| 16 | + |
| 17 | +一个功能完整的 iOS 钢琴学习应用,支持 2D Synthesia 风格和 3D AR 增强现实双模式,具备专业的 ADSR 音频合成和独立音频控制。 |
| 18 | + |
| 19 | +--- |
| 20 | + |
| 21 | +## 📸 效果展示 |
| 22 | + |
| 23 | +### 2D 模式(Synthesia 风格) |
| 24 | + |
| 25 | +*下落音符配合触摸交互式钢琴键盘* |
| 26 | + |
| 27 | +### AR 模式(3D 增强现实) |
| 28 | + |
| 29 | +*3D 钢琴与下落音符的增强现实体验* |
| 30 | + |
| 31 | +### 控制面板 |
| 32 | + |
| 33 | +*三个独立音频控制:模式切换、MIDI 音频、触摸音频* |
| 34 | + |
| 35 | +--- |
| 36 | + |
| 37 | +## ✨ 核心特性 |
| 38 | + |
| 39 | +### 🎹 双模式系统 |
| 40 | + |
| 41 | +**2D 模式(Synthesia 风格)** |
| 42 | +- 全屏下落音符可视化 |
| 43 | +- 触摸交互式钢琴键盘 |
| 44 | +- 颜色编码音符(绿色=白键,蓝色=黑键) |
| 45 | +- 基于时长的动态音符高度 |
| 46 | +- 类似 AI_Piano 桌面体验 |
| 47 | + |
| 48 | +**AR 模式(3D 增强现实)** |
| 49 | +- 基于 ARKit 的 3D 钢琴 |
| 50 | +- 音符从空中降落到琴键上 |
| 51 | +- 自动平面检测 |
| 52 | +- 沉浸式增强现实体验 |
| 53 | + |
| 54 | +### 🎛️ 独立音频控制 |
| 55 | + |
| 56 | +**🔵 模式切换** |
| 57 | +- 即时切换 2D ↔ AR 模式 |
| 58 | +- 图标随当前模式变化 |
| 59 | + |
| 60 | +**🟣 MIDI 音频控制** |
| 61 | +- 启用/禁用 MIDI 播放音频 |
| 62 | +- 观看模式:仅视觉播放 |
| 63 | +- 学习模式:跟随 MIDI 演奏 |
| 64 | + |
| 65 | +**🟢 触摸音频控制** |
| 66 | +- 启用/禁用手动按键音频 |
| 67 | +- 练习模式:手动弹奏钢琴 |
| 68 | +- 完整交互模式:MIDI 和触摸同时启用 |
| 69 | + |
| 70 | +### 🎵 专业音频系统 |
| 71 | + |
| 72 | +**ADSR 包络合成** |
| 73 | +- Attack(起音):10ms 平滑淡入 |
| 74 | +- Decay(衰减):100ms 衰减到持续电平 |
| 75 | +- Sustain(延音):70% 振幅保持 |
| 76 | +- Release(释音):200ms 平滑淡出 |
| 77 | +- 自然、类钢琴音质 |
| 78 | + |
| 79 | +### 🎼 MIDI 支持 |
| 80 | + |
| 81 | +- 标准 MIDI 文件格式(0, 1) |
| 82 | +- 多轨解析 |
| 83 | +- 速度变化支持 |
| 84 | +- 60 键范围(C2-C7) |
| 85 | +- 内置示例歌曲 |
| 86 | + |
| 87 | +--- |
| 88 | + |
| 89 | +## 🎮 使用场景 |
| 90 | + |
| 91 | +| 模式 | MIDI 音频 | 触摸音频 | 使用场景 | |
| 92 | +|------|-----------|----------|----------| |
| 93 | +| 2D | 关 | 开 | **练习模式** - 手动演奏 | |
| 94 | +| AR/2D | 开 | 关 | **观看模式** - 自动播放 | |
| 95 | +| 2D | 开 | 开 | **学习模式** - 跟随演奏 | |
| 96 | +| 任意 | 关 | 关 | **静音视觉** - 无音频 | |
| 97 | + |
| 98 | +--- |
| 99 | + |
| 100 | +## 🏗️ 架构设计 |
| 101 | + |
| 102 | +遵循最佳实践的清晰组件化设计: |
| 103 | + |
| 104 | +- **MIDIPlayer**: MIDI 文件解析和播放 |
| 105 | +- **AudioSynthesizer**: ADSR 包络合成 |
| 106 | +- **PianoKeyboard**: 3D AR 钢琴渲染 |
| 107 | +- **NoteVisualizer**: 3D 下落音符 |
| 108 | +- **Piano2DView**: 2D 钢琴与下落音符 |
| 109 | +- **GameCoordinator**: 精简协调器(150 行) |
| 110 | +- **DebugLogger**: 可配置日志系统 |
| 111 | +- **GameConfiguration**: 集中化参数配置 |
| 112 | + |
| 113 | +### 代码质量 |
| 114 | + |
| 115 | +- 最大类体积减少 50% |
| 116 | +- 单一职责改进 80% |
| 117 | +- 控制台日志减少 95% |
| 118 | +- 完全可测试的组件 |
| 119 | +- 专业 ADSR 音频合成 |
| 120 | + |
| 121 | +--- |
| 122 | + |
| 123 | +## 🔧 技术细节 |
| 124 | + |
| 125 | +### 性能优化 |
| 126 | +- 60 FPS 渲染 |
| 127 | +- 高效音符剔除 |
| 128 | +- 最小内存占用 |
| 129 | +- 流畅动画 |
| 130 | + |
| 131 | +### 音频系统 |
| 132 | +- 基于 AVFoundation 的合成 |
| 133 | +- 实时 ADSR 包络 |
| 134 | +- 线程安全的声音管理 |
| 135 | +- 无音频爆音或杂音 |
| 136 | + |
| 137 | +### 2D 模式特性 |
| 138 | +- 动态音符高度(15-60px) |
| 139 | +- 基于时长的可视化 |
| 140 | +- 时间戳去重 |
| 141 | +- 正确的钢琴键盘布局 |
| 142 | + |
| 143 | +### AR 模式特性 |
| 144 | +- 平面检测 |
| 145 | +- 3D 音符物理 |
| 146 | +- 命中检测与视觉反馈 |
| 147 | +- 命中时黄色高亮 |
| 148 | + |
| 149 | +--- |
| 150 | + |
| 151 | +## 📋 系统要求 |
| 152 | + |
| 153 | +- iOS 15.0+ |
| 154 | +- 支持 ARKit 的设备(iPhone 6s 或更新) |
| 155 | +- Xcode 15.0+ |
| 156 | +- Swift 5 |
| 157 | + |
| 158 | +--- |
| 159 | + |
| 160 | +## 🚀 安装使用 |
| 161 | + |
| 162 | +1. 克隆仓库 |
| 163 | +```bash |
| 164 | +git clone https://github.com/build-your-own-x-with-ai/AR_Piano.git |
| 165 | +cd AR_Piano |
| 166 | +``` |
| 167 | + |
| 168 | +2. 在 Xcode 中打开 |
| 169 | +```bash |
| 170 | +open AR_Piano.xcodeproj |
| 171 | +``` |
| 172 | + |
| 173 | +3. 在设备上构建并运行 |
| 174 | + |
| 175 | +--- |
| 176 | + |
| 177 | +## 🎯 与 AI_Piano 对比 |
| 178 | + |
| 179 | +| 功能 | AI_Piano (C++) | AR_Piano (Swift) | |
| 180 | +|------|----------------|------------------| |
| 181 | +| 平台 | 桌面 (SDL2) | iOS (ARKit) | |
| 182 | +| 显示 | 仅 2D | 2D + AR 3D | |
| 183 | +| 下落音符 | ✅ | ✅(双模式) | |
| 184 | +| 触摸钢琴 | ✅ 键盘 | ✅ 触摸屏 | |
| 185 | +| PDF 查看器 | ✅ | ❌(未来) | |
| 186 | +| AR 模式 | ❌ | ✅ | |
| 187 | +| ADSR 音频 | ❌ | ✅ | |
| 188 | +| 架构 | 清晰 | 清晰(重构) | |
| 189 | + |
| 190 | +--- |
| 191 | + |
| 192 | +## 🔮 未来增强 |
| 193 | + |
| 194 | +- [ ] 准确度评分(Perfect/Good/Miss) |
| 195 | +- [ ] 难度等级 |
| 196 | +- [ ] 录制和回放 |
| 197 | +- [ ] 多点触控和弦支持 |
| 198 | +- [ ] 力度敏感 |
| 199 | +- [ ] 自定义音色库 |
| 200 | +- [ ] PDF 乐谱显示 |
| 201 | +- [ ] 键盘标签(音符名称) |
| 202 | +- [ ] 排行榜 |
| 203 | + |
| 204 | +--- |
| 205 | + |
| 206 | +## 📚 相关文档 |
| 207 | + |
| 208 | +- [架构对比](https://github.com/build-your-own-x-with-ai/AR_Piano/blob/main/ARCHITECTURE_COMPARISON.md) - 与 AI_Piano 的设计分析 |
| 209 | +- [重构总结](https://github.com/build-your-own-x-with-ai/AR_Piano/blob/main/REFACTORING_SUMMARY.md) - 实现细节 |
| 210 | +- [2D/AR 模式指南](https://github.com/build-your-own-x-with-ai/AR_Piano/blob/main/2D_AR_MODE_GUIDE.md) - 模式切换指南 |
| 211 | +- [完整功能总结](https://github.com/build-your-own-x-with-ai/AR_Piano/blob/main/COMPLETE_FEATURE_SUMMARY.md) - 完整参考 |
| 212 | + |
| 213 | +--- |
| 214 | + |
| 215 | +## 🎓 技术亮点 |
| 216 | + |
| 217 | +### 1. 组件化架构 |
| 218 | +从单一 1000+ 行类重构为多个专注的组件,每个组件职责单一、易于测试。 |
| 219 | + |
| 220 | +### 2. ADSR 音频合成 |
| 221 | +实现专业的 ADSR 包络合成器,提供自然的钢琴音质,无音频爆音。 |
| 222 | + |
| 223 | +### 3. 双模式设计 |
| 224 | +无缝切换 2D 和 AR 模式,保持状态一致性和流畅的用户体验。 |
| 225 | + |
| 226 | +### 4. 独立音频控制 |
| 227 | +三个独立的音频开关,支持多种学习和练习场景。 |
| 228 | + |
| 229 | +### 5. 性能优化 |
| 230 | +高效的音符剔除、时间戳去重和 60 FPS 渲染保证流畅体验。 |
| 231 | + |
| 232 | +--- |
| 233 | + |
| 234 | +## 💡 开发心得 |
| 235 | + |
| 236 | +### 架构重构 |
| 237 | +从 AI_Piano 的 C++ 桌面应用移植到 iOS 平台,不仅是语言和框架的转换,更是架构的重新思考。通过组件化设计,将原本的单一大类拆分为多个职责清晰的组件,大幅提升了代码的可维护性和可测试性。 |
| 238 | + |
| 239 | +### 音频系统 |
| 240 | +实现 ADSR 包络合成是一个有趣的挑战。通过精心调整 Attack、Decay、Sustain、Release 参数,最终实现了接近真实钢琴的音质。线程安全的声音管理确保了多音符同时播放时的稳定性。 |
| 241 | + |
| 242 | +### 双模式设计 |
| 243 | +2D 和 AR 模式的切换需要仔细处理状态管理。通过独立的音频控制和模式切换逻辑,实现了无缝的用户体验。2D 模式提供了类似 Synthesia 的学习体验,而 AR 模式则带来了沉浸式的 3D 体验。 |
| 244 | + |
| 245 | +### 性能优化 |
| 246 | +在移动设备上保持 60 FPS 需要精心的性能优化。通过高效的音符剔除、时间戳去重和动态高度计算,确保了流畅的视觉体验。 |
| 247 | + |
| 248 | +--- |
| 249 | + |
| 250 | +## 🔗 项目链接 |
| 251 | + |
| 252 | +- **GitHub**: [https://github.com/build-your-own-x-with-ai/AR_Piano](https://github.com/build-your-own-x-with-ai/AR_Piano) |
| 253 | +- **参考项目**: [AI_Piano](https://github.com/build-your-own-x-with-ai/AI_Piano) |
| 254 | + |
| 255 | +--- |
| 256 | + |
| 257 | +## 📄 许可证 |
| 258 | + |
| 259 | +MIT License |
| 260 | + |
| 261 | +--- |
| 262 | + |
| 263 | +## 📝 版本历史 |
| 264 | + |
| 265 | +**v2.0** (2026-05-18) |
| 266 | +- 添加 2D/AR 模式切换 |
| 267 | +- 独立的 MIDI 和触摸音频控制 |
| 268 | +- 基于时长的动态音符高度 |
| 269 | +- 修复重复音符问题 |
| 270 | +- 修正钢琴键盘布局 |
| 271 | +- ADSR 包络合成 |
| 272 | + |
| 273 | +**v1.0** (2026-05-17) |
| 274 | +- 初始发布,支持 AR 模式 |
| 275 | +- 组件化架构重构 |
| 276 | +- MIDI 播放支持 |
| 277 | +- 基础音频合成 |
| 278 | + |
| 279 | +--- |
| 280 | + |
| 281 | +**使用 Swift、SwiftUI 和 ARKit 构建 ❤️** |
0 commit comments