Как подключить AKSequencer к AKCallbackInstrument?

Я хочу прочитать MIDI-файл и отображать вещи, когда запускаются события заметки. Я нашел этот вопрос о переполнении стека, где второй ответ предлагает использовать AudioKit: Как получить надежную синхронизацию для моего аудио-приложения? Точнее, предлагается использовать AKSequencer для поглощения миди-файла в приложении, а затем связать его с AKCallbackInstrument для запуска событий и вызова функции для каждого события миди-ноты.

Я установил AudioKit 4.5.5, используя этот учебник https://www.youtube.com/watch?v=iUvWxWvRvo8 Затем мне удалось запустить код учебника, поэтому я знаю, что AudioKit правильно включен в проект.

Затем я написал свой собственный код:

let sequencer = AKSequencer(filename: "myMidiFile.mid")
let callbackInstr = AKCallbackInstrument()

callbackInstr.callback = myCallBack
sequencer.setGlobalMIDIOutput(callbackInstr.midiIn)

func myCallBack(a:UInt8, b:MIDINoteNumber, c:MIDIVelocity){
    print(b)
}

func test() {
    do {
        try AudioKit.start()
    }
    catch {
        print("Oops! AudioKit didn't start!")
    }

    sequencer.play()
}

Когда я пытаюсь построить свой проект, на линии возникает ошибкаsequencer.setGlobalMIDIOutput(callbackInstr.midiIn)

Ошибка Value of type 'AKCallbackInstrument' has no member 'midiIn'

Я пытался очистить проект и пересобрать, но ошибка все еще здесь.

Можете ли вы объяснить мне, почему я получаю эту ошибку? Что я должен сделать, чтобы решить это? Потому что в документе AudioKit я обнаружил, что AKCallbackInstrument является подклассом AKMIDIInstrument, у которого действительно есть свойство, называемое midiIn. https://audiokit.io/docs/Classes/AKCallbackInstrument.html https://audiokit.io/docs/Classes/AKMIDIInstrument.html

2 ответа

Решение

Правда, класс AKCallbackInstrument не имеет свойства midiIn, хотя документация показывает, что оно используется таким образом. Вместо использования AKCallbackInstrument используйте AKMIDICallbackInstrument. Этот класс имеет midiIn, и, кажется, работает нормально.

Машинка нашла решение моей проблемы. Вот код, который работает сейчас, печатая миди-номер ноты каждый раз, когда она воспроизводится (но я еще не добавил звук):

// dont write the .mid extension in filename :
let sequencer = AKSequencer(filename:"coucou") 
let callbackInstr = AKMIDICallbackInstrument()
callbackInstr.callback = myCallBack
sequencer.setGlobalMIDIOutput(callbackInstr.midiIn)
sequencer.play()

func myCallBack(a:UInt8, b:MIDINoteNumber, c:MIDIVelocity) -> () {
    if (a == 144) {  // if noteOn
        print(b)
    }
}
Другие вопросы по тегам