如何使用 AKAppleSequencer 播放 MIDI 文件

How to play MIDI File with AKAppleSequencer

我正在尝试使用 AudioKits 遗留音序器 AKAppleSequencer 播放基本 MIDI 文件。我已经让它播放文件的第一个音符,但之后什么都没有。 (我无法从新的 AKSequencer 获得任何输出。)这是我的代码,它与 AudioKits Playgrounds 的 MIDI 播放代码基本相同。

class MIDIPlayer {

    var piano: AKMIDISampler?
    var sequencer: AKAppleSequencer?
    var mixer: AKMixer?
    var reverb: AKCostelloReverb?
    var dryWetMixer: AKDryWetMixer?

func playMidiFile() {
    piano = AKMIDISampler()
    try? piano!.loadWav("FM Piano")
    mixer = AKMixer(piano)
    reverb = AKCostelloReverb(mixer)
    dryWetMixer = AKDryWetMixer(mixer!, reverb!, balance: 0.2)
    AudioKit.output = dryWetMixer

    sequencer = AKAppleSequencer(filename: "Score")
    sequencer!.setGlobalMIDIOutput(piano!.midiIn)
    sequencer!.setLength(AKDuration(beats: 16))

    try? AudioKit.start()
    sequencer!.play()
    print("MIDIPlayer playing...")
}

}

我听到 MIDI 文件的第一个音符并得到以下 errors/warnings。

2020-04-24 16:30:19.653852-0400 TauMusicTest[20668:3188919] [seq] SequenceTrack.cpp:918:Clear: Invalid beat range or track is empty
2020-04-24 16:30:19.654171-0400 TauMusicTest[20668:3188919] [seq] SequenceTrack.cpp:1028:Merge: Invalid beat range
2020-04-24 16:30:20.349048-0400 TauMusicTest[20668:3189067]  HALC_ProxyIOContext::IOWorkLoop: failed to send the final message to the server, Error: 0x10000003
2020-04-24 16:30:20.450640-0400 TauMusicTest[20668:3189034] [ddagg]        AggregateDevice.mm:331   Output: index 1 >= allChannelDescs size 1
2020-04-24 16:30:20.532394-0400 TauMusicTest[20668:3189251] [aqme] AQMEIO_HAL.cpp:1526:IOProc: AQDefaultDevice: Abandoning I/O cycle because reconfig pending (1).
MDIDPlayer playing...
2020-04-24 16:30:20.542721-0400 TauMusicTest[20668:3188919] [general] AKAppleSequencer.swift:deinit:41:deinit: (AKAppleSequencer.swift:deinit:41)
2020-04-24 16:30:20.542882-0400 TauMusicTest[20668:3188919] [general] AKAppleSequencer.swift:deinit:41:deinit: (AKAppleSequencer.swift:deinit:41)
2020-04-24 16:30:20.543023-0400 TauMusicTest[20668:3188919] [general] AKAppleSequencer.swift:deinit:41:deinit: (AKAppleSequencer.swift:deinit:41)
2020-04-24 16:30:20.543149-0400 TauMusicTest[20668:3188919] [general] AKAppleSequencer.swift:deinit:41:deinit: (AKAppleSequencer.swift:deinit:41)
2020-04-24 16:30:20.543264-0400 TauMusicTest[20668:3188919] [general] AKAppleSequencer.swift:deinit:41:deinit: (AKAppleSequencer.swift:deinit:41)
2020-04-24 16:30:20.698072-0400 TauMusicTest[20668:3188919] [general] AKAppleSequencer.swift:deinit:41:deinit: (AKAppleSequencer.swift:deinit:41)
2020-04-24 16:30:20.698443-0400 TauMusicTest[20668:3188919] [general] AKAppleSequencer.swift:deinit:41:deinit: (AKAppleSequencer.swift:deinit:41)
2020-04-24 16:30:20.698718-0400 TauMusicTest[20668:3188919] [general] AKAppleSequencer.swift:deinit:41:deinit: (AKAppleSequencer.swift:deinit:41)```

您已经在单个函数的范围内声明了采样器、混音器、音序器等。当函数完成时,OS 假定您已完成它们,并将尝试释放它们使用的内存。

这个函数实际上是class中的一个方法。尝试在 class 级别声明这些变量,以便它们可以在方法完成后保留。例如,

class MySequencer {
   var piano: AKMIDISampler?
   var sequencer: AKAppleSequencer?
   // etc. . .

   func playMIDIFile() {
      piano = AKMIDISampler()
      try? piano!.loadWav("FM Piano")
      // etc . . .
   }
}