我正在开发的应用程序需要在声音链中动态添加/删除/重新排列组件。
到目前为止,我主要.disconnectOutput()在大多数组件上使用该方法,然后重新连接所有组件。这在大多数情况下都有效,但有时似乎一个节点连接在声音链中的多个点,如果节点连接到AudioKit.output.
AudioKit 提供了许多公共方法,例如.detach(), .disconnectInput(),.disconnect()我不太清楚修改声音链的最干净或最安全的方法。做这个的最好方式是什么?
另外,是否有某种方法可以跟踪哪些节点连接到哪些节点?
如何在 AudioKit iOS 中将输入节点动态连接到活动链中的混音器?
环境:AudioKit 4.3、Swift 4.1、Xcode 9.4.1、iOS 11.4。
问题
我正在构建一个应用程序,其中包含由 AKNode 对象链组成的动态模块。这些模块根据请求动态连接到正在运行的 AudioKit 引擎的专用 AKMixer 节点或从其分离。这很有效,除非尝试连接任何包含输入节点(例如 AKMicrophone 或 AKStereoInput)的模块,否则会导致崩溃:
2018-06-14 10:13:33.696384-0700 MyApp[3440:2578936] [mcmx] 338: 输入总线 0 采样率为 0 2018-06-14 10:13:33.6967049:MyApp3[0704e] [mcmx] ] AVAEInternal.h:103:_AVAE_CheckNoErr: [AVAudioEngineGraph.mm:3632:UpdateGraphAfterReconfig: (AUGraphParser::InitializeActiveNodesInOutputChain(ThisGraph, kOutputChainFullTraversal, *conn.srcNode, isChainActive)): 错误 -10875-13070:10875-1307 -0700 DynamicMic[3440:2578936] *** 由于未捕获的异常“com.apple.coreaudio.avfaudio”而终止应用程序,原因:“错误 -10875”
或者,调用AudioKit.stop(),然后执行有问题的连接,然后调用AudioKit.start()无法启动 AudioKit,但它避免了崩溃:
AKMicrophone.swift:init():45:Mixer 输入 8 2018-06-14 10:16:09.532277-0700 MyApp[3443:2580588] [mcmx] 338:输入总线 0 采样率为 0 2018-06-1 16:09.532603-0700 MyApp[3443:2580588] [avae] AVAEInternal.h:103:_AVAE_CheckNoErr: [AVAudioEngineGraph.mm:1265:Initialize: (err = AUGraphParser::InitializeActiveNodesInOutputChain),GraphActiveNodesInOutputChain() ): 错误 -10875 2018-06-14 10:16:09.532654-0700 MyApp[3443:2580588] [avae] AVAudioEngine.mm:149:-[AVAudioEngine …
我想读取midi文件并在触发音符事件时显示内容.我发现了这个stackoverflow问题,其中第二个答案建议使用AudioKit: 如何为我的音频应用程序获得可靠的时间? 更确切地说,建议是使用AKSequencer吸收应用程序中的midi文件,然后将其链接到AKCallbackInstrument以触发事件并为每个midi音符事件调用函数.
我使用本教程安装了AudioKit 4.5.5 https://www.youtube.com/watch?v=iUvWxWvRvo8 然后我设法运行了教程的代码,所以我知道AudioKit正确地包含在项目中.
然后我写了自己的代码:
let sequencer = AKSequencer(filename: "myMidiFile.mid")
let callbackInstr = AKCallbackInstrument()
callbackInstr.callback = myCallBack
sequencer.setGlobalMIDIOutput(callbackInstr.midiIn)
func myCallBack(a:UInt8, b:MIDINoteNumber, c:MIDIVelocity){
print(b)
}
func test() {
do {
try AudioKit.start()
}
catch {
print("Oops! AudioKit didn't start!")
}
sequencer.play()
}
Run Code Online (Sandbox Code Playgroud)
当我尝试构建我的项目时,该行有一个错误
sequencer.setGlobalMIDIOutput(callbackInstr.midiIn)
错误是
Value of type 'AKCallbackInstrument' has no member 'midiIn'
我试图清理项目并重新构建,但错误仍然存在.
你能解释一下我为什么会收到这个错误?我该怎么做才能解决它?因为在AudioKit文档中,我发现AKCallbackInstrument是AKMIDIInstrument的子类,它有一个名为'midiIn'的属性. https://audiokit.io/docs/Classes/AKCallbackInstrument.html https://audiokit.io/docs/Classes/AKMIDIInstrument.html
我在 AudioKit 4.9.1 上,无法使用新的AKSequencer(替换AKAppleSequencer)播放 MIDI 文件。没有声音播放。假设 MIDI 文件和样本已正确加载,因为它们以前使用AKAppleSequencer. 还启用了背景音频模式功能。
这是相关代码:(我也尝试过AKSampler,AKAppleSampler但结果相同)
class MIDIPlayer {
var sampler: AKSampler
var legacySampler: AKAppleSampler
var sequencer: AKSequencer
init(withSfz sfz: String, orSf2 sf2: String, andMidiFile midiFile: String) {
self.sampler = AKSampler()
self.legacySampler = AKAppleSampler()
try? legacySampler.loadSoundFont(sf2, preset: 0, bank: 0)
sampler.loadSFZ(url: Bundle.main.url(forResource: sfz, withExtension: "sfz")!)
AudioKit.output = sampler
try? AudioKit.start()
sequencer = AKSequencer(targetNode: sampler)
// sequencer = AKSequencer(targetNode: legacySampler)
let midi = AKMIDIFile(url: Bundle.main.url(forResource: midiFile, withExtension: …Run Code Online (Sandbox Code Playgroud) 嘿,我想知道是否有人可以指出我正确的方向。
我正在构建一个 Mac 音频应用程序,我需要执行以下操作
到目前为止,我已经研究过使用以下内容:
AudioKit
这个框架看起来很棒,并且有我想做的大部分事情的示例应用程序,但是它似乎只接受 Mac 在设置中选择的音频输入。这对我来说是不可能的,因为我希望用户能够在应用程序中进行选择(就像 GarageBand 或 Neural Dsp 插件一样)
使用AudioEngine我可以获得可用的输入设备,但我发现的所有内容都表明它们在应用程序中不可更改 - 这是显示它们的代码
struct InputDevicePicker: View {
@State var device: Device
var engine: AudioEngine
var body: some View {
Picker("Input: \(device.deviceID)", selection: $device) {
ForEach(getDevices(), id: \.self) {
Text($0.name)
}
}
.pickerStyle(MenuPickerStyle())
.onChange(of: device, perform: setInputDevice)
}
func getDevices() -> [Device] {
AudioEngine.inputDevices.compactMap { $0 }
}
func setInputDevice(to device: Device) { …Run Code Online (Sandbox Code Playgroud) macos avfoundation avcapturesession avcapturedevice audiokit
我正在使用AudioKit框架开发一个小型应用程序,该应用程序能够监听麦克风输入频率和幅度,并且我想在每次频率和幅度获得特定值时触发一个事件(显然我想触发一个函数) ->特定音调的事件。
现在我正在为我的应用程序使用这个简单的 Swift 代码:
mic = AKMicrophone()
tracker = AKFrequencyTracker(mic)
silence = AKBooster(tracker, gain: 1)
AKSettings.audioInputEnabled = true
AudioKit.output = silence
AudioKit.start()
let t = Timer.scheduledTimer( timeInterval: 0.05, target: self, selector: #selector(self.checkFrequencyAmplitude), userInfo: nil, repeats: true)
Run Code Online (Sandbox Code Playgroud)
func checkFrequencyAmplitude() {
let frequency = tracker.frequency,
amplitude = tracker.amplitude
if (frequency > 1000 && frequency < 1200 && amplitude > 0 && amplitude < 0.2) {
// do stuff if the specific tone appeared
}
}
Run Code Online (Sandbox Code Playgroud)
但说实话,我在使用 …
我正在使用AudioKit开发一个音频应用程序,它涉及定期停止AudioKit,重新安排或替换AKNode子类链,然后重新启动AudioKit.这一直顺利进行,直到我尝试过AKMicrophone.
如果AKMicrophone在初始声音链中存在,即,当我第一次调用时AudioKit.start(,它可以正常工作.但是,如果我AKMicrophone在之前的调用之后的某个时刻进入声音链AudioKit.start(),则应用程序将在下一次AudioKit.start()调用时崩溃,从而产生以下错误消息:
...[avae] AVAudioEngine.mm:149:-[AVAudioEngine prepare]: Engine@0x1c0007170: could not initialize, error = -10875
...[mcmx] 338: input bus 0 sample rate is 0
...[avae] AVAEInternal.h:103:_AVAE_CheckNoErr: [AVAudioEngineGraph.mm:1266:Initialize:
(err = AUGraphParser::InitializeActiveNodesInOutputChain(ThisGraph, kOutputChainOptimizedTraversal, *GetOutputNode(), isOutputChainActive)): error -10875
Run Code Online (Sandbox Code Playgroud)
为了说明,以下代码顺利运行:
let mic = AKMicrophone()
if let input = AudioKit.inputDevice {
try! mic.setDevice(input)
}
AudioKit.output = mic
AudioKit.start()
Run Code Online (Sandbox Code Playgroud)
但是如果它之前被调用AudioKit.start()就会崩溃:
AudioKit.output = AKOscillator()
AudioKit.start()
AudioKit.stop()
let mic = AKMicrophone()
if let input = …Run Code Online (Sandbox Code Playgroud) 我最近完成了从 AudioKit 3.7 到 4.2 的迁移(使用 Cocoapods),这是 XCode 9.3 所需的。我按照迁移指南将 AKAudioPlayer 更改为 AKPlayer。
当 AKPlayer 播放音频文件时,AudioKit 崩溃并出现以下错误:
2018-04-17 09:32:43.042658+0200hearfit[3509:2521326][avae]AVAEInternal.h:103:_AVAE_CheckNoErr:[AVAudioEngineGraph.mm:3632:UpdateGraphAfterReconfig:(AUGraphParser::InitializeActiveNodesInOutputChain(ThisGraph, kOutputChainFull)遍历,*conn .srcNode,isChainActive)):错误-10875 2018-04-17 09:32:43.049372+0200hearfit[3509:2521326]*** 由于未捕获的异常“com.apple.coreaudio.avfaudio”而终止应用程序,原因:“错误-10875” *** 首先抛出调用堆栈: (0x1847d6d8c 0x1839905ec 0x1847d6bf8 0x18a0ff1a0 0x18a11bf58 0x18a12aab0 0x18a128cdc 0x18a1a1738 0x18a1a160c 0x10519192c 0x10519 d2f4 0x10519d64c 0x10503afdc 0x10507c4a0 0x10507c01c 0x104f6d9cc 0x1852233d4 0x18477faa8 0x18477f76c 0x18477f010 0x18477cb60 0x18 469cda8 0x18667f020 0x18e67d78c 0x10504dfd4 0x18412dfc0) libc++abi.dylib:以 NSException 类型的未捕获异常终止
有时它发生在第一次播放时,有时第一次播放正确,但第二次播放则不然。
迁移之前一切都运行良好。我还尝试保留 AKAudioPlayer: 声音正常播放,但 AKFrequencyTracker 不再工作。
这是我的设置:
AKPlayer 1播放短音频文件(1 到 5 秒之间)AKFrequencyTracker用于显示绘图AKPlayer 2播放背景声音(音量必须可配置)AKWhiteNoise允许进行一些手动体积测量(使用 …我在 Swift 中使用 AudioKit 与 ios 11 和 AudioKit。我无法让我的应用程序使用 iPhone 麦克风而不是耳机内置的麦克风。它们是标准的苹果入耳式耳机。(有线而非蓝牙)
let mic = AKMicrophone()
if let inputs = AudioKit.inputDevices {
try! AudioKit.setInputDevice(inputs[1])
try! mic.setDevice(inputs[1])
}
AudioKit.output = mic
AudioKit.start()
Run Code Online (Sandbox Code Playgroud)
我尝试过输入 [1]、[2] 和 [3],但没有任何变化。在每种情况下,它都使用耳机内置的麦克风。即使输入[1]的输入描述是前置麦克风。
所以我觉得自己像个白痴,不得不在这里发帖以解决可能很简单的问题。我正在编写一个 iOS 应用程序,它将发送 MIDI 到另一个应用程序。对于我的第一个概念证明,我尝试向 iPhone 上的 GarageBand 发送一条注释。我正在尝试使用 AudioKit 来完成此任务。
我创建的代码如下:
import UIKit
import AudioKit
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
let midi = AudioKit.midi
...
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
midi.createVirtualOutputPort()
midi.openOutput()
}
...
func SomeFunc()
{
midi.sendNoteOnMessage(noteNumber: UInt8(note + (octave * 12)), velocity: 90, channel: 0)
usleep(UInt32(delay * second))
midi.sendNoteOffMessage(noteNumber: UInt8(note + (octave * 12)), velocity: 0, channel: 0)
}
}
Run Code Online (Sandbox Code Playgroud)
这是我收到的错误:
AKMIDI.swift:init():63:初始化 MIDI …
audiokit ×10
ios ×6
swift ×6
aksequencer ×1
avfoundation ×1
macos ×1
midi ×1
playback ×1
xcode ×1