2015-01-24 2 views
0

моей проблемы:Джек MIDI клиента кажется посылать MIDI-сообщения неоднократно

Я реализую домкрат MID прокси-клиент - я хочу, чтобы контролировать функцию отключения звука Йошей с моей MIDI-клавиатурой.

Итак: MIDI-контроллер «подключен» к моему прокси, а прокси-сервер «подключен» к MIDI-входу yoshimi.

Код работает нормально; сообщение mute button перехвачено, канал данных изменен, и yoshimi принимает команду, приглушенную ... Однако я обнаружил, что даже когда событие нажатия кнопки (примечания) контроллера (примечание) принимается (и пересылается) только один раз за событие, это выглядит повторяющийся. Например: если я нажимаю клавишу примечания на контроллере, yoshimi звучит так, как клавиша нажата (и отпущена?), Как 10 раз в секунду ... Но когда контроллер подключен к yoshimi напрямую, все звучит так, как должно.

MIDI-сообщения обрабатываются в функции process_callback. Я пробовал с обработкой в ​​основном цикле, но результат тот же.

Что здесь не так?

Это функция обработки:

int res = 0; 
int i,j; 

//get events 
void* in_port_buf = jack_port_get_buffer(input_port, nframes); 

jack_nframes_t n = jack_midi_get_event_count(in_port_buf); 

if(n==0) 
    return 0; 

jack_midi_event_t jev; 

printf("%i: Data arrived!\n", cnt); 
for(i = 0;i<n;i++){ 

    res = jack_midi_event_get(&jev,in_port_buf,i); 
    if(res == 0){ 
     printf("Got event, %i bytes!\n",jev.size); 
     for(j=0;j<jev.size;j++) 
      printf("%i: %i\n",j,jev.buffer[j]); 

    } else{ 
     printf("ERROR getting event!\n"); 
     return 0; 
    } 

    //first button: mute yoshimi volume, port 120, all sound off 
    if(jev.buffer[0]==176 && jev.buffer[1] == 97){ 
     jev.buffer[1] = 120; 
    } 

    //transmit data 
    cnt++; 


    void* port_buf = jack_port_get_buffer(output_port, nframes); 


    jack_midi_clear_buffer(port_buf); 

    res = jack_midi_event_write(port_buf, jev.time, jev.buffer, jev.size); 

    if(res == 0) 
     printf("Data sent!\n"); 
    else 
     printf("Error: %i\n",res); 
} 

return 0; 

ответ

0

Понял!

Изучив примеры джека, я обнаружил, что мне пришлось переместить явные и выходные каналы выходного порта из цикла.

Кроме того, midi_event_write не является обязательным.

Работы как следует.