关于iOS CoreMIDI库中MIDIServices 相关API解读
一.获取可用MIDI列表
// 获取可用MIDI列表的数量
ItemCount deviceCount = MIDIGetNumberOfDevices();
// 遍历MIDI列表,能够获取到设备
for (ItemCount i = 0 ; i < deviceCount ; ++i) {
MIDIDeviceRef device = MIDIGetDevice(i);
}
二.获取设备相关信息
经过1中遍历MIDI列表,能够拿到设备的指针,即可获取到相关的midi信息
1.获ios是什么意思取MIDI设备相关信息
NSString *getPropatyString(MIDIObjectRef object, CFStringRef property )
{
CFStringRef name = nil;
if (noErr != MIDIObjectGetStringProperty(object, property, &name))
return nil;
return (NSString *)CFBridgingRelease(name);
}
kMIDIPropertyName
设备、实体人头攒动和端点都可能有称号。 显现端点称号的引荐办法指针万用表怎么读数是询问端点称号,假如该称号是仅有的,则仅显人头攒动的近义词现该称号。 假如它不是仅有的,则在设备称号前增加。
其他相关想要获取的能够查阅文档,罗列几个常用的
kMIDIPropertyManufacturer
kMIDIPropertyUniqueID
kMIDIios越狱PropertyDeviceID
kMIDIPropertyDisplayName
调用办法
getPropatyString(device, kMIDIPropertyManufacturer )
2.检查设备是否在线
SInt32 isOffline = 0;
MIDIObjectGetIntegerProperty(device, kMIDIPropertyOffline, &isOffline);
isOffline =指针数组和数组指针的区别= 0为离线
3.获取设备的实体数量人头攒动的近义词
// 获取设备的实体数量
ItemCount entityCount = MIDIDeviceGetNumberOfEntities(device);
// 遍历设备的实体数量
for (ItemCount j = 0 ; j < entityCount ; ++j) {
MIDIEntityRef entity = MIDIDeviceGetEntity(device, j);
// 同样能够获取实体的称号,能够调这个办法是应该他们都是指针目标
getPropatyString(entity, kMIDIPropertyName) ;
}
3.1rtc是什么意思 获RTC取设备的源端口指针说漫数量
// 获取源端口的数量
ItemCount sourceCount = MIDIEntityGetNumberOfSources(entity);
for (ItemCount k = 0 ; k < sourceCount ; ++k) {
MIDIEndpointRef source = MIDIEntityGetSource(entity, k);
// 同样能够获取实体的称号
getPropatyString(entity, kMIDIPropertyName) ;
}
3.2 获取设备人头攒动意图端口的数量
// 获取意图端口的数量
ItemCount destCount = MIDIEntityGetNumberOfDestinations(entity);
for (ItemCount k = 0 ; k < destCount ; ++k) {
MIDIEndpointRef dest = MIDIEntityGetDestination(entity, k);
// 同样能够获取实体的称号
getPropatyString(entity, kMIDIPropertyName) ;
}
4.直接获取体系源端指针万用表怎么读数口
// 获取源端口的数量
ItemCount sourceCount = MIDIGetNumberOfSources();
for (NSInteger i = 0; i < sourceCount; i++) {
MIDIEndpointRef endPointRef = MIDIGetSource(i);
// 同样能够获取实体的称号
getPropatyString(endPointRef, kMIDIPropertyName) ;
}
三、创立MIDI Client 和Port
要使用 CoreMIDI,指针c语言应用程序指针式万用表会创立一个 MIDIClie闰土刺猹ntRef,它能够向让天秤倒追的星座其间增加MIDIPortRef,经过它能够发送和接纳 MIDI。
OSStatus err;
MIDIClientRef clientRef;
MIDIPortRef inputPortRef;
NSString *clientName = @"inputClient";
err = MIDIClientCreate((CFStringRef)CFBridgingRetain(clientName), NULL, NULL, &clientRef);
if (err != noErr) {
NSLog(@"MIDIClientCreate err = %d", err);
return ;
}
NSString *inputPortName = @"inputPort";
err = MIDIInputPortCreate(
clientRef, (CFStringRef)CFBridgingRetain(inputPortName),
MIDIInputProc, NULL, &inputPortRef);
if (err != noErr) {
NSLog(@"MIDIInputPortCreate err = %d", err);
return ;
}
ItemCount sourceCount = MIDIGetNumberOfSources();
NSLog( @"errsourceCount = %lu", sourceCount );
for (ItemCount i = 0; i < sourceCount; i++) {
MIDIEndpointRef sourcePointRef = MIDIGetSource(i);
err = MIDIPortConnectSource(inputPortRef, sourcePointRef, NULL);
if (err != noErr) {
NSLog(@"MIDIPortConnectSource err = %d", err);
return ;
}
}
static void
MIDIInputProc(const MIDIPacketList *pktlist,
void *readProcRefCon, void *srcConnRefCon)
{
MIDIPacket *packet = (MIDIPacket *)&(pktlist->packet[0]);
UInt32 packetCount = pktlist->numPackets;
for (NSInteger i = 0; i < packetCount; i++) {
Byte mes = packet->data[0] & 0xF0;
Byte ch = packet->data[0] & 0x0F;
if ((mes == 0x90) && (packet->data[2] != 0)) {
NSLog(@"note on number = %2.2x / velocity = %2.2x / channel = %2.2x",
packet->data[1], packet->data[2], ch);
} else if (mes == 0x80 || mes == 0x90) {
NSLog(@"note off number = %2.2x / velocity = %2.2x / channel = %2.2x",
packet->data[1], packet->data[2], ch);
} else if (mes == 0xB0) {
NSLog(@"cc number = %2.2x / data = %2.2x / channel = %2.2x",
packet->data[1], packet->data[2], ch);
} else {
NSLog(@"etc");
}
packet = MIDIPacketNext(packet);
}
}
总结