如何将这部分代码从HOWL声码合成器从AudioKit 2移植到AudioKit 4.x?

时间:2018-11-03 13:52:24

标签: audiokit

我正在尝试从AudioKit 2移植HOWL声码器合成器到最新版本。 https://github.com/dclelland/HOWL

我从声码器开始:

https://github.com/dclelland/HOWL/blob/master/HOWL/Models/Audio/Vocoder.swift

我不确定接下来的代码如何工作。 reduce()是否以连续的方式将谐振滤波器应用于音频输入?它是否相当于AKResonantFilter(AKResonantFilter(AKResonantFilter(mutedInput)))) ?

还是有其他事情发生?

let mutedAudioInput = AKAudioInput() * AKPortamento(input: inputAmplitude, halfTime: 0.001.ak)

    let mutedInput = (input + mutedAudioInput) * AKPortamento(input: amplitude, halfTime: 0.001.ak)

    let filter = zip(frequencies, bandwidths).reduce(mutedInput) { input, parameters in
        let (frequency, bandwidth) = parameters
        return AKResonantFilter(
            input: input,
            centerFrequency: AKPortamento(input: frequency, halfTime: 0.001.ak),
            bandwidth: AKPortamento(input: bandwidth, halfTime: 0.001.ak)
        )
    }

这是我尝试移植声码器过滤器的尝试:

import AudioKitPlaygrounds
import AudioKit
import AudioKitUI

let mixer = AKMixer()
let sawtooth = AKTable(.sawtooth)
let sawtoothLFO = AKOscillator(waveform: sawtooth, frequency: 130.81, amplitude: 1, detuningOffset: 0.0, detuningMultiplier: 0.0)
let frequencyScale = 1.0


let topFrequencies = zip(voice.æ.formants,voice.α.formants).map {topLeftFrequency,topRightFrequency in
            return 0.5 * (topRightFrequency - topLeftFrequency) + topLeftFrequency
        }

let bottomFrequencies = zip(voice.i.formants,voice.u.formants).map {bottomLeftFrequency,bottomRightFrequency in
            return 0.5 * (bottomRightFrequency - bottomLeftFrequency) + bottomLeftFrequency
        }
let frequencies = zip(topFrequencies, bottomFrequencies).map { topFrequency, bottomFrequency in
            return (0.5 * (bottomFrequency - topFrequency) + topFrequency) * frequencyScale
        }
let bandwidthScale = 1.0
let bandwidths = frequencies.map { frequency in
            return (frequency * 0.02 + 50.0) * bandwidthScale
        }

let filteredLFO = AKResonantFilter(sawtoothLFO)
let filter = zip(frequencies,bandwidths).reduce(filteredLFO) { input,parameters in
            let (frequency, bandwidth) = parameters
            return AKResonantFilter(
                input,
                frequency: frequency,
                bandwidth: bandwidth
            )

        }
[filter, sawtoothLFO] >>> mixer
filter.start()
sawtoothLFO.play()

我听到一些声音,但是不太正确。我不确定我是否采用正确的方法。

特别是我的问题是:这是重写上面突出显示的部分代码的正确方法吗?

let filteredLFO = AKResonantFilter(sawtoothLFO)
let filter = zip(frequencies,bandwidths).reduce(filteredLFO) { input,parameters in
            let (frequency, bandwidth) = parameters
            return AKResonantFilter(
                input,
                frequency: frequency,
                bandwidth: bandwidth
            )

        }

使用AKOperation生成器是否有更优选的方法来完成这件事?我应该使用AKFormantFilter吗?我已经对AKFormantFilter和AKVocalTract进行了实验,但无法获得所需的音频结果。 HOWL应用程序听起来很像我想要做的事情,这就是为什么我开始移植代码的原因。 (这是一个“会说话的”机器人游戏)

0 个答案:

没有答案