私は以前にPureDataや OSC を使用したことがなく、サーバー/クライアントを作成するために示したグラフ/パッチを複製しただけです。
1) PureData のサーバー、MATLAB のクライアント:
まず、PureData でサーバーを作成します。
次に、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
スライダーを動かすと、メッセージが ( 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 でクライアントを作成します。
ここでも、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
サーバーの部分は、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 関数をコンパイルします。
いくつかの問題を回避するために、VS2010 を使用して WinXP 32 ビットおよび Win8 64ビットでビルドされたコンパイル済み MEX ファイルを次に示します。自分でコンパイルする場合のソースは次のとおりです (単に VS2010 でソリューションをビルドしてからosc_make.m
、MATLAB で実行します)。