【问题标题】:Can AudioKit play a sound while microphone is analyzing frequency?AudioKit 可以在麦克风分析频率时播放声音吗?
【发布时间】:2019-11-02 11:21:59
【问题描述】:

我想做一个听力训练应用,所以我想在麦克风分析频率的同时发出声音。我一开始是为了证明这个概念,所以现在,我只是拿了 AudioKit 的示例应用程序 MicrophoneAnalisys 并添加了一些代码来发出声音。

    import AudioKit
    import AudioKitUI
    import UIKit

    class ViewController: UIViewController {

        var oscillator1 = AKOscillator()
        var oscillator2 = AKOscillator()
        var mixer = AKMixer()

        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            mixer = AKMixer(oscillator1, oscillator2)

            mixer.volume = 0.5
            AudioKit.output = mixer
            do {
                try AudioKit.start()
            } catch {
                AKLog("AudioKit did not start!")
            }
        }

        var mic: AKMicrophone!
        var tracker: AKFrequencyTracker!
        var silence: AKBooster!

    override func viewDidLoad() {
        super.viewDidLoad()

        AKSettings.audioInputEnabled = true
        mic = AKMicrophone()
        tracker = AKFrequencyTracker(mic)
        silence = AKBooster(tracker, gain: 0)
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        AudioKit.output = silence
        do {
            try AudioKit.start()
        } catch {
            AKLog("AudioKit did not start!")
        }
        setupPlot()
        Timer.scheduledTimer(timeInterval: 0.1,
                             target: self,
                             selector: #selector(ViewController.updateUI),
                             userInfo: nil,
                             repeats: true)
    }

    @objc func updateUI() {
        if tracker.amplitude > 0.1 {
            frequencyLabel.text = String(format: "%0.1f", tracker.frequency)

            var frequency = Float(tracker.frequency)
            while frequency > Float(noteFrequencies[noteFrequencies.count - 1]) {
                frequency /= 2.0
            }
            while frequency < Float(noteFrequencies[0]) {
                frequency *= 2.0
            }

            var minDistance: Float = 10_000.0
            var index = 0

            for i in 0..<noteFrequencies.count {
                let distance = fabsf(Float(noteFrequencies[i]) - frequency)
                if distance < minDistance {
                    index = i
                    minDistance = distance
                }
            }
    let octave = Int(log2f(Float(tracker.frequency) / frequency))
    noteNameWithSharpsLabel.text = "\(noteNamesWithSharps[index])\

(octave)"
            noteNameWithFlatsLabel.text = "\(noteNamesWithFlats[index])\(octave)"
        }
        amplitudeLabel.text = String(format: "%0.2f", tracker.amplitude)
    }


    @IBAction func didTapASound(_ sender: Any) {
        print("didTapASound")

        mixer = AKMixer(oscillator1, oscillator2)

        // Cut the volume in half since we have two oscillators
        mixer.volume = 0.5
        AudioKit.output = mixer
        do {
            try AudioKit.start()
        } catch {
            AKLog("AudioKit did not start!")
        }

        if oscillator1.isPlaying {
            oscillator1.stop()
            oscillator2.stop()
        } else {
            oscillator1.frequency = random(in: 220 ... 880)
            oscillator1.start()
            oscillator2.frequency = random(in: 220 ... 880)
            //            oscillator2.start()
        }

    }

我知道我尝试运行肯定做错了

AudioKit.output = mixer
do {
  try AudioKit.start()
} catch {
  AKLog("AudioKit did not start!")
}

AudioKit.output = mixer
do {
    try AudioKit.start()
} catch {
    AKLog("AudioKit did not start!")
}

同时。

我收到以下错误。

[avae] AVAEInternal.h:70:_AVAE_Check: required condition is false: [AVAudioIONodeImpl.mm:910:SetOutputFormat: (IsFormatSampleRateAndChannelCountValid(hwFormat))]
*** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: IsFormatSampleRateAndChannelCountValid(hwFormat)'

我阅读了this article,但不明白提出问题的人是否能够解决问题。有人可以告诉我是否可以在使用 AudioKit 将麦克风打开时发出声音,并指出我可以学习如何做到这一点的正确方向吗?谢谢!

【问题讨论】:

    标签: audiokit xcode10.2


    【解决方案1】:

    我正在回答我自己的问题。当然,它可以同时发出声音和收听麦克风。我所要做的就是将它们与 AKMixer 放在一起。

    var oscillator = AKOscillator()
    
    var mic: AKMicrophone!
        var tracker: AKFrequencyTracker!
        var silence: AKBooster!
    
    override func viewDidLoad() {
            super.viewDidLoad()
    
            AKSettings.audioInputEnabled = true
            mic = AKMicrophone()
            tracker = AKFrequencyTracker(mic)
            silence = AKBooster(tracker, gain: 0)
        }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    
        AudioKit.output = AKMixer(silence,oscillator)
        //AudioKit.output = silence
        do {
            try AudioKit.start()
        } catch {
            AKLog("AudioKit did not start!")
        }
        setupPlot()
        Timer.scheduledTimer(timeInterval: 0.1,
                             target: self,
                             selector: #selector(ViewController.updateUI),
                             userInfo: nil,
                             repeats: true)
    }
    
    @IBAction func makeASound(_ sender: Any) {
    
        if oscillator.isPlaying {
            print("Stop A Sound")
            oscillator.stop()
        } else {
            print("Make A Sound")
            oscillator.amplitude = 1.0
            oscillator.frequency = 440.0
            oscillator.start()
        }
    
    }
    

    以防万一有人有同样的问题..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 2018-02-14
      • 2023-01-10
      • 2011-08-09
      • 2015-10-31
      • 1970-01-01
      相关资源
      最近更新 更多