Я использую libpd для встраивания движка Pure Data в свой проект и пытаюсь получать сигнальные сообщения от патча.
Если я помещаю элемент управления не сигнальным сообщением (т.е.) в патч:
|
|
|
[s toCPP]
У меня нет проблем с получением сообщения. Однако, если я пытаюсь сделать то же самое сообщение с ~, означающим сигнальное сообщение, мои обработчики никогда не получат его, пример патча выглядит следующим образом:
[osc~ 440]
|
|
|
[s~ toCPP]
Этот патч никогда не получает никаких сообщений «toCPP», независимо от того, использую ли я опрос или обратные вызовы. Вот мой [урезанный] пример кода:
#include <PdBase.hpp>
#include <iostream>
using namespace pd;
class PdRec : public pd::PdReceiver
{
public:
void receiveFloat(const std::string & dest, float num)
{
std::cout << "received float: " << dest << ": " << num << std::endl;
}
void receiveSymbol(const std::string & dest, const std::string & symbol)
{
std::cout << "Received symbol: " << dest << ": " << symbol << std::endl;
}
void receiveMessage(const std::string & dest, const std::string & msg, const pd::List& list)
{
std::cout << "Received message: " << dest << ": " << msg << std::endl;
}
void receiveList(const std::string & dest, const pd::List & list)
{
std::cout << "Received list: " << dest << std::endl;
}
}
int main(int argc, char** argv)
{
float inbuf[64], outbuf[64];
pd::PdBase pdEngine;
if(!pdEngine.init(1, 1, 44100))
{
std::cout << "Failed to initialize pd!" << std::endl;
exit(1);
}
std::cout << "Init success!" << std::endl;
pd::Patch patch = pdEngine.openPatch("a440test.pd", "./");
std::cout << patch << std::endl;
PdRec rec;
pdEngine.subscribe("toCPP");
pdEngine.setReceiver(&rec);
pdEngine.computeAudio(true);
for(int i = 0; i < 30 * 44100 / 64; i++)
{
pdEngine.processFloat(1, inbuf, outbuf);
}
return 0;
}
Можно было бы ожидать, что этот код будет получать float (или список float) из патча каждый цикл тиков для символа toCPP, однако это не так. Этот тестовый код получит версию сообщения [s toCPP], но не [s ~ toCPP]. В сторону, я Можно однако, я получаю вывод от [osc ~ 440], если я подключаю его к объекту [dac ~] и читаю данные через outbuf, но это не оптимально для моих целей, и я бы хотел этого избежать (основная причина Мне может понадобиться вывести более 8 или более наборов акустических данных, и в патче становится несколько громоздко создавать и использовать объект dac ~ с таким количеством каналов).
Мои вопросы таковы:
Можно ли получать сигналы на основе сигналов из патча Pd с помощью libpd?
Как получить основанное на сигнале сообщение из патча Pd, используя libpd на стороне C ++?
только способ передачи сигналов между хостом и libpd с помощью [adc~]
а также [dac~]
,
Тем не менее, вам не нужно создавать [dac~]
с «громоздким» количеством входных отверстий.
вместо этого используйте [dac~ 27]
вывести сигнал на 27 канал.
между прочим, нет никаких «основанных на сигнале сообщений»; сообщение является асинхронным событием, тогда как сигнал является синхронным потоком данных.