我正在使用树莓派,所以它有点像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?
答案 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_output
和snd_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);