我上的一個小程序工作以監視來自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毫秒一個時鐘) 我檢查是否有時鐘脈衝丟失,但事實並非如此。所有時鐘都會收到大約預期的時間戳。
您是否找到解決方案?我也遇到了同樣的時間戳郵件 –