在AudioKit中循环遍历结构数组

时间:2018-06-21 02:41:28

标签: swift audiokit

我正在尝试通过使用结构数组来创建MIDI内容以供音序器播放。每个结构都创建一个“小节”,每个小节都具有location,numberOfBeats和tempo属性。我想遍历小节中每个节拍的每个小节,并根据节拍是否是小节中的第一个来演奏两个MIDI音符之一。

下面的代码将正确打印(click1,click 2,click2,click1,click2,click1,click2,click2,click2),但是MIDI内容(附加到wav)只能播放一次,而不会前进到下一个在数组中测量。我一直在尝试使用各种循环类型通过一系列的措施使func按顺序工作,但无法使其正常进行。谢谢!

import UIKit
import AudioKit

class ViewController: UIViewController {

let sequencer = AKSequencer ()

var metronomeTrack1: AKMusicTrack!
var metronomeTrack2: AKMusicTrack!

let click1 = AKMIDISampler()
let click2 = AKMIDISampler ()

func setupTracks() {
    metronomeTrack1 = sequencer.newTrack()
    metronomeTrack1?.setMIDIOutput(click1.midiIn)
    metronomeTrack2 = sequencer.newTrack()
    metronomeTrack2?.setMIDIOutput(click2.midiIn)
}

struct Measure {
    var location : Int
    var numberOfBeats : Int
    var tempo : Int
}

var measureOne = Measure(location: 1, numberOfBeats: 4, tempo: 100)
var measureTwo = Measure(location: 2, numberOfBeats: 2, tempo: 100)
var measureThree = Measure(location: 3, numberOfBeats: 4, tempo: 100)

var arrayIndex = [Measure]()

//Variables to track location through loops
var arrayLocator = 0
var beatWatcher = 0

func playMeasures () {

for _ in arrayIndex {
    for beats in 0...(arrayIndex[arrayLocator].numberOfBeats - 1) {

        if beatWatcher == 0 {
            metronomeTrack1?.add(noteNumber: 60, velocity: 100, position: AKDuration(beats: Double(beats)), duration: AKDuration(beats: 1))
            print("click1")
            beatWatcher += 1

        } else {
            metronomeTrack2?.add(noteNumber: 60, velocity: 100, position: AKDuration(beats: Double(beats)), duration: AKDuration(beats: 1))
            print("click2")
            beatWatcher += 1

            if beatWatcher == (arrayIndex[arrayLocator].numberOfBeats) {
                beatWatcher = 0
                arrayLocator += 1
            }
        }
    }
 }
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    arrayIndex = [measureOne, measureTwo, measureThree]

    metronomeTrack1?.clear()
    metronomeTrack2?.clear()
    sequencer.setLength(AKDuration(beats: 100))

    AudioKit.output = click1
    AudioKit.output = click2

    setupTracks()

    try! click1.loadWav("blockhigh")
    try! click2.loadWav("blocklow")

    playMeasures()
    sequencer.play()
    try!AudioKit.start()
}

}

1 个答案:

答案 0 :(得分:1)

经过进一步研究;似乎使用跨步是循环播放的最佳方法,每个MIDI轨道中的“位置”需要在每个循环中增加1,才能以正确的顺序添加到序列中。