似乎我不能正确地 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(全部尝试)