标签: audiokit

在 AudioKit 中断开节点的正确方法

我正在开发的应用程序需要在声音链中动态添加/删除/重新排列组件。

到目前为止,我主要.disconnectOutput()在大多数组件上使用该方法,然后重新连接所有组件。这在大多数情况下都有效,但有时似乎一个节点连接在声音链中的多个点,如果节点连接到AudioKit.output.

AudioKit 提供了许多公共方法,例如.detach(), .disconnectInput().disconnect()我不太清楚修改声音链的最干净或最安全的方法。做这个的最好方式是什么?

另外,是否有某种方法可以跟踪哪些节点连接到哪些节点?

audiokit

6
推荐指数
1
解决办法
930
查看次数

AudioKit iOS:如何将输入节点动态连接到活动链中的混音器?

如何在 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 …

ios swift audiokit

6
推荐指数
1
解决办法
1170
查看次数

如何将AKSequencer连接到AKCallbackInstrument?

我想读取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

swift audiokit

6
推荐指数
2
解决办法
204
查看次数

如何使用 AudioKit 的新 AKSequencer 播放 MIDI

我在 AudioKit 4.9.1 上,无法使用新的AKSequencer(替换AKAppleSequencer)播放 MIDI 文件。没有声音播放。假设 MIDI 文件和样本已正确加载,因为它们以前使用AKAppleSequencer. 还启用了背景音频模式功能。

这是相关代码:(我也尝试过AKSamplerAKAppleSampler但结果相同)

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)

midi playback ios audiokit aksequencer

6
推荐指数
1
解决办法
858
查看次数

具有可视化效果的音频录制 Mac 应用程序无法使用 AudioKit 选择输入设备

嘿,我想知道是否有人可以指出我正确的方向。

我正在构建一个 Mac 音频应用程序,我需要执行以下操作

  • 选择音频输入设备
  • 显示设备输入的实时音频图(想想 GarageBand/Logic)
  • 捕获音频以进行重播
  • 输出声音或使其可选择作为另一个应用程序的输入设备 - 类似于 GarageBand Logic 等插件的工作方式

到目前为止,我已经研究过使用以下内容:

  • 音频套件
  • AVFoundation/AVCaptureDevice

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

6
推荐指数
0
解决办法
138
查看次数

AudioKit (iOS) - 添加频率/幅度变化的观察者

我正在使用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)

但说实话,我在使用 …

ios swift audiokit

5
推荐指数
1
解决办法
1993
查看次数

添加AKMicrophone时崩溃

我正在使用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)

ios avaudioengine audiokit

5
推荐指数
1
解决办法
306
查看次数

更改 AKPlayer 文件时 Audiokit 崩溃

我最近完成了从 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

5
推荐指数
1
解决办法
622
查看次数

在连接耳机的情况下使用带有 AudioKit 的内置麦克风

我在 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 swift audiokit

5
推荐指数
0
解决办法
387
查看次数

使用 AudioKit 通过 iOS 内的虚拟端口发送 MIDI 音符

所以我觉得自己像个白痴,不得不在这里发帖以解决可能很简单的问题。我正在编写一个 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 …

xcode ios swift audiokit

5
推荐指数
1
解决办法
1037
查看次数