Posted at
ArduinoDay 15

ArduinoOSCを使ってOSC通信をしてみる

More than 1 year has passed since last update.


ArduinoOSCを使ってOSC通信をしてみる


まずは結論

ArduinoOSC ってやつを作りました。


OSCってなに

詳細はWikipediaをご覧ください。


簡単に言うと


  • 主にUDPの通信プロトコル

  • 主にLAN内で、リアルタイム性の高い短いメッセージをやりとりする

  • 音楽、インタラクティブアート系のソフトウェアの通信によく使われる

いろんなアプリケーション間で通信するのにとても便利で重宝します。

こちらの記事の言い回しを真似させてもらいました。


Arduinoで使える有名なライブラリ



  • OSC


    • OSCのプロトコルを開発したCNMATの純正のやつ

    • 詳細省きますが、エンコード・デコードやSLIP-SERIALが一手間で、だるい




  • ArdOSC


    • Arduino UNOなど + Ethernetシールドを前提としたOSCライブラリ

    • つまりW5100が必須



とかです。

OSCのパケット構造は、Unityですがこちらの記事の「OSCについて」の項目でざっくりわかりやすく説明してくれています。openFrameworksではこちらもどうぞ openFramewoks – OSC (Open Sound Control) を利用したネットワーク連携


動機


  • ESPとかいろんなプラットフォームで、Ethernetシールドなしでもサクッと使いたい

  • シリアルでOSC (っぽい感じで) 使いたい


方針をきめて、つくる

まずは ArdOSC をベースにして、拡張しよう!

おっこのソースコード修正だいぶつr

ArduinoOSC

なんとかできました(ちょっとまだシリアルでの動作が不安定です。。。)


特徴


  • ESPなどのWiFi、EthernetでのUDP、シリアルなどで使える

  • 簡単にOSCに使えるアプリ・フレームワークからサクッと送受信できる


    • Max, Pd, Processing, openFrameworks, P5.js など (例としてMaxのサンプルがあります)



  • シリアルでも同じ感覚で使える (エセですが)


制限とTODO


  • 現状 int32, float, String のメッセージのみ対応、拡張予定

  • シリアル用エセ拡張はまだMaxのみ、自分が必要なときに随時追加予定

  • あまりいないと思いますが、シリアル拡張ほしいアプリあればコメントください


使い方


UDP (例としてESPのWiFi)

#include <ArduinoOSC.h>


void setup()
{
// もろもろWiFi系のsetup

osc.begin(udp, recv_port);
osc.addCallback("/ard/aaa", &callback);
osc.addCallback("/ard", &callback);
}

void loop()
{
osc.parse();
}

void callback(OSCMessage& m)
{
//create new osc message
OSCMessage msg;
//set destination ip address & port no
msg.beginMessage(host, send_port);
//set argument
msg.setOSCAddress(m.getOSCAddress());
msg.addArgInt32(m.getArgAsInt32(0));
msg.addArgFloat(m.getArgAsFloat(1));
msg.addArgString(m.getArgAsString(2));
//send osc message
osc.send(msg);
}


シリアル版

#include "ArduinoOSC.h"


ArduinoOSC<HardwareSerial> osc; // Arduino Uno, ESP
// ArduinoOSC<usb_serial_class> osc; // teensy (via USB Serial)

void setup()
{
osc.begin(Serial, 115200);
osc.addCallback("/ard/aaa", &callback);
}

void loop()
{
osc.parse();
}

void callback0(OSCMessage& m)
{
// get & send same osc data back

//create new osc message
OSCMessage msg;
msg.beginMessage();

//set argument
msg.setOSCAddress(m.getOSCAddress());
msg.addArgInt32(m.getArgAsInt32(0));
msg.addArgFloat(m.getArgAsFloat(1));
msg.addArgString(m.getArgAsString(2));

//send osc message
osc.send(msg);
}


まとめ

OSC最高ですね。シリアルでも (エセですが) 使えて楽ちんですね。

OSC使ったことない方も、ぜひこの機会につかってみてください。

プルリク・Issue・コメントおまちしています!

(はやくシリアルも安定稼働させます、、、)