2014-12-11 74 views
1

我對Swift/Objective-C或Cocoa環境不是很熟悉,而且我一直在解決如何發送或偵聽來自USB設備的數據時遇到很多麻煩與CoreMIDI。我試圖將消息(144,36,5)發送到我在使用Bitwig Studio Scripting API之前完成的MIDI控制器(Ableton Push)。除了Apple的文檔,我一直沒有找到太多的東西,而且他們對我也沒有特別的幫助。到目前爲止,我已經知道如何獲取設備列表並查看他們的名字,但除此之外,我被卡住了。使用Swift和CoreMIDI發送和接收MIDI

我到目前爲止已經寫什麼要發送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

我想通過抓取設備的唯一ID來發送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)