Ios Swift AudioKit:如何建立一个VCO who';s音高由AR包络线控制?
我对AudioKit不熟悉。我想建立一个VCO谁的音高是由一个可重新触发的a(H)R信封(可调衰减)控制,我正在寻找最好的或最常见的方法来做到这一点 经过一些研究()我觉得我必须使用AKOperationGenerator和AKOperation 最好的例子是从操场上看到的 我试过:Ios Swift AudioKit:如何建立一个VCO who';s音高由AR包络线控制?,ios,swift,audiokit,akoperationgenerator,Ios,Swift,Audiokit,Akoperationgenerator,我对AudioKit不熟悉。我想建立一个VCO谁的音高是由一个可重新触发的a(H)R信封(可调衰减)控制,我正在寻找最好的或最常见的方法来做到这一点 经过一些研究()我觉得我必须使用AKOperationGenerator和AKOperation 最好的例子是从操场上看到的 我试过: enum PitchEnvVCOSynthParameter: Int { case frequency, decayTime, gate } struct PitchEnvVCO { stati
enum PitchEnvVCOSynthParameter: Int {
case frequency, decayTime, gate
}
struct PitchEnvVCO {
static var frequency: AKOperation {
return AKOperation.parameters[PitchEnvVCOSynthParameter.frequency.rawValue]
}
static var decayTime: AKOperation {
return AKOperation.parameters[PitchEnvVCOSynthParameter.decayTime.rawValue]
}
static var gate: AKOperation {
return AKOperation.parameters[PitchEnvVCOSynthParameter.gate.rawValue]
}
}
extension AKOperationGenerator {
var frequency: Double {
get { return self.parameters[PitchEnvVCOSynthParameter.frequency.rawValue] }
set(newValue) { self.parameters[PitchEnvVCOSynthParameter.frequency.rawValue] = newValue }
}
var decayTime: Double {
get { return self.parameters[PitchEnvVCOSynthParameter.decayTime.rawValue] }
set(newValue) { self.parameters[PitchEnvVCOSynthParameter.decayTime.rawValue] = newValue }
}
var gate: Double {
get { return self.parameters[PitchEnvVCOSynthParameter.gate.rawValue] }
set(newValue) { self.parameters[PitchEnvVCOSynthParameter.gate.rawValue] = newValue }
}
}
与
我通过音序器轨道触发发生器,触发一个calback
let seqPositioncallbackTrack = sequencer.newTrack()
seqPositioncallbackTrack?.setMIDIOutput(sequencerCallbackInst.midiIn)
sequencerCallbackInst.callback = { status, noteNumber, velocity in
self.onSequencerStepChange(status: status, noteNumber: noteNumber, velocity: velocity)
}
//...for i in 0 ..< numberOfSteps...etc.
seqPositioncallbackTrack?.add(noteNumber: MIDINoteNumber(i),
velocity: 100,
position: AKDuration(beats: Double(i)),
duration: AKDuration(beats: 0.5)
)
让seqPositioncallbackTrack=sequencer.newTrack()
seqPositioncallbackTrack?.setMIDIOutput(sequencerCallbackInst.midiIn)
sequencerCallbackInst.callback={状态、noteNumber、速度单位
self.onSequencerStepChange(状态:状态,注释编号:注释编号,速度:速度)
}
//…对于0中的i…
这很好用。但我只是听到一种无休止的音调(频率正确)。只有第一个触发器会在沥青中膨胀。其他触发器不会重新触发信封。怎么会-我做错了什么?THNX似乎我需要找到正确的闸门开启时间长度(注意定序器步长持续时间的长度),并发送闸门关闭事件以将闸门设置为零
...duration: AKDuration(seconds: 0.03)
private func onSequencerStepChange(status: AKMIDIStatus, noteNumber: MIDINoteNumber, velocity: MIDIVelocity) {
if status == .noteOn {
core.triggerGateOn(seq1Values[Int(noteNumber)])
}
else if status == .noteOff {
core.triggerGateOff()
}
else { return }
}
...
// splitting func triggerGate(_ freq: Double) into on/off:
func triggerGateOn(_ freq: Double) {
generator.parameters[PitchEnvVCOSynthParameter.gate.rawValue] = 1
}
func triggerGateOff() {
generator.parameters[PitchEnvVCOSynthParameter.gate.rawValue] = 0
}
当持续时间太短时,它似乎也不起作用,这意味着<0.03-那么我猜闸门打开比攻击时间结束时更快设置为关闭。
还有,我不得不用释放时间来模拟衰减时间
let generator = AKOperationGenerator { parameters in
let oscillator = AKOperation.squareWave(
frequency: PitchEnvVCO.frequency.triggeredWithEnvelope(
trigger: PitchEnvVCO.gate,
attack: 0.01,
hold: 0.0,
release: PitchEnvVCO.freqDecayTime
),
amplitude: PitchEnvVCO.amplitude.triggeredWithEnvelope(
trigger: PitchEnvVCO.gate,
attack: 0.01,
hold: 0.0,
release: PitchEnvVCO.ampDecayTime
)
)
return oscillator
}
编辑:确定-我发布的正确答案似乎需要在生成器中添加另一个参数:振幅:PitchNVVCO.Amplication.triggeredWithEnvelope()很不幸,这并没有解决主要的问题:我怎样才能用一个可反转的封套来制作vco呢?我在这里又做了一次尝试:我找到的正确答案是
let generator = AKOperationGenerator { parameters in
let oscillator = AKOperation.squareWave(
frequency: PitchEnvVCO.frequency.triggeredWithEnvelope(
trigger: PitchEnvVCO.gate,
attack: 0.01,
hold: 0.0,
release: PitchEnvVCO.freqDecayTime
),
amplitude: PitchEnvVCO.amplitude.triggeredWithEnvelope(
trigger: PitchEnvVCO.gate,
attack: 0.01,
hold: 0.0,
release: PitchEnvVCO.ampDecayTime
)
)
return oscillator
}