7

OSC 経由で Pure Data (または Max/MSP) から MATLAB に送信されたメッセージを受信しようとしています。

  • Pure Data から Pure Data に OSC メッセージを送信できます
  • MATLAB から MATLAB にメッセージを送信できます
  • MATLAB から Pure Data にメッセージを送信することもできます
  • ...Pure Data が MATLAB とやり取りするのに本当に苦労しています

MATLAB からメッセージを送信するコードは次のとおりです (oscmex プロトコルを使用しています)。

host = 'localhost'; % local host UDP address
sendPort = 3333; % UDP port number to send over
receivePort = 3333; % UDP port number to receive from
oscAddress = osc_new_address(host, sendPort); % open send address
oscServer = osc_new_server(receivePort); % open server

dataPacket = struct('path','/foo','tt','f','data',{num2cell([1.0])}); % create packet
osc_send(oscAddress, dataPacket); % write packet to OSC

oscMessage = osc_recv(oscServer, 0.1); % listen for packet on OSC

% check to see if anything is there...
if length(oscMessage) > 0
    fprintf('Found something!')
else
    fprintf('Failed to find anything')
end

osc_free_address(oscAddress);
osc_free_server(oscServer);

ホスト 'localhost' を使用して送信すると、上記のコードを使用して MATLABからMATLABに正常に送信されます。'127.0.0.1' に設定すると、MATLAB は Pure Data に送信しますが、MATLAB は独自のメッセージを受信できません。

さて、物事のもう一方の端に。これが私の Pure Data パッチです。

ピュアデータのパッチ画像

ここでも、上記のパッチを単独で実行すると、Pure Data を介してメッセージを正常に送受信できます。

問題は、あるプログラムから別のプログラムに話しかけようとしたときに発生します。MATLAB がポート 3333 で送信し、Pure Data が 3333 で受信し、Pure Data が 2222 で送信し、MATLAB が 2222 で受信するように設定すると、MATLAB のホストが '127.0.0.1' の場合に Pure Dataを受信させることができます。 . ただし、'127.0.0.1' では、MATLAB はそれ自体に送信できません。

いずれにせよ、何を試しても、Pure Dataを MATLAB に送信することはできますが、Pure Data をそれ自体に送信することはできません。「ホスト」アドレスと関係があると思われます。

私の実際の IPv4 アドレス (MS コマンド プロンプトの 'ipconfig' を使用して検出) は 127.0.0.1 とはまったく異なり、ここで指定した値を使用しても動作が改善されるようには見えません。

一度に同じポートを開いた状態で複数の OSC サーバーを使用できないことを認識しているため、現在のソリューションの試みでは、あるポートで MATLAB から送信し、別のポートで Pure Data から送信します。いずれかのポートで一度に 1 つのサーバーが開きます。

/foo注MATLAB および/testPure Data からのメッセージに を使用していることも認識しています。ただし、私の MATLAB コードは、OSC 経由で送信されたすべてのものを無差別に受信するため、違いはありません。

PD が MATLAB と対話するための助けをいただければ幸いです。

更新:「localhost」の問題を解決しましたが、問題は解決していないようです(Windowsの「hosts」ファイルにlocalhostを追加する必要がありました)。したがって、ローカルホストのことを心配して間違ったツリーを鳴らしていた可能性があります。しかし、まだ PD に MATLAB と通信させることができません。

更新 #2 : Amro は以下の洗練されたソリューションを投稿しましたが、MATLABで Pure Data からのメッセージを受信できません。UDP 接続を監視するためにCloseTheDoorをインストールしましたが、MATLAB がサーバーをセットアップするときに 'Interface' を使用するの[::0]に対し、PD セットは 'Interface' を使用することに気付きました0.0.0.0。PureData はメッセージを正常に受信するため、MATLAB もリッスンする必要があるのでしょ0.0.0.0うか?

4

2 に答える 2

5

私は以前にPureDataや OSC を使用したことがなく、サーバー/クライアントを作成するために示したグラフ/パッチを複製しただけです。

1) PureData のサーバー、MATLAB のクライアント:

まず、PureData でサーバーを作成します。

