TouchDesginerでは、OSCシグナルの有無を検出する直接的な手法がありません。
しかしながら、連続的にOSC信号が送信されている際、そのシグナルの有無を検出することができます。
これにより、外的要因で通信障害が発生してもTouchDesigner内部で対策をとることが可能です。
参照 : OSC In CHOP
It will show the internal queue size and whether it is dropping or missing data (queue_advanced_total and queue_retarded_total should not be increasing, and queue_length should not be zero).
信号受信有無の検出
TouchDesignerでは、受信したOSC信号をキューに追加し、FIFO形式で処理していくシステムを採用しているようです。
そのため、連続的に信号が送られ続けている場合は必ずキューに情報が保存されることになります。
先ほどのqueue_lengthチャンネルは、そのキューに格納されている情報の数を示しており、
これがゼロとなると信号が受信できていないと判断することができます。
Logic CHOPを先ほどのSelect CHOPにそのまま接続すると、検出結果をブール値で取得することができます。
ただし、ネットワークの安定具合では頻繁にqueue_lengthが0となる現象が発生し、
また、過剰にOSC信号を受け取っていた場合もオーバーフローを起こしてqueue_lengthが0を繰り返します。
これによる信号無しの判定を回避するため、
1秒間queue_lengthが0だった場合に受信できていないと判断するようなアルゴリズムでノードを組みなおします。
最終的なノード
解説
OSC In CHOPにより信号を受信しつつ、Info CHOPを追加してOSC Inの状態を見ます。
信号受信の有無を検出する際に使用するチャンネルはqueue_lengthになりますので、Select CHOPで抜き出します。
isQueueZero(Logic CHOP)ノードでqueue_lengthの長さが0であるか否かを返します。
その出力先をTimer CHOPのカウントスタートの挿入口に接続し、
もう一つこの結果を反転させるようなisQueueNotZeroノードへ渡します。
isQueueNotZeroノードの出力先はTimer CHOPのInitialize挿入口へ接続します。
これにより、queue_lengthが0であった場合タイマーをスタートさせ、0より大きかった場合にタイマーをリセットするシステムができました。
あとは、Timer CHOPのdoneチャンネルの値を反転してisReceivingとして扱えば、信号の有無が検出できます。
(タイマー終了(done:1) = 信号を受け取れていない = isReceiving:0)