raspberry pi — отправлять миди-сообщения из переполнения стека

Я использую 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, через мой открытый порт ???

1

Решение

Чтобы отправить некоторые события в определенное время:

  • открыть секвенсор;
  • создать свой собственный (исходный) порт;
  • построить и отправить некоторые события.

Чтобы открыть секвенсор, позвоните 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);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]