AKAmplitudeEnvelope意外行为

时间:2018-11-15 14:32:39

标签: swift macos audiokit

似乎我不能正确地 init 我的自定义AKNode ,我还试图将所有代码放入 viewDidLoad (而不使用类),但是行为是相同的。

这是我的课程:

class customNode:AKNode,AKToggleable {


    var isStarted: Bool

    let sine = AKTable(.sine)
    var toneGenerator: AKOscillator
    var adsr: AKAmplitudeEnvelope


    override init(){
        isStarted = false

        toneGenerator = AKOscillator(waveform: sine)
        toneGenerator.frequency = 440
        toneGenerator.amplitude = 0.5

        adsr = AKAmplitudeEnvelope(toneGenerator)



        super.init(avAudioNode: adsr.outputNode)

        self.setup()
    }



    func setup(){
        toneGenerator.detuningOffset = 0
        toneGenerator.detuningMultiplier = 0
        toneGenerator.rampDuration = 0
        adsr.attackDuration = 0.001
        adsr.decayDuration = 0.3
        adsr.sustainLevel = 0
        adsr.releaseDuration = 0.03
        adsr.rampDuration = 0
    }

    func setF(_ val:Double){
        self.toneGenerator.frequency = val
    }

    func setA(_ val:Double){
        self.toneGenerator.amplitude = val
    }

    func start() {
        toneGenerator.start()
        adsr.start()
        isStarted = true
    }

    func stop() {
        adsr.stop()
        isStarted = false
    }




}

在我的 ViewController 中,我声明:

let myNode = customNode()

并将其添加到 viewDidLoad()

内的AudioKit输出中
AudioKit.output = myNode

我的 viewController 符合 AKMIDIListener协议,因此我可以使用Midi键盘输入来触发myNode。

一切正常,但是我在音符上具有无限延音,而且我猜adsr的其他值也已关闭。

如果我打印 myNode.adsr.sustainLevel ,它将输出0.0。

如果在添加到AudioKit.output或myNode.setup()之后调用AudioKit.start(),则没有任何变化。 因此,我尝试在视图中添加一些滑块以更改播放时的adsr参数,并且突然起作用

@IBAction func s_change(_ sender: NSSlider) {
    myNode.adsr.sustainLevel = sender.doubleValue
 }

BTW, myNode.adsr.sustainLevel 仍显示0.0

其他adsr值也发生了同样的情况:如果我打印它们,输出就是在init()中设置的值,但是声音不受这些参数的影响。如果我使用滑块更改它们,声音会受到影响,但不会影响打印的值...

那么,如何在我的 customNode 类中的init()上设置正确的adsr参数?

Mac OS High Sierra

Swift 4.2

AudioKit 4.5.2 / 4.5.3 / 4.5.4(全部尝试)

0 个答案:

没有答案