我正在研究一种创建浮动对象,然后在它们碰撞时播放音符的东西。算出速度,然后使用AKOscillatorBank演奏音符演奏音符。当发送具有不同速度的多个音符时,AKOscillatorBank开始单击,并且音量开始在所有位置跳跃。就像任何给定音符的速度会影响整个振荡器组的音量。
当每个音符具有相同速度时,效果很好。试图为每个对象而不是AKOSillatorBank使用新的AKOsillator,但这会产生自己的一系列问题。
oscBank = AKOscillatorBank(waveform: AKTable(.sine), attackDuration: 0.01, decayDuration: 0.4, sustainLevel: 0, releaseDuration: 0.4, pitchBend: 0, vibratoDepth: 0, vibratoRate: 0)
// each object has a playNote function that calculate velocity of object then converts to midi velocity value.
//Works fine when velocity is set to a static number eg: oscBank.play(noteNumber: midiNote, velocity: 100)
func playNote (_ velocity: CGFloat) {
oscBank.play(noteNumber: midiNote, velocity: phyVelToMidiVel(velocity))
_ = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: false) { timer in
self.oscBank.stop(noteNumber: self.midiNote)
timer.invalidate()
}
}
func phyVelToMidiVel (_ phyVel: CGFloat) -> MIDIVelocity {
var midiVel = (127 / resizeConstant) * phyVel
if midiVel > 127 {
midiVel = 127
}
return UInt8(midiVel)
}
向AKOsillatorBank发送多个具有不同速度的音符时的点击声。