如何使用音序器控制振荡器的频率

Dan*_*ieu 3 ios swift audiokit

我想知道如何来控制AKOscillator使用的频率AKSequencer,但是几个例子(1,2)我在网上看到只显示了如何控制一个AKSamplerAKSequencer.

这是AudioKit的GitHub页面的简化示例:

// relevant class properties
var seq: AKSequencer?
var syn1 = AKSampler()

// viewDidLoad
seq = AKSequencer(filename: "seqDemo", engine: AudioKit.engine)
seq?.enableLooping()
seq!.avTracks[1].destinationAudioUnit = syn1.samplerUnit
Run Code Online (Sandbox Code Playgroud)

我的期望:

基于上面的例子,我希望能够做到这样的事情:

var voice1 = Voice() // replaces the AKSampler

seq = AKSequencer(filename: "seqDemo", engine: AudioKit.engine)
seq.loopOn()
//seq.avTracks[0].destinationAudioUnit = voice1.oscillator.avAudioNode
seq.note = voice1.oscillator.frequency // "note" doesn't actually exist in the API
Run Code Online (Sandbox Code Playgroud)

这显然没有做到这一点.

题:

什么是允许我使用AKSequencer控制AKOscillator的正确设置?

Dan*_*ieu 5

@Aurelius的答案显然是正确的,但它并没有明确地回答这个问题.为了帮助下一个遇到此问题的人,我将分享我的解决方案.

问题是:

如何控制一个AKOscillatorAKSequencer.

答案是:

无法直接控制它.正如Aurelius所说,你需要将振荡器包裹在midi乐器中,这需要一些工作.

  • 你的振荡器应该包含在一个子类中AKVoice,你可以在这里找到一个例子.
  • 接下来,你将创建AKPolyphonicInstrument@Aurelius描述的包装"midi instrument"(aka.).这就是音序器能够与之交谈的能力!你可以在这里看到一个例子.

现在我们的振荡器具有与音序器对话的功能,我们可以像这样实现MollyBChimes方法:

在类级别创建一个新的AKPolyphonicInstrument的实例,对我来说它看起来像这样:

var osc1 = SynthVoiceInstrument(voiceCount: 4)
var sequencer = AKSequencer()
var mixer = AKMixer()
var melody: AKMIDIInstrument?
Run Code Online (Sandbox Code Playgroud)

然后在您的设置功能或viewDidLoad中,您将执行以下操作:

melody = AKMIDIInstrument(instrument: osc1) 
melody?.enableMIDI(midi.midiClient, name: "melodicSound midi in")    
mixer.connect(melody!)
AudioKit.output = pumper
AudioKit.start()

sequencer.newTrack()
sequencer.setLength(seqLen)
sequencer.tracks[0].setMIDIOutput((melody?.midiIn)!)
/* 
  melody generator function just to hear some sounds
  see Melody Generator link below.
*/
genNewMelodicSequence(minor: true)

sequencer.loopEnabled = true
sequencer.setBPM(100)
sequencer.play()
Run Code Online (Sandbox Code Playgroud)

旋律发生器