Я использую Raspberry Pi, так что это своего рода Debian (Raspbian)
У меня работает синтезатор (Zynaddsubfx), и я хочу отправить ему миди-сообщения из кода, чтобы он воспроизводил музыку для меня. Я буду использовать 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)
теперь я могу видеть ZynSubAddFX в aconnect -ol
и мой собственный секвенсор в aconnect -il
, И я могу их соединить
pi@cacharro:~/projects/tests$ aconnect 129:0 128:0
pi@cacharro:~/projects/tests$ Info, alsa midi port connected
для этого, как предложено CL, я использовал открытый snd_seq_open, сохранил последовательность и затем использовал snd_seq_create_simple_port .. НО:
Как уже говорилось ранее, я просто хочу отправлять команды в zynsubaddfx при взаимодействии с пользователем, поэтому создание очередей, добавление темпа и т. Д. Не является подходящим способом.
Есть ли способ послать простые миди-команды, такие как note on / note off, через мой открытый порт ???
Чтобы отправить некоторые события в определенное время:
Чтобы открыть секвенсор, позвоните 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_
ххх, и 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_
ххх функции для установки своих свойств.
Тогда позвони 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);
Других решений пока нет …