从C ++发送midi消息

时间:2014-01-16 11:56:48

标签: c++ raspberry-pi midi alsa

我正在使用树莓派,所以它有点像Debian(Raspbian)

我有一个合成器正在运行(Zynaddsubfx),我想从代码中发送midi消息并让它为我播放音乐。我将使用ALSA。

我设法通过以下方式在我的程序中创建一个“发射端口”:

snd_seq_create_simple_port(seq_handle, "My own sequencer",
    SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ,
    SND_SEQ_PORT_TYPE_APPLICATION)

现在我可以在aconnect -ol中看到ZynSubAddFX,在aconnect -il中看到我自己的音序器。我能够连接它们:

pi@cacharro:~/projects/tests$ aconnect 129:0 128:0
pi@cacharro:~/projects/tests$ Info, alsa midi port connected

为了做到这一点,由于我使用了已打开的snd_seq_open来消化,存储了序列,然后使用了snd_seq_create_simple_port ..但是:

如前所述,我只是想在用户交互下向zynsubaddfx发送命令,因此创建队列,添加速度等等都不是可行的方法。

有没有办法通过我打开的端口发送简单的midi命令,例如note on / note off?

1 个答案:

答案 0 :(得分:2)

在特定时间发送一些事件:

  • 打开音序器;
  • 创建您自己的(源)端口;
  • 构建并发送一些事件。

要打开音序器,请拨打snd_seq_open。 (您可以使用snd_seq_client_id获取您的客户编号。)

    snd_seq_t seq;
    snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, 0);

要创建端口,请使用分配端口信息对象 snd_seq_port_info_alloca,设置端口参数 snd_seq_port_info_set_ xxx和call snd_seq_create_port。 或者只需致电snd_seq_create_simple_port

    int port;
    port = snd_seq_create_simple_port(seq, "my port",
            SND_SEQ_PORT_CAP_READ | SND_SEQ_POR_CAP_WRITE,
            SND_SEQ_PORT_TYPE_APPLICATION);

要发送事件,请分配事件结构(仅限 要进行更改,您可以使用本地snd_seq_event_t变量), 并调用各种snd_seq_ev_ xxx函数来设置其属性。 然后在发送完所有内容后拨打snd_seq_event_outputsnd_seq_drain_output 事件

    snd_seq_event_t ev;
    snd_seq_ev_clear(&ev);
    snd_seq_ev_set_direct(&ev);

    /* either */
    snd_seq_ev_set_dest(&ev, 64, 0); /* send to 64:0 */
    /* or */
    snd_seq_ev_set_subs(&ev);        /* send to subscribers of source port */

    snd_seq_ev_set_noteon(&ev, 0, 60, 127);
    snd_seq_event_output(seq, &ev);

    snd_seq_ev_set_noteon(&ev, 0, 67, 127);
    snd_seq_event_output(seq, &ev);

    snd_seq_drain_output(seq);