簡體   English   中英

iOS AudioKit AKAmplitudeTracker

[英]iOS AudioKit AKAmplitudeTracker

我想嘗試在iOS上運行這樣的游樂場: http//audiokit.io/playgrounds/Analysis/Tracking%20Amplitude/

這是我的視圖控制器,我使用曼陀林物理模型創建音符,然后運行fft和amplitudeTracker。 但我沒有得到他們的價值。 你可以看到下面的輸出:

var fft: AKFFTTap!
var amplitudeTracker: AKAmplitudeTracker!


override func viewDidLoad() {
    super.viewDidLoad()

    let mandolin = AKMandolin()
    mandolin.detune = 1
    mandolin.bodySize = 1
    let pluckPosition = 0.2

    let scale: [MIDINoteNumber] = [72, 74, 76, 77, 79, 81, 83, 84]
    let delay = AKDelay(mandolin)
    let mix = AKMixer()
    mix.connect(delay)

    let reverb = AKReverb(mix)
    amplitudeTracker = AKAmplitudeTracker(mix)
    fft = AKFFTTap(mix)

    AudioKit.output = reverb
    AudioKit.start()

  for note in scale {

        let note1: MIDINoteNumber = note
        let octave1: MIDINoteNumber = 4
        let course1 = 2
        let count = 25

        mandolin.fret(noteNumber: note1 + octave1, course: course1 - 1)
        mandolin.pluck(course: course1 - 1, position: pluckPosition, velocity: 127)

        print("plying note")

        let fftData = self.fft.fftData
        let lowMax = fftData[0 ... (count / 2) - 1].max() ?? 0
        let hiMax = fftData[count / 2 ... count - 1].max() ?? 0
        let hiMin = fftData[count / 2 ... count - 1].min() ?? 0
        let amplitude = Float(self.amplitudeTracker.amplitude * 65)
        print("amplitude \(amplitude)")
        print("lowMax \(lowMax)")
        print("hiMax \(hiMax)")
        print("hiMin \(hiMin)")

        sleep(1)
    }

}

這是我運行時獲得的輸出:

2017-09-26 12:43:27.724706-0700 AK[9467:1161171] 957: AUParameterSet 2 (1/8): err -10867
2017-09-26 12:43:28.177699-0700 AK[9467:1161171] 957: AUParameterSet 2 (1/8): err -10867
playing note
amplitude 0.0
lowMax 0.0
hiMax 0.0
hiMin 0.0
playing note
amplitude 0.0
lowMax 0.0
hiMax 0.0
hiMin 0.0
...

這里的主要問題是頻率跟蹤器節點不是信號鏈的一部分。 AudioKit(和Apple的底層AVAudioEngine)在拉模型上工作,因為除非下游節點請求音頻,否則不會通過節點拉取音頻。 這基本上意味着從AudioKit.output節點獲取的所有內容都將通過它們獲取字節。

但是,這里,混響是輸出,因此跟蹤器本身不會獲得任何數據。 將其更改為AudioKit.output = amplitudeTracker將獲取通過節點的數據。

amplitudeTracker充當直通,因此音頻也會通過。 如果您不想要音頻,則可以通過增強器將跟蹤器的輸出粘在一起,從而將音量降低到零。

在嘗試重新初始化具有一堆軌道/采樣器/等的AKSequencer變量時,我得到了這個-10867錯誤。

我將它們存儲在數組中,在重新初始化之前調用以下內容,並且-10867錯誤消失了:

private var samplers = [AKMIDISampler]()
private var tracks = [AKMusicTrack]()
private var mixer = AKMixer()

...

public func cleanSequencer() {
    for track in tracks { 
        track.clear() 
    }
    for sample in samplers {
        sample.disconnectOutput()
        sample.destroyEndpoint()
    }
    mixer.detach()
}

希望這可以幫助!

-------更新:01 -------

這產生了一些意想不到的效果,主要是在使用此方法后沒有播放聲音。

但是,現在好奇,如果有人知道為什么-10867會消失並發出聲音?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM