2011-10-05 2 views
0

MIDIPacketListAdd를 사용하여 일련의 MIDI 패킷을 보내고 있습니다. 재생 중에 패킷을 동적으로 변경하려고하므로 NSTimer를 사용하여 패킷이 예정된 시간 전에 각 패킷을 추가합니다.OSX Core MIDI- NSTimer에서 MIDIPacketListAdd를 호출

코드가 제대로 작동하고 현재 패킷의 주소가 올바르게 업데이트되며 모든 데이터가 올바른지 확인했습니다. 그러나 MIDIPacketListAdd가 타이머에서 호출되면 MIDI 데이터가 전송되지 않습니다. 패킷을 재생해야하기 전에 MIDIPacketListAdd로 전송되는지 확인하기 위해 타이머를 시작하기 전에 처음 두 패킷을 추가합니다.

나는 매우 혼란 스럽다. 어떤 제안? 나뿐만 아니라 내 MIDI 데이터를 전송하는 방법을

덕분에, 톰 제프리

답변

3

귀하의 설명을 정확히, 그리고 그것을 잘 작동합니다. 어쩌면 당신은 소스 코드를 게시 할 수 있으며, 무엇이 잘못되었는지를 짐작하기가 어렵지 않습니다.

또한 테스트를 위해 타임 스탬프를 0으로 설정하십시오. 그러면 MIDI를 보낼 수 있는지 확인한 후 타임 스탬프를 다시 입력하여 별도로 디버깅 할 수 있습니다.

소스 대신에 MIDI를 보내는 간단한 방법이 있습니다. NSTimer에서 호출하고 일부 Apple 예제를 기반으로하며 작동합니다. 'outputPort'을 참고하는 것은 당신이 당신의 클라이언트 심판과 함께 MIDI를 전송하기 전에 어딘가에 작성해야 뭔가 당신이 그이 후에는 보낼 수

OSStatus s; 
MIDIClientRef client; 
MIDIPortRef outputPort; 
s = MIDIClientCreate((CFStringRef)@"My Test MIDI Client", MyMIDINotifyProc, self, &client); 
s = MIDIOutputPortCreate(client, (CFStringRef)@"My Test MIDI Output Port", &outputPort); 

(나는 당신이 그 짓을 가정합니다) MIDI

- (void) MySendMidi:(const UInt8*)data size:(UInt32)bsize 
{ 
    NSLog(@"%s(%u bytes to core MIDI)", __func__, unsigned(bsize)); 
    assert(bsize < 65536); 

    Byte packetBuffer[bsize+100]; 
    MIDIPacketList *packetList = (MIDIPacketList*)packetBuffer; 
    MIDIPacket  *packet  = MIDIPacketListInit(packetList); 

    packet = MIDIPacketListAdd(packetList, sizeof(packetBuffer), packet, 0, bsize, data); 

    // Send it to every destination in the system... 
    for (ItemCount index = 0; index < MIDIGetNumberOfDestinations(); ++index) 
    { 
     MIDIEndpointRef outputEndpoint = MIDIGetDestination(index); 
     if (outputEndpoint) 
     { 
      // Send it 
      OSStatus s = MIDISend(outputPort, outputEndpoint, packetList); 
     } 
    } 
} 
+0

감사합니다. 마침내 MIDIPacketListAdd가 실제로 데이터를 보내지 않는다는 것을 알았습니다. 단지 패킷 목록에 추가하는 것입니다. MIDISend를 추가하면 모든 기능이 작동합니다. Apple이 CoreMIDI를 문서화하지 않기로 한 것은 불행한 일입니다. – TomJeffries