アプリにOSCプロトコルを実装する
Open Sound Controlプロトコルを利用して、複数のアプリケーションをネットワークで接続する方法をご紹介します。アプリケーション間のインタラクションデータの送受信
レベル:中級
プラットフォーム:Windows, macOS, Linux, iOS, Android
クラス: OSCSender,OSCReceiver,OSCReceiver::Listener,OSCReceiver::ListenerWithOSCAddress,OSCMessage,OSCBundle
スタート
このチュートリアルにはいくつかのデモ・プロジェクトがあります。これらのプロジェクトのダウンロード・リンクは、チュートリアルの関連セクションに記載されています。
各セクションのこのステップでヘルプが必要な場合は、以下を参照してください。Tutorial: Projucer Part 1: Getting started with the Projucer.
デモ・プロジェクト
このチュートリアルで提供されるデモ・プロジェクトは、OSCとのインタラクションに必要な様々なアプリケーションを紹介します。要約すると、これらのアプリケーショ ンは以下の通りです:
- OSCセンダー:センダーアプリケーションにはロータリーノブがあり、他のインスタンスに情報を送信する。
- OSCレシーバー:レシーバー・アプリケーションは、センダー・インスタンスに接続し、情報を受信して処理・表示する。
- OSCモニター:モニター・アプリケーションも送信者インスタンスに接続するが、より正確にやりとりをモニターし、ログに記録する。
このチュートリアルが正しく機能するためには、送信側と受信側/モニター側のアプリケーションを同時に1つだけ開く必要があります。
ここで紹介するコードは、JUCE ExamplesのOSCデモアプリとほぼ同様です。
OSCトランスミッター
このセクションのデモ・プロジェクトのダウンロードはこちら から:PIP|ZIP.プロジェクトを解凍し、最初のヘッダーファイルをProjucerで開く。
完成すると、OSCセンダー・アプリケーションは1つのロータリー・ノブを表示し、起動時にそれを操作できるようになる:

OSCトランスミッターの実装
まずは送信者アプリケーションの実装から始めよう。
の中でMainContentComponent
クラスでは、まずこのアプリケーションのプライベート・メンバー変数を次のように宣言する:
juce::Slider rotaryKnob; // [1]
juce::OSCSender sender; // [2]
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent)
};
追加Sliderオブジェクトを使用してユーザーのインタラクションをキャプチャします。[1]そしてOSCSenderオブジェクトを後でレシーバーに接続する[2]。
クラスのコンストラクタで、スライダー・パラメータを設定し、以下のようにネットワークへの接続を試みる:
MainContentComponent()
{
rotaryKnob.setRange (0.0, 1.0);
rotaryKnob.setSliderStyle (juce::Slider::RotaryVerticalDrag);
rotaryKnob.setTextBoxStyle (juce::Slider::TextBoxBelow, true, 150, 25);
rotaryKnob.setBounds (10, 10, 180, 180);
addAndMakeVisible (rotaryKnob); // [3]
// specify here where to send OSC messages to: host URL and UDP port number
if (! sender.connect ("127.0.0.1", 9001)) // [4]
showConnectionErrorMessage ("Error: could not connect to UDP port 9001.");
setSize (200, 200);
}
- [3]スライダーの範囲、スタイル、境界を設定しComponentをこのクラスに加える。
- [4]ここではローカルホストまたはIPアドレス "127.0.0.1 "をUDPポート番号9001で呼び出す。
connect()
関数を使用する。OSCSenderオブジェクトを呼び出します。接続に失敗した場合は、プライベート関数showConnectionErrorMessage()
エラーメッセージをユーザーに表示するために、後で宣言する。
このチュートリアルでは、後でレシーバーで指定する任意のポート番号で、開発マシンのローカル・ネットワークに接続する。
次にSlider::onValueChangeコールバックSliderオブジェクトを作成し、OSCメッセージをレシーバー・アプリケーションに送信する:
rotaryKnob.onValueChange = [this]
{
// create and send an OSC message with an address and a float value:
if (! sender.send ("/juce/rotaryknob", (float) rotaryKnob.getValue()))
showConnectionErrorMessage ("Error: could not send OSC message.");
};
ラムダ関数の中でsend()
関数を使用する。OSCSenderオブジェクトのアドレスとロータリーノブの値[5].ここで"/juce/rotaryknob "として提供されるアドレスは、後で受信機でメッセージを分類することを可能にする。メッセージの送信に失敗した場合は、同じヘルパー関数showConnectionErrorMessage()
をクリックするとエラーが表示されます。
この機能を実装するには、関数[AlertWindow::showMessageBoxAsync()](https://docs.juce.com/master/classAlertWindow.html#abf9c608d6e03ddf828fa9629cff1418b "Shows a dialog box that just has a message and a single button to get rid of it.")
:
void showConnectionErrorMessage (const juce::String& messageText)
{
juce::AlertWindow::showMessageBoxAsync (juce::AlertWindow::WarningIcon,
"Connection error",
messageText,
"OK");
}
これで送信側の実装は完了した。
この修正版のソースコードはOSCSenderTutorial_02.h
ファイルにある。
OSCレシーバー
このセクションのデモ・プロジェクトのダウンロードはこちらから:PIP|ZIP.プロジェクトを解凍し、最初のヘッダーファイルをProjucerで開く。
完成すると、OSCレシーバー・アプリケーションは、起動時に操作できない1つのロータリー・ノブを表示する:

OSCレシーバーの実装
レシーバーを実装するにはSliderオブジェクトMainContentComponent
クラスで、送り手のロータリー・ノブで行った変更を反映させる:
//==============================================================================
juce::Slider rotaryKnob;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent)
};
を宣言する代わりにOSCSenderオブジェクトをメンバーとして継承する。OSCReceiverのサブクラスとしてMainContentComponentを実装する。[1]:
class MainContentComponent : public juce::Component,
private juce::OSCReceiver, // [1]
private juce::OSCReceiver::ListenerWithOSCAddress // [2]
{
public:
また、メッセージ受信時にコールバックを受け取るために、OSCReceiver::ListenerWithOSCAddress<OSCReceiver::MessageLoopCallback>を継承する必要があります。[2]。