2014-11-04 5 views
1

MIDI를 사용하면 컨트롤 변경을 나타내는 MIDI 메시지를 잡아내어 MIDI 풋 컨트롤러의 상태를 읽을 수 있습니다. 그러나 사용자가 컨트롤을 아직 터치하지 않았거나 변경하지 않았다면 어떻게 될까요? 상태/값을 읽을 수 있습니까? 그 일을하는 방법은 무엇입니까?MIDI 풋 컨트롤러의 초기 상태를 읽는 방법은 무엇입니까?

이 당신이 그것을 할 때까지 프로그램이 모르는, 컨트롤의 상태를 장치를 재설정하지 않았고, 컨트롤을 변경하지 않은 경우 OSX CoreMIDI

void initMidi() 
{ 
    MIDIClientRef midiClient; 
    MIDIPortRef  inputPort; 
    OSStatus  status; 
    MIDIEndpointRef src; 

    status = MIDIClientCreate(CFSTR("testing"), NULL, NULL, &midiClient); 
    if (status != noErr) 
     NSLog(@"Error creating MIDI client: %d", status); 

    status = MIDIInputPortCreate(midiClient, CFSTR("Input"), midiInputCallback, NULL, &inputPort); 
    if (status != noErr) 
     NSLog(@"Error creating MIDI input port: %d", status); 

    ItemCount numOfDevices = MIDIGetNumberOfDevices(); 

    // just try to connect to every device 
    for (ItemCount i = 0; i < numOfDevices; i++) { 
     src = MIDIGetSource(i); 
     status = MIDIPortConnectSource(inputPort, src, NULL); 
    } 
} 

void midiInputCallback(const MIDIPacketList *list, 
    void *procRef, 
    void *srcRef) 
{ 
    for (UInt32 i = 0; i < list->numPackets; i++) { 
     const MIDIPacket *packet = &list->packet[i]; 

     for (UInt16 j = 0, size = 0; j < packet->length; j += size) { 
      UInt8 status = packet->data[j]; 

      if (status < 0xC0) size = 3; 
      else if (status < 0xE0) size = 2; 
      else if (status < 0xF0) size = 3; 
      else if (status < 0xF3) size = 3; 
      else if (status == 0xF3) size = 2; 
      else      size = 1; 

      switch (status & 0xF0) { 
      case 0xb0: 
       NSLog(@"MIDI Control Changed: %d %d", packet->data[j + 1], packet->data[j + 2]); 
       break; 
      } 
     } 
    } 
} 
+1

어떤 컨트롤러를 타겟팅하고 있습니까? – obiwanjacobi

+0

기타 이펙트 컨트롤러 인 PODxt의 노브와 컨트롤을 목표로합니다. 고맙게도 Line6은 공급 업체별 SysEx 메시지에 대한 사양을 제공합니다 : [PDF 링크] (http://line6.com/data/6/0a060b316ac34f0593ef290ff/application/pdf/POD%20Pro%20Sysex%20-%20English%20. pdf) – Jay

+0

덤프를 요청하면 모두 설정됩니다. – obiwanjacobi

답변

3

를 사용하여 MIDI 메시지를 잡기위한 내 코드입니다 메시지를받습니다.

일부 장치에는 공급 업체별 명령이있어 컨트롤의 현재 상태를 읽거나 전체 상태를 덤프 할 수 있습니다.

+1

문제의 풋 컨트롤러의 문서를 확인한다. 지원되는 경우 대개 시스템 독점 메시지입니다. MIDI PC 또는 CC를 상태를 명시 적으로 설정하기 위해 컨트롤러로 전송하는 방법을 조사 할 수도 있습니다. 두 가지 방법 모두 양방향 통신이 필요합니다. 즉, 컨트롤러의 MIDI-Out 포트와 MIDI-Out 포트를 연결해야합니다. 컨트롤러에 MIDI 아웃 만있는 경우 상태를 검색 할 수 없습니다. [2c] – obiwanjacobi

0

짧은 대답이다 - 없음 - 이벤트는 IN과 OUT은 익스 클루 시브 메시지를 통해 심문을 할 수있는 컨트롤러에 연결 (특정 제조업체)

이있는 경우

다른 답변이 정확 발생할 때까지 당신은 알 수 없다

추가 정보 : 시작하려는 모든 컨트롤러의 기본 상태는 꺼져 있어야합니다 (예 : ). 피치 벤드 = 센터링, 모듈레이션 = 제로, 서스테인 = OFF 등 ...

이것은 1980 년대 이후의 게임 상태 였으므로 실제 문제는 아니 었습니다. 시작하기 전에 발을 내려 놓은 경우 귀하의 앱을 출시하면 동시에 동기화됩니다.

행운을 빌어 요.