如何使用 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 . . .
}
}
我正在尝试使用 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 . . .
}
}