2014-12-11 4 views
1

Я не очень хорошо знаком с Swift/Objective-C или средой Cocoa, и у меня возникли проблемы с отправкой или прослушиванием данных с USB-устройства с CoreMIDI. Я пытаюсь отправить сообщение (144, 36, 5) на мой MIDI-контроллер (Ableton Push), который я выполнил перед использованием API скриптов Bitwig Studio. Я не смог найти много на этом, кроме документов Apple, и они не были особенно полезны для меня. До сих пор я выяснил, как получить список устройств и проверить их имена, но помимо этого я застрял.Отправка и получение MIDI с помощью Swift и CoreMIDI

То, что я написал до сих пор пытаюсь отправить MIDI:

var pushDevice = MIDIGetDevice(2) 

var secondEntity = MIDIDeviceGetEntity(pushDevice, 1) 

var pushDestination = MIDIEntityGetDestination(secondEntity, 0) 

var midiPort = MIDIPortRef() 

let myData : [Byte] = [ Byte(144), Byte(36), Byte(5) ] 
var packet = UnsafeMutablePointer<MIDIPacket>.alloc(1) 
var pkList = UnsafeMutablePointer<MIDIPacketList>.alloc(1) 
packet = MIDIPacketListInit(pkList) 
packet = MIDIPacketListAdd(pkList, 1024, packet, 0, 3, myData) 

MIDISend(midiPort, pushDestination, pkList) 

Я чувствую себя немного лоха для не будучи в состоянии понять это, я полагаю, что это должно быть простым решением, которое По какой-то причине я просто не могу понять. Я не думаю, что я правильно создаю MIDIPacketList или MIDIPort, и я не знаю, как начать создание обратного вызова и прослушивание MIDI-сообщений.

ответ

1

Я понял, как отправлять MIDI-данные, захватывая устройство через уникальный идентификатор. Я не уверен, как работает управление памятью в Swift, поэтому имейте это в виду. Я вернусь позже, если выясню, как правильно создать обратный вызов и прослушать MIDI-вход.

import Foundation 
import CoreMIDI 

var midiClient = MIDIClientRef() 
var result = MIDIClientCreate("Foo Client", nil, nil, &midiClient) 


var outputPort = MIDIPortRef() 
result = MIDIOutputPortCreate(midiClient, "Output", &outputPort); 

var endPoint = MIDIObjectRef() 
var foundObj = MIDIObjectType() 
result = MIDIObjectFindByUniqueID(UNIQUE_ID, &endPoint, &foundObj) 

var pkt = UnsafeMutablePointer<MIDIPacket>.alloc(1) 
var pktList = UnsafeMutablePointer<MIDIPacketList>.alloc(1) 
let midiData : [Byte] = [Byte(144), Byte(36), Byte(5)] 
pkt = MIDIPacketListInit(pktList) 
pkt = MIDIPacketListAdd(pktList, 1024, pkt, 0, 3, midiData) 

MIDISend(outputPort, endPoint, pktList)