Отправка MIDI-нот через виртуальный порт в iOS с помощью AudioKit - PullRequest
0 голосов
/ 09 октября 2018

Так что я чувствую себя идиотом из-за того, что мне приходится публиковать здесь, что, вероятно, является простым исправлением.Я пишу приложение для iOS, которое будет отправлять MIDI в другое приложение.В качестве первого доказательства концепции я пытаюсь отправить заметку в GarageBand на моем iPhone.Я пытаюсь использовать AudioKit для этого.

Мой код, который я создал, выглядит следующим образом:

import UIKit
import AudioKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
    let midi = AudioKit.midi
    ...
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        midi.createVirtualOutputPort()
        midi.openOutput()
    }
    ...
    func SomeFunc()
    {
        midi.sendNoteOnMessage(noteNumber: UInt8(note + (octave * 12)), velocity: 90, channel: 0)
        usleep(UInt32(delay * second))
        midi.sendNoteOffMessage(noteNumber: UInt8(note + (octave * 12)), velocity: 0, channel: 0)
    }
}

Вот ошибка, которую я получаю:

AKMIDI.swift: init (): 63: инициализация MIDI AKMIDI.swift: createVirtualOutputPort (_: name :): 129: ошибка создания виртуального порта вывода: клиент MIDI - 0

для импортаAudioKit в моем проекте, я следовал инструкциям, найденным в AudioKit Frameworks в разделе «Альтернатива: включить библиотеку AudioKit из источника».Именно это я и сделал:

  1. Откройте новый экземпляр Xcode
  2. Клон из GitHub по этой ссылке: AudioKit
  3. Сохранитьи закройте Xcode
  4. Откройте мой проект
  5. Перетащите AudioKit для iOS.xcodeproj в подпапку моего проекта
  6. С выбранной базой моего project.xcodeproj я вошел вЭтапы сборки и добавили AudioKit (AudioKit для iOS) и AudioKitUI (AudioKit для iOS) в раздел «Целевые зависимости»
  7. Все еще находясь в рамках моего проекта, я переключился на вкладку «Настройки сборки» и выполнил поиск «Линкер ", который выявил настройку" Другие флаги линкера ".Там я добавил «-lc ++» (за вычетом кавычек) в этом параметре
  8. Убедитесь, что мой проект был выбран для сборки на соответствующем устройстве, которое я тестировал, и нажал кнопку Play

Я проверил это на своем физическом iPhone 8+, на симуляторе 8+ и на симуляторе X под управлением iOS 12, и все они возвращали одну и ту же ошибку.Я подключил все устройства к экземпляру Logic Pro X через сетевую часть MIDI Studio, и нота играет нормально, поэтому я знаю, что сам код работает.Я также попытался перезагрузить компьютер и выполнить полную перезагрузку физического устройства.

Я попытался оставить вызов функции, чтобы открыть для виртуального выходного порта значения по умолчанию, установив для Int32 значения 1000, 1000000 и 2000000, иимя для "Session 1" и "MyApp".Ничто из этого также не решает проблему.

Я попытался выполнить следующий пример: MIDISequencer , но это не помогло.Часть кода, которую я добавил (и выполнил) ниже:

func enableBackgroundMIDIPlaying() {
    AudioKit.output = AKWhiteNoise()
    AudioKit.start()
    try? AKSettings.setSession(
        category: .playback,
        with: .mixWithOthers)
}

Это фактически воспроизводило белый шум через мое физическое устройство, но никак не влияло на ноты midi.

При переходе по коду, пытающемуся найти место возникновения ошибки, код работал нормально, пока не достиг строки 125 файла AKMIDI.swift, который находится внутри функции createVirtualOutputPort.Эта строка кода выглядит следующим образом:

let result = MIDISourceCreate(client, virtualPortname as CFString, &virtualOutput)

Отсюда он переходит в код, который я вообще не распознаю (я новичок в разработке для iOS, но не программирую в целом).Выйдя из этой функции, он выполняет сравнение с noErr и завершается ошибкой.Переменная результата показывалась как OSStatus, который, кажется, является типом, но я не видел никаких значений в нем.Согласно моим поискам в Google, это вывод MIDISourceCreate.Я также новичок в Xcode в целом, поэтому я признаю, что, возможно, что-то здесь упустил.

Я также попытался запустить функцию createVirtualPorts (), но получил те же ошибки для входного и выходного портов.Я не перебирал код для этого раздела, поскольку возвращаемые ошибки были одинаковыми (одна для ввода, одна для вывода).

На данный момент я немного разочарован и полностью застрял.Никакое прибегание к гуглу не приблизило меня.Буду очень признателен за любую помощь, которую кто-либо готов оказать.Если вы действительно сделали это так далеко, спасибо, что прочитали:)

1 Ответ

0 голосов
/ 16 октября 2018

Ошибка, возвращаемая в объекте OSStatus, вероятно, -10844 'kMIDINotPermitted'.Вы получите это, когда попытаетесь вызвать MIDISourceCreate без включения фонового режима звука в «Возможности».Я добавлю PR, чтобы сделать это сообщение об ошибке более информативным в будущем.

Несмотря на отсутствие подтверждающего сообщения о создании / открытии виртуального порта, если вы проверите его, отправив в другие приложения, вы должны обнаружить, что он работает.

...