Как я могу получить именованный сигнал из патча Pure Data, используя libpd?

Я использую 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++?

1 ответ

Решение

единственный способ передачи сигналов между хостом и libpd - это использование [adc~] а также [dac~],

Тем не менее, вам не нужно создавать [dac~] с "громоздким" количеством входных отверстий.

вместо этого используйте [dac~ 27] вывести сигнал на 27 канал.

между прочим, нет никаких "основанных на сигнале сообщений"; сообщение является асинхронным событием, тогда как сигнал является синхронным потоком данных.

Другие вопросы по тегам