我上的一个小程序工作以监视来自NI Maschine 2.(MIDI输出想法是程序变化信息添加到NI机和使用的一些部件他们触发VJ-efects和一些其他的东西)CoreMIDI:midiReadProc只接收3个数据包的第一数据包具有相同时间戳
下面的测试情况给出了问题。 NI机器上的测试部分在第一拍时有一个音符和两个节目改变信息,在第16秒后有第二个音符。
我击球的时候开始,捕捉与MIDI监视器工具我看到输出:
这是正确的。恰恰是Maschine发送的是什么。 - 注意两个控制变更和下一个数据包的注释具有相同的时间戳。
当我做我的简单的虚拟客户端相同(见下面的代码)我得到这个:
- ,你可以看到第二个控制变更和注意在分组丢失!
通知第二个第三行(歌曲位置和继续)也具有相同的时间戳,并在两种情况下都收到。
如果你不嫌麻烦,直到读了这一点,你就会明白这个问题。 我知道我的simpel虚拟客户端和MIDI监视器程序之间的巨大差异是使用CoreMidi服务插件来监听MIDI输出。 这仅仅是CoreMidi的限制还是我错过了一些东西?
下面以虚拟客户端代码: 它剥夺了基本需要接收来自NI Mashine东西。 init设置虚拟客户端,目标并设置UniqueID。 如上所示,readproc正在生成缺少数据包的NSLOG消息。
任何建议都非常赞赏
//
// VirtualClient.m
// testMidiReadProc
//
// Created by Rob Keeris on 02/06/15.
// Copyright (c) 2015 Connector. All rights reserved.
//
#import "VirtualClient.h"
@implementation VirtualClient
SInt32 virtualinUniqueId = 1234567893;
MIDIClientRef client;
MIDIEndpointRef virtualIn;
NSString * midiTypeName(Byte midiType){
switch (midiType) {
case 0x80: return @"Note Off";
case 0x90: return @"Note On";
case 0xB0: return @"ControlChange";
case 0xC0: return @"ProgramChange";
case 0xF2: return @"SongPosition";
case 0xF8: return @"Clock";
case 0xFA: return @"Start";
case 0xFB: return @"Continue";
case 0xFC: return @"Stop";
case 0x00: return @"InvalidType";
default: return [NSString stringWithFormat:@"Unlisted midiType 0x%02x",midiType];
}
}
void midiReadProc (const MIDIPacketList *list, void *procRef, void *srcRef) {
const MIDIPacket *packet = &list->packet[0]; // ?defined as const to avoid compiler warnings?
for (int i = 0; i < list->numPackets; i++) {
if (packet->data[0] != 0xF8){ // filter out Clock messages
NSLog(@"%llu packet(%i of %i) %@(0x%02x) 0x%02x 0x%02x",
packet->timeStamp,i+1,list->numPackets,midiTypeName(packet->data[0]),packet->data[0],packet->data[1],packet->data[2]);
}
packet = MIDIPacketNext (packet);
}
}
- (id)init{
OSStatus result;
self = [super init];
if (self) {
// Create the client
result = MIDIClientCreate(CFSTR("myVirtualClient"), NULL, NULL, &client);
if (result !=0) NSLog(@"MIDIClientCreate error %i",result);
// create the destination
result = MIDIDestinationCreate(client, CFSTR("myVirtualDestination"), midiReadProc,(__bridge void *)(self),&virtualIn);
if (result !=0) NSLog(@"MIDIClientCreate error %i",result);
// set the UniqueId so i dont have to toggele the output in NI Maschine
result = MIDIObjectSetIntegerProperty(virtualIn, kMIDIPropertyUniqueID, virtualinUniqueId);
if (result !=0) NSLog(@"MIDIClientCreate error %i",result);
}
return self;
}
@end
额外的信息 把这个额外的测试响应基因的提示时看到 取出0xF8的过滤器,并使用一个printf代替的NSLog发生了什么();从MIDI监视器
输出:
输出形成我的代码:
没有办法解决,但现在一个时钟接收到具有相同的时间戳。
在这个测试中的节奏被设置为50 BPM(因此每50毫秒一个时钟) 我检查是否有时钟脉冲丢失,但事实并非如此。所有时钟都会收到大约预期的时间戳。
您是否找到解决方案?我也遇到了同样的时间戳邮件 –