在Swift中建立MIDI音序

我想建立一个MIDI音序器! 让我们弄清楚如何一起做。 我的意思是,我将做所有工作并向您解释事情,您会读到它。 因此,我们并没有真正一起解决任何问题。 不过,您明白我的意思。 我们也不必担心使此代码漂亮。 所以不要判断我。 我只想要一种可以通过一些注释进行排序的东西。 然后,我们都可以走自己的路。

我们应该为振荡器组设置一些属性。 如果您不知道合成器的工作原理,那就知道它们会影响合成器的发声方式。

  func setupSynth(){ 
oscBank.attackDuration = 0.1
oscBank.decayDuration = 0.1
oscBank.sustainLevel = 0.1
oscBank.releaseDuration = 0.3
}

现在我们开始做一些事情

  func doSomeStuff { 
 让midiNode = AKMIDINode(node:oscBank)// 1 
_ = sequencer.newTrack()// 2
sequencer.setLength(sequenceLength)// 3
  generateSequence()// 4 
  AudioKit.output = midiNode // 5 
AudioKit.start()// 6
midiNode.enableMIDI(midi.client,名称:“ midiNode midi in”)// 7
sequencer.setTempo(120.0)// 8
sequencer.enableLooping()// 9
sequencer.play()// 10
}
  1. AKMIDINode是AKNode的子类。 如果您对AKNode有所了解,就知道它们是用来将音频对象链接在一起的。 我们在这里所说的是我们的MIDI节点将用于触发振荡器组。
  2. 这将在我们的音序器中创建一个“音轨”。 请记住,序列是我们仪器的指令集。 每个“轨道”都是一组指令。 我们可以在音序器中添加多个音轨。 现在,我们将只使用一条轨道。
  3. 在这里,我们将序列的长度设置为AKDuration,即“ sequenceLength”。 如果您还记得,我们将其设置为等于8个节拍。
  4. 这是对我们将在下面构建的函数的调用。 此函数将生成一个序列。 这就是为什么我这么称呼它。 考虑该功能的另一种方法是,它将创建定序器将提供给我们仪器的指令集。
  5. 这会将我们的MIDI节点设置为引擎的输出。 由于MIDI节点是节点链中的最后一个对象,因此这就是我们要发送到输出的内容。
  6. 这将启动我们的音频引擎。 总是这样做。
  7. 这告诉我们的MIDI节点接受MIDI输入。
  8. 这告诉我们的音序器我们希望它在每个节拍中播放多快。 我们将其设置为120 BPM。
  9. 在这里,我们告诉音序器一遍又一遍地循环。 因此它将继续为我们的仪器提供说明,直到我们告诉它停止为止。
  10. 最后,启动我们的音序器!

因此,我们建立了一种可以接收指令集的乐器以及一个音序器,可以为乐器提供一组音乐指令。 现在,我们需要做的就是创建一组指令,供定序器分发!

  func generateSequence(){ 
let stepSize:浮点数= 1/8 // 1
sequencer.tracks [0] .clear()// 2
让numberOfSteps = Int(Float(sequenceLength.beats)/ stepSize)// 3
打印(“步骤数********** \(步骤数)”)
对于i in 0 .. <numberOfSteps {// 4
如果i%4 == 0 {
sequencer.tracks [0] .add(音符编号:69,速度:127,位置:AKDuration(节拍:Double(i)),持续时间:AKDuration(节拍:0.5))
}其他{
sequencer.tracks [0] .add(音符编号:57,速度:127,位置:AKDuration(节拍:Double(i)),持续时间:AKDuration(节拍:0.5))
}
}
}
  1. 我们的步长大小将影响我们可以放入序列中的音符数量。 较小的步骤意味着我们可以容纳更多的音符。
  2. 清除序列轨道中的指令。 这里没有必要-我只是出于自己的目的将其放入正在构建的更大的应用程序中。
  3. 给定步骤的大小,numberOfSteps计算序列中有多少步骤。 因此,将8个节拍除以1/8的步长可得出64个步幅。 这意味着每个序列将有64个音符。
  4. 在这里,我们将按顺序自动生成注释。 对于步数中的每一步,如果将节拍平均除以四,这意味着它是小节的第一拍,我们将创建更高音调的声音。 如果不能被四整除,我们将创建较低音调的声音。

这就是创建音序器的基础! 如果需要,我们可以设置滑块等来影响诸如速度或步长之类的属性。 在这里,看看: