Как играть в MIDI-файл с помощью AKAppleSequencer - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь воспроизвести базовый c MIDI-файл, используя устаревший секвенсор AudioKits, AKAppleSequencer. Я получил его для воспроизведения первой ноты файла, но ничего после. (Я не смог получить никакого вывода от нового AKSequencer.) Вот мой код, который по существу идентичен коду воспроизведения MIDI из AudioKits Playgrounds.

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 и получите следующие ошибки / предупреждения.

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)```

1 Ответ

0 голосов
/ 23 апреля 2020

Вы объявили свой сэмплер, микшер, секвенсор и т. Д. c в рамках одной функции. Когда функция завершается, ОС предполагает, что вы закончили с ними, и попытается освободить память, которую они использовали.

Эта функция на самом деле является методом в классе. Попробуйте объявить эти переменные на уровне класса, чтобы они могли сохраняться после завершения метода. Например,

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

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