AudioKit 4.2 соединяет пользовательский секвенсор с конечной точкой AKMIDISampler - PullRequest
0 голосов
/ 04 мая 2018

Обновление с 4.1 до 4.2 разорвало соединение между нашим секвенсором и AKMIDISampler. Кажется, что порт теперь является частным (что имеет смысл), но как мне к нему подключиться?

1 Ответ

0 голосов
/ 04 мая 2018

Ладно, у меня есть быстрое исправление через расширение, но если у кого-нибудь из AK есть лучшее предложение, я весь слух! (Я также добавил проверку исправности для «события», переданного «handle (event :)», так как у нас есть пользовательские события, где internalData.count <3.) </p>

import Foundation
import AudioKit

extension AKMIDISampler {
    private func handle(event: AKMIDIEvent) throws {
    // This implementation assumes internatlData.count >= 3. If you have user events on the port it may just crash (i.e., if internalData.count < 3). No fun. We've added a little sanity check, just in case.
        if event.internalData.count > 2 {
            try self.handleMIDI(data1: event.internalData[0],
                            data2: event.internalData[1],
                            data3: event.internalData[2])
        }
    }

    // Had to just replicate this, due to protection levels... I guess this is a kludge, but it works!
    func handleMIDI(data1: MIDIByte, data2: MIDIByte, data3: MIDIByte) throws {
        let status = data1 >> 4
        let channel = data1 & 0xF

        if Int(status) == AKMIDIStatus.noteOn.rawValue && data3 > 0 {

            try play(noteNumber: MIDINoteNumber(data2),
                 velocity: MIDIVelocity(data3),
                 channel: MIDIChannel(channel))

        } else if Int(status) == AKMIDIStatus.noteOn.rawValue && data3 == 0 {

            try stop(noteNumber: MIDINoteNumber(data2), channel: MIDIChannel(channel))

        } else if Int(status) == AKMIDIStatus.controllerChange.rawValue {

            midiCC(data2, value: data3, channel: channel)

        }
    }

    // Again, just replicating AK's internal code, but allowing the user to show the port long enough to connect a (custom) sequencer, then hide it again after.
    func showVirtualMIDIPort() {
        MIDIObjectSetIntegerProperty(midiIn, kMIDIPropertyPrivate, 0)
    }
    func hideVirtualMIDIPort() {
        MIDIObjectSetIntegerProperty(midiIn, kMIDIPropertyPrivate, 1)
    }
}
...