моей проблемы:Джек 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;