我有一个音频应用程序,其中所有声音生成工作都是通过纯数据(使用libpd)完成的。
我已经快速编写了一个特殊的音序器,该音序器控制合成引擎在纯数据中播放的多个音序的开始/停止播放。
到目前为止,我完全避免在应用程序的任何方面使用Core Audio或AVFoundation,因为我对它们一无所知,而且它们似乎都需要C或Objective C编码,而我对此一无所知。
但是,从之前的问答中已经得知,我需要使用Core Audio或AVFoundation来获得准确的时间。没有它,我已经尝试了其他所有方法,并且时间完全混乱了(漫长,抖动)。
对我而言,关于Core Audio的所有教程和书籍似乎都极为广泛和深入。如果我从这些框架之一中需要的只是我的音序器的准确时序,那么您如何建议我成为Core Audio和Objective-C的新手,但拥有95%完成的音频应用程序?
这个话题已经被覆盖了无数次,我已经在我以前的应用程序中成功地使用了AKMIDICallbackInstrument旧的AKAppleSequencer。
我开始使用AKSequencer绝对惊人的新功能:优雅的界面,易于使用。但是,我一生都无法弄清楚如何用它处理回调事件。我需要使用回调来触发基于音序器播放的 GUI 事件。
这是我的示例代码:
private func setMetronome(bpm: BPM, beats:Int)
{
sequencer = AKSequencer(targetNode: metronomeSampler)
sequencer.tempo = bpm
sequencer.loopEnabled = false
sequencer.length = Double(beats)
metroCallback.callback = {status, noteNumber, velocity in
if let midiStatus = AKMIDIStatus(byte: status), midiStatus.type != .noteOn { return }
//Do callback stuff here
}
let metroCallbackTrack = sequencer.addTrack(for: metroCallback)
for i in 0..<beats
{
if i == 0
{
sequencer.add(noteNumber: MIDINoteNumber(67), position: Double(i), duration: 1.0)
metroCallbackTrack.add(noteNumber: MIDINoteNumber(67), position: Double(i), …Run Code Online (Sandbox Code Playgroud)