【问题标题】:Jack MIDI client seems to send MIDI messages repeatedlyJack MIDI 客户端似乎重复发送 MIDI 消息
【发布时间】:2015-03-23 06:19:05
【问题描述】:

我的问题是:

我正在实现一个 jack MID 代理客户端 - 我想用我的 MIDI 键盘控制 yoshimi 的静音功能。

所以:MIDI 控制器“连接”到我的代理,代理“连接”到 yoshimi 的 MIDI 输入。

代码可以正常工作;静音按钮消息被截获,数据通道已更改并且 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;

【问题讨论】:

    标签: jack


    【解决方案1】:

    知道了!

    在研究了我发现的插孔示例后,我必须将输出端口的清除和分配规则移出循环。

    另外,midi_event_write 不是必需的。

    现在可以正常工作了。

    【讨论】:

    • 你的意思是没有必要?保留缓冲区有什么意义?
    • 开发阶段,我猜
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多