我的问题是:
我正在实现一个插孔MID代理客户端 - 我想用我的MIDI键盘控制yoshimi的静音功能。
所以:MIDI控制器是"连接"到我的代理,代理是"连接"到yoshimi的MIDI输入。
代码工作正常;截获静音按钮消息,更改数据通道,yoshimi接受命令静音...但是我发现,即使每个事件只接收(转发)控制器的(音符)按钮按下/释放事件一次,它看起来像是在重复。例如:如果我在控制器上按下一个音符键,yoshimi听起来就像键被按下(并释放?),每秒10次...但是当控制器直接连接到yoshimi时,所有声音都应该如此。
正在process_callback函数中处理MIDI消息。我尝试在主循环中进行处理,但结果是一样的。
这里有什么问题?
这是处理功能:
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 :(得分:0)
知道了!
在研究了杰克的例子后,我发现,我必须将输出端口的清除和分配rutines移出循环。
此外,不需要midi_event_write。
现在应该工作。