プロジェクトに Pure Data エンジンを埋め込むために libpd を使用しており、パッチからシグナル メッセージを受信しようとしています。
非シグナル メッセージ (つまり) コントロールをパッチに配置すると、次のようになります。
|
|
|
[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;
}
このコードはシンボル toCPP のティック サイクルごとにパッチからフロート (またはフロートのリスト) を受け取ると思われますが、そうではありません。このテスト コードは、メッセージの [s toCPP] バージョンを受け取りますが、[s~ toCPP] は受け取りません。余談ですが、 [osc~ 440] を [dac~] オブジェクトに接続し、outbuf を介してデータを読み込むと、[osc~ 440] からの出力を受け取ることができますが、これは私の用途には最適ではなく、避けてください (主な理由は、8 セット以上の音響データを出力する必要があり、パッチ内で dac~ オブジェクトを多くのチャンネルで作成して使用するのがやや扱いにくくなるためです)。
したがって、私の質問は次のとおりです。
libpd を使用して Pd パッチからシグナルベースのメッセージを受信することは可能ですか?
C++ 側で libpd を使用して Pd パッチからシグナルベースのメッセージを受信するにはどうすればよいですか?