サーバー_PD: pastebin.com/hwJzxri2

次に、MATLAB で GUI として実装された単純なクライアントを示します。

function example_osc_client()
    handles = createGUI();
    osc = [];

    function h = createGUI()
        h.fig = figure('Menubar','none', 'Resize','off', ...
            'CloseRequestFcn',@onClose, ...
            'Name','OSC Client', 'Position',[100 100 220 140]);
        movegui(h.fig, 'center')
        h.conn = uicontrol('Style','pushbutton', 'String','Connect', ...
            'Callback',{@onClick,'connect'}, ...
            'Parent',h.fig, 'Position',[20 20 80 20]);
        h.disconn = uicontrol('Style','pushbutton', 'String','Disconnect', ...
            'Callback',{@onClick,'disconnect'}, ...
            'Parent',h.fig, 'Position',[120 20 80 20]);
        h.slid = uicontrol('Style','slider', 'Callback',@onSlide, ...
            'Min',-10, 'Max',10, 'Value',0, ...
            'Parent',h.fig, 'Position',[30 60 160 20]);
        h.txt = uicontrol('Style','text', 'String','0.0', ...
            'Parent',h.fig, 'Position',[80 100 60 20]);
        set([h.slid;h.disconn], 'Enable','off');
        drawnow
    end

    function onClick(~,~,action)
        switch lower(action)
            case 'connect'
                osc = osc_new_address('127.0.0.1', 2222);
                set(handles.conn, 'Enable','off')
                set(handles.disconn, 'Enable','on')
                set(handles.slid, 'Enable','on')
            case 'disconnect'
                osc_free_address(osc); osc = [];
                set(handles.conn, 'Enable','on')
                set(handles.disconn, 'Enable','off')
                set(handles.slid, 'Enable','off')
        end
        drawnow
    end

    function onSlide(~,~)
        if isempty(osc), return; end
        val = single(get(handles.slid,'Value'));
        m = struct('path','/test', 'tt','f', 'data',{{val}});
        osc_send(osc, m);
        set(handles.txt, 'String',num2str(val))
        drawnow
    end

    function onClose(~,~)
        if ~isempty(osc)
            osc_free_address(osc);
        end
        delete(handles.fig);
    end
end

client_MATLAB

スライダーを動かすと、メッセージが ( OSC-MEXインターフェイスを使用して) サーバーに送信され、値が PureData モデルに表示されます。

doubleこれをテストしているときに、PD ログ ウィンドウに次のメッセージが表示されたため、タイプがサポートされていないことに気付きました。

unpackOSC: PrintTypeTaggedArgs: [A 64 ビット float] が実装されていません

そのため、値を手動でキャストするか、 OSC-MEX 関数singleに渡される構造体でヒントの型を明示的に指定する必要がありました。osc_send

val = single(1);
m = struct('path','/test', 'tt','f', 'data',{{val}});
osc_send(osc, m);

2) MATLAB のサーバー、PureData のクライアント:

同様に、PureData でクライアントを作成します。

client_PD: pastebin.com/P1KcM00m

ここでも、MATLAB GUI として実装されたサーバーを次に示します。

function example_osc_server()
    handles = createGUI();
    osc = [];

    function h = createGUI()
        h.fig = figure('Menubar','none', 'Resize','off', ...
            'CloseRequestFcn',@onClose, ...
            'Name','OSC Server', 'Position',[100 100 220 140]);
        movegui(h.fig, 'center')
        h.start = uicontrol('Style','pushbutton', 'String','Start', ...
            'Callback',{@onClick,'start'}, ...
            'Parent',h.fig, 'Position',[20 20 80 20]);
        h.stop = uicontrol('Style','pushbutton', 'String','Stop', ...
            'Callback',{@onClick,'stop'}, ...
            'Parent',h.fig, 'Position',[120 20 80 20]);
        h.txt = uicontrol('Style','text', 'String','', ...
            'Parent',h.fig, 'Position',[60 80 100 20]);
        set(h.stop, 'Enable','off');
        drawnow expose

        h.timer = timer('TimerFcn',@receive, 'BusyMode','drop', ...
            'ExecutionMode','fixedRate', 'Period',0.11);
    end

    function onClick(~,~,action)
        switch lower(action)
            case 'start'
                set(handles.start, 'Enable','off')
                set(handles.stop, 'Enable','on')
                osc = osc_new_server(2222);
                start(handles.timer);
            case 'stop'
                set(handles.start, 'Enable','on')
                set(handles.stop, 'Enable','off')
                osc_free_server(osc); osc = [];
                stop(handles.timer);
        end
        drawnow expose
    end

    function receive(~,~)
        if isempty(osc), return; end
        m = osc_recv(osc, 0.1);
        if isempty(m), return; end
        set(handles.txt, 'String',num2str(m{1}.data{1}))
        drawnow expose
    end

    function onClose(~,~)
        if ~isempty(osc)
            osc_free_server(osc);
        end
        stop(handles.timer); delete(handles.timer);
        delete(handles.fig);
        clear handles osc
    end
