■ 概要
本記事では、「OSC」とは何か?というそもそもの概念と
またOSC通信でできることをざっくりまとめてみました。
■ 環境
「OSC」とは
OpenSound Control(OSC)とは、電子楽器(特にシンセサイザー)や
コンピュータなどの機器において音楽演奏データをネットワーク経由で
リアルタイムに共有するための通信プロトコルである。
(引用:Wikipedia「OpenSound Control」)
とのことで、もともとは電子楽器のコンピュータ制御などの連携を目的として開発されたものでした。
「MIDI」(Musical Instrument Digital Interface)の次世代のプロトコルとして、
インターネットで用いられている通信方式(TCP、UDP)を活用することで
さまざまなハードウェア、ソフトウェア間での幅広く柔軟な連携を可能にしています。
↓
OSCはネットワーク経由のため、ブロードバンドの通信速度を最大限に活かせるため
リアルタイム性に優れている。またMIDIのように専用機器を必要としないため、
映像系やWeb系ツールなどマルチメディア全体での連携手段として利便性がある。
また、アプリケーション開発においてもさまざまなプログラミング環境で
ライブラリが用意されており、比較的柔軟な転送データを使用するため
異なる開発環境のアプリケーション同士で情報のやり取りをしたい、といった場合にも非常に便利。
(「Sound」とは名ばかりで、音楽以外のさまざまな用途で使用されている。)
■ 「OSCメッセージ」 と 「OSC引数」
OSCのプロトコルはざっくり
1.「OSCメッセージ」(OSC Message、またはアドレスともいう)
2.「OSC引数」(OSC Arguments、または単に、データともいう)
の2つのパートに分けられます。
・ OSCメッセージ
OSCメッセージは、URLと良く似た形で階層構造を持つことが可能で
その階層をスラッシュ(「 / 」)で区切って通信する情報内容をラベリングします。
例を挙げると、「画面タップの情報」をOSCで送受信する際に
・座標
・タップの状態
の2つの情報を送りたい場合、
その2つを「tap」というメッセージでまとめて、
下層メッセージとして「position」と「state」を仮定します。
その場合
・座標 → 「/tap/position」
・タップの状態 → 「/tap/state」
といったメッセージとして階層的に表現することができます。
このようにOSCメッセージ、アドレスの階層構造は
用途に応じて自由にデザインすることが可能です。
・ OSC引数
OSC引数には実際の値を設定します。
値は
・整数 ( int32 )
・実数 ( float )
・文字列 ( string )
・byte配列 ( byte[] )
など様々な型を送受信することができ、
また複数の値を一度に設定することも可能です。
例を挙げると
・/tap/position
360.03
920.35
→「OSCメッセージ(階層構造のラベリング)
、x座標(float)
、y座標(float)
」
■ 「TCP」 と 「UDP」
OSCは「OSI参照モデル」における「アプリケーション層」
(アプリケーションが提供する機能やデータフォーマット、通信手順の規定)
の仕組みを提供するプロトコルです。
実際の通信の制御には「UDP」のプロトコルを利用します。
( 対応するプロトコルとして「TCP」がありますが、
OSCにおいては「UDP」のプロトコルが使われることがほとんどです)
TCPとUDPはどちらもOSI参照モデルにおける「トランスポート層」
(データ転送の信頼性を確保する規定)
の仕組みを提供するプロトコルです。
TCPとUDPには、それぞれ動作の仕組みに特徴があります。
・ TCP
TCP(Transmission Control Protocol)の通信は、
データを正確に通信するための仕組みを多く備えている
信頼性が高い通信プロトコルです。
TCPとIP(Internet Protocol)という2種類のプロトコルによって構成されています。
IPは、IPアドレスを元に通信先を指定し、データをIPパケットにして届けるためのプロトコルです。
基本的にTCPとセットで使われています。
TCPはIPアドレスの上位で動くプロトコルです。
IPアドレスを利用した通信の中で、通信の工程を制御しています。
( データを送信するタイミングを調整する。届けられたデータを順番通りに復元する。などなど)
TCPは始めに、通信するコンピューター同士がコネクションを
確立してからデータの送受信を開始する「コネクション型」の通信方式を採用しています。
コネクションとは、送受信側がお互いに通信可能かを確認し合うような仕組みです。
TCPは通信相手とのコネクションを確立してからデータの転送を開始するため、
データを通信相手に確実に届けられることが保証されています。
・ UDP
UDP(User Datagram Protocol)の通信は、必要最低限の通信量で
データを送受信できることを目的としています。
TCPのように通信するコンピューター同士でコネクションを確立せず、
送信先のコンピューターに対してデータを一方的に送り続けます。
またデータが正しく届けられたことを確認するための通信も行いません。
( 送信したコンピューターは、送ったデータが受信相手に正確に届いているかを知る手段がなく、
また受信したコンピューターも、受け取ったデータが正しいことを前提に処理を進めます。)
UDPは通信速度を重視し、データが正確に転送されたかを担保するための通信を行わないため、
高速にデータ転送ができます。そのためUDPはデータを送受信するコンピューター同士が
リアルタイムにデータ通信をおこなうケースに用いられる場合が多いです。
例えば、動画配信のケースでは音声や動画などの大容量のデータを送信し、
リアルタイムに再生をおこなう必要があります。UDPの通信では
一部のデータが欠損していても音声や動画が乱れるだけで、動画の再生が継続されます。
→ OSCはTCP/IPを使うこともありますが、
リアルタイム性のメリットを活かすためにUDPを使用するケースが多い
■ 最後に
特にデバイス間でのデータの連携ではケーブルを繋いでデータ転送をするイメージが強かったですが、
ハードウェア、ソフトウェア間でデータを連携したい。という目的において本当に様々な形で応用して
使うことができそうだなと思いました。
最後まで読んでいただきありがとうございました。