2014-11-04 4 views
1

Я знаю, что MIDI позволяет мне читать состояние MIDI Foot Controller, вылавливая MIDI-сообщение с сообщением об изменении управления. Но что, если пользователь еще не коснулся/не изменил контроль? Я все еще могу читать состояние/ценность? Каким образом это можно сделать?Как читать начальное состояние MIDI Foot Controller?

Это мой код для ловли 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

Если вы не перезагрузить устройство, и не изменить управление, то ваша программа не знает о состоянии контроля до него получает сообщение.

Некоторые устройства могут иметь специфические для поставщика команды для считывания текущего состояния элемента управления или сброса всего состояния.

+1

Проверьте документацию соответствующего контроллера Foot. Если поддерживается, это, как правило, системное эксклюзивное сообщение. Вы также можете исследовать отправку MIDI-ПК или CCs на контроллер, чтобы явно указать его состояние. Оба метода требуют двухсторонней связи, то есть вам нужно подключить MIDI-In, а также порты MIDI-Out контроллера. Если контроллер имеет только MIDI-выход, восстановить состояние будет практически невозможно. [2c] – obiwanjacobi

0

Короткий ответ - Нет - вы не можете знать, пока не произойдет событие

Других ответы правильны, если у вас есть вход и выход подключен к контроллеру, который позволяет допрос через SysEx сообщений (изготовления)

Чтобы быть более полезными: Состояние по умолчанию всех контроллеров (вы хотите использовать) должно быть выключено при запуске например Pitch Bend = centered, Modulation = ZERO, Sustain = OFF и т. Д.

Это было состояние игры с 1980-х годов, так что это не настоящая проблема. Если у вас есть нога (на педали), прежде чем вы начнете ваше приложение будет синхронизировано с момента его выпуска

Удача

Смежные вопросы