Max-MSP
TouchDesigner
JUCE

JUCEアプリでOSCをセンドする

JUCE

JUCE (Jules' Utility Class Extensions)を使って簡単なOSCセンドアプリを作る備忘録

JUCE使ってマルチタッチ情報をOSCで送信してみた。
ROLI-Lightpad-Block MultiTouch to OSC. https://youtu.be/ksqfD9LUVe8

IMAGE ALT TEXT HERE

対象

  • JUCEをインストールしたばかりの人
  • OSCを送るアプリを作ってみたい人
  • Macユーザーで、XCodeちょっと触れる
  • C++よくわからない(またはちょっとできる)

OSCって?

OSC(Open Sound Control)を送信するアプリがあれば
Max7とかTouchDesignerとかその他アプリ(Unityなど)とかでも
とても簡単にアプリケーション間の通信ができます。

基本的には演奏情報送信のためのものなので、結構雑な情報のやりとりになるけど、
とにかく簡単に処理が書けるのが特徴です。

手順 JUCE超入門

GUI Applicationを選択

image.png
JUCEをインストールして起動するとこんな画面なのでとりあえず左上のGUI Applicationのところを押す。

ProjectNameをつける

image.png

ここでは「OSCSendTest」って名前に変更
右下の「Create」ボタンを押す

プロジェクトができる

image.png
プロジェクトができるので、これをビルドしてみましょう。

右上のXCodeアイコンを押すと

image.png
こんな感じのXCodeプロジェクトができる。

左上の三角の再生ボタンを押して実行すると

image.png

Hello World!
なウィンドウがでてきます。

OSCのモジュール追加

image.png
JUCEに戻って
左側のModulesをダブルクリックして、プラスボタンを押して「juce_oscを選ぶ」

image.png

Modulesにjuce_oscが追加される。
image.png

OSCを飛ばすように書き換える

ヘッダーに追加

image.png

MainComponent.h
private:
    //==============================================================================
    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent)
    OSCSender sender;
};

このOSCSender senderというのをここに書く。

image.png

MainComponent.cpp
MainContentComponent::MainContentComponent()
{
    setSize (600, 400);

    if(! sender.connect("127.0.0.1",9001))
        printf("Error:could not connect to UDP port 9001.");
}

これで127.0.0.1 (自分のPCのIP)のポート9001に接続しようとします。失敗するとログにエラーメッセージがでます。
すでにそのポートを握っているアプリが他にあったらエラーになります。

メッセージを送る

image.png

MainComponent.cpp
void MainContentComponent::paint (Graphics& g)
{
    // (Our component is opaque, so we must completely fill the background with a solid colour)
    g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId));

    g.setFont (Font (16.0f));
    g.setColour (Colours::white);
    g.drawText ("Hello World!", getLocalBounds(), Justification::centred, true);

    if(! sender.send ("/test",(float) 123.456))
        g.drawText("Error:could not connect to UDP port 9001.",20,60,200,40,true);
}

この sender.sendで送ってます。
これを実行(右上のXCodeボタン押して再生ボタン押す)すると

image.png

Maxで受け取った例。
こんな感じで、OSCが送れます。

image.png

TouchDesignerだとこんな感じ。

注意

受け取りPortが他のアプリで使われているとうまく送れないので注意。
例えば、同じIPで同じPortで受け取れるアプリは一つっぽいので、
複数アプリ起動時にうまく送れないとかある。 
この場合はPortを変更するなど対応すればいい。

ここから先は

image.png

JUCE/examplesにOSC関連のサンプルがあるのでそれを動かしてみるなど。

以上

おまけ

2017年11月18日土曜にJUCEのもくもく会
「JUCE超入門」「第20回エフェクターミニハッカソン」をやる予定です。