end

server_MATLAB

サーバーの部分は、MATLAB では少しトリッキーでした。アイデアは、MATLAB がメッセージを待って無期限にブロックしないようにすることです。そこで、0.11 秒ごとに実行されるタイマーを作成しました。タイマー関数内では、ブロック方式でメッセージを受信しようとしますが、タイムアウトは 0.1 秒です。このようにして、GUI と MATLAB IDE の応答性が維持されます。


3) その他の組み合わせ:

上記のソリューションを使用すると、クライアントとサーバーの両方を PureData で開くことも、クライアントとサーバーの両方を MATLAB で開くこともできます。どちらの方法でも機能するはずです。

localhost最後に、ホスト名を使用しても、IP アドレスを直接指定しても、違いはありませんでした127.0.0.1

HTH


編集:

OSC-MEX パッケージを自分でコンパイルすることができました。手順は次のとおりです。最初に osc-mex ソースとその依存関係をダウンロードします。これには、 liblo ソースpthreads-win32 バイナリpremake4実行可能ファイルが含まれます。

1) liblo ライブラリを構築することから始めます。

  • 「premake4.exe」を「build」ディレクトリにコピーし、次を実行します。premake4 --platform=x32 vs2010
  • 生成された「liblo.sln」ソリューション ファイルを VS2010 で開きます。「liblo」プロジェクトを選択し、「Project > Properties」に移動します。[追加のincludeインクルード ディレクトリ] フィールドに、pthreads ヘッダー ファイルを含むフォルダーを追加します。同様にlibリンカー用のフォルダーを追加し、pthreadVC2.lib追加の依存関係として指定します。
  • 「ReleaseLib」Win32 ターゲットを選択し、プロジェクトをビルドします。これにより、最終的なターゲットが作成されます。lib\ReleaseLib\liblo.lib

Pd などの OSC アプリケーションには IPv6 に関する問題があるため、liblo ではデフォルトで IPv6 サポートが無効になっていることに注意してください。それでも有効にしたい場合は、次の行をconfig.hファイルに追加します。

#define ENABLE_IPV6 1

2) 次に、MATLAB で MEX 関数をコンパイルします。

  • MEX 関数の C ソースを含むフォルダーに移動します。
  • liblo.lib前の手順からこのディレクトリにコピーします。pthreadVC2.libまた、pthreads ライブラリからコピーします。
  • 以下を使用して各関数をコンパイルします。

    mex -largeArrayDims -I../path/to/liblo-0.27 xxxxxx.c pthreadVC2.lib liblo.lib -lwsock32 -lws2_32 -liphlpapi
    
  • ソース ファイル*.mexw32ごとに6 つのファイルが作成されるはずです。xxxxxx.c

  • 最後に、pthreads DLL をこの同じフォルダーにコピーします。pthreadVC2.dll

いくつかの問題を回避するために、VS2010 を使用して WinXP 32 ビットおよび Win8 64ビットでビルドされたコンパイル済み MEX ファイルを次に示します。自分でコンパイルする場合のソースは次のとおりです (単に VS2010 でソリューションをビルドしてからosc_make.m、MATLAB で実行します)。

于 2013-06-16T17:56:13.957 に答える