原文:AudioKit Tutorial: Getting Started 作者:Colin Eberhardt 同时感谢:kmyhy
近来手上有一些音频相关的开发工作,搜搜基Hub,目前最为强大,性能屌爆,编码炫酷的开源库也只有AudioKit了。
Raywenderlich
也能找到相关教程,介于作者是3.0+的教程,很多代码都不能跑了,特此整理一趴。 本文不仅是一篇iOS开发教程,更是一篇精彩的科普文。关于编程与艺术的结合,声学物理与音乐的碰撞,尽在此文。推荐所有程序员都好好读一读它,让我们的生活除了代码,还有艺术,还有音乐。感谢作者Colin Eberhardt。
iOS 设备提供了丰富的多媒体体验,比如绚丽的视觉效果、声音和可触摸的交互界面。尽管能够使用各种各样的特性,但作为开发者,我们更多地关注了应用的视觉设计,而忽略了用户体验的声学效果。
AudioKit
是一个高级音频框架,由声学设计师、程序员和音乐家为 iOS 专门打造。AudioKit底层混合了Swift
、Objective-C
、C++
和C
,负责和苹果音频已硬件的Api打交道。所有神奇(同时十分复杂的)技术都封装成为极其友好的 Swift Api ,你甚至可以直接在Xcode
的Playground
中使用它。
本文无法全面覆盖 AudioKit 的知识点。相反,我们会通过介绍声音合成和计算机声频的历史,来带你进行一次有趣和时尚的 AudioKit 之旅。通过这种方式,你会学到基本的声学物理,了解早期的合成器比如电子琴是如何工作的。最终来到现代,一个大混音时代。
请给自己来一杯咖啡,拖过一张椅子,开始我们的旅程!
开始
原教程的原始内容使用的是 3.4.0 版本,用的是Playground做案例,本文使用最新的 4.3.0 ,用Xcode创建的Swift项目做案例。
港真,教程的第一步并不是特别鸡冻的。为了在 Playground 中使用 AudioKit,我们必须提前进行一些准备工作。
我们需要先到AudioKit下源码AudioKit-4.3,或者自行clone:
git clone https://github.com/AudioKit/AudioKit.git
复制代码
解压好后用Terminal
进入AudioKit-4.3
文件夹执行编译命令:
$ cd Frameworks
$ ./build_frameworks.sh
复制代码
编译时间较长(14的顶配编译的近十分钟吧),你阔以继续阅读,或者撸一把,或者鸡一把。
一定要编译完成,编译好后进入Playgrounds
文件,打开下面的AudioKitPlaygrounds.xcodeproj
,这里我们就阔以看官方为我们写好的示例代码,提前体验一把 AudioKit 的强大。体验完了别忘了纸巾,进入正题开始教程之旅。
新建一个名为Jornery
的Playground
。录入一下代码:
import AudioKitPlaygrounds
import AudioKit
let oscillator = AKOscillator()
AudioKit.output = oscillator
try? AudioKit.start()
oscillator.start()
sleep(10)
复制代码
编译时,你会听到大约 10 秒钟的蜂鸣声。你可以点击 Playground 调试窗口左下角的 Play/Stop 按钮停止或运行 Playground。
注意:建议打开工程的时候就直接
Command + B
编译一遍,再跑想看的代码。如果 Playground 执行出错,并在 Debug 窗口中出现错误,你可以重启 Xcode。不幸的是,当 Playground 和框架一起使用时,总是容易出现一些小问题,并且无法预知。 另外建议把 Run 方式改为Manually Run
,Automatically Run
太容易故障了。
振荡器和声学基础
人类通过物体制造音乐——通过击打、拖拉或者弹奏等形式——有数千年的历史。我们的许多民族乐器,比如鼓、吉他,已经发明几个世纪了。电子乐器的第一个次使用记录,或者是第一次通过电路发声,是 1874 年 Elisha Gray 创下的,他从事电信行业。Elisha 发明了振荡器,最原始的声音合成装置,你的探索将从这个东西开始。
右键点击 Playground,选择 New Playground Page,创建一个新的 Playground 文件 Oscillators
。
将 Xcode 产生的代码替换为:
import AudioKitPlaygrounds
import AudioKit
// 1. Create an oscillator
let oscillator = AKOscillator()
// 2. Start the AudioKit 'engine'
AudioKit.output = oscillator
try? AudioKit.start()
// 3. Start the oscillator
oscillator.star