OSCとは？OSC通信についてまとめてみた

# ■ 概要
本記事では、「OSC」とは何か？というそもそもの概念と
またOSC通信でできることをざっくりまとめてみました。

# ■ 環境

「OSC」とは

>OpenSound Control（OSC）とは、電子楽器（特にシンセサイザー）や
コンピュータなどの機器において音楽演奏データをネットワーク経由で
リアルタイムに共有するための通信プロトコルである。

(引用：[Wikipedia「OpenSound Control」](https://ja.wikipedia.org/wiki/OpenSound_Control))

とのことで、もともとは電子楽器のコンピュータ制御などの連携を目的として開発されたものでした。

「MIDI」<font color="gray">*(Musical Instrument Digital Interface)*</font>の次世代のプロトコルとして、
インターネットで用いられている通信方式<font color="gray">*(TCP、UDP)*</font>を活用することで
さまざまなハードウェア、ソフトウェア間での幅広く柔軟な連携を可能にしています。

↓

*OSCはネットワーク経由のため、ブロードバンドの通信速度を最大限に活かせるため
リアルタイム性に優れている。またMIDIのように専用機器を必要としないため、
映像系やWeb系ツールなどマルチメディア全体での連携手段として利便性がある。*

*また、アプリケーション開発においてもさまざまなプログラミング環境で
ライブラリが用意されており、比較的柔軟な転送データを使用するため
異なる開発環境のアプリケーション同士で情報のやり取りをしたい、といった場合にも非常に便利。*

<font color="gray">*（「Sound」とは名ばかりで、音楽以外のさまざまな用途で使用されている。）*</font>

# ■ 「OSCメッセージ」 と 「OSC引数」

OSCのプロトコルはざっくり

**1.「OSCメッセージ」（OSC Message、またはアドレスともいう）**
**2.「OSC引数」（OSC Arguments、または単に、データともいう)**

の2つのパートに分けられます。

## ・ OSCメッセージ

OSCメッセージは、URLと良く似た形で階層構造を持つことが可能で
その階層を<strong>スラッシュ</strong><font color="gray">*（「 / 」）*</font>で区切って通信する情報内容をラベリングします。

例を挙げると、「画面タップの情報」をOSCで送受信する際に

・座標
・タップの状態

の2つの情報を送りたい場合、
その2つを<strong>「tap」</strong>というメッセージでまとめて、
下層メッセージとして<strong>「position」</strong>と<strong>「state」</strong>を仮定します。

その場合

**・座標　→　「/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参照モデル」](https://www.itmanage.co.jp/column/osi-reference-model/)における<strong>「アプリケーション層」</strong>
<font color="gray">*（アプリケーションが提供する機能やデータフォーマット、通信手順の規定）*</font>
の仕組みを提供するプロトコルです。

実際の通信の制御には<strong>「UDP」</strong>のプロトコルを利用します。

<font color="gray">*（ 対応するプロトコルとして「TCP」がありますが、
　 OSCにおいては「UDP」のプロトコルが使われることがほとんどです）*</font>

TCPとUDPはどちらもOSI参照モデルにおける<strong>「トランスポート層」</strong>
<font color="gray">*（データ転送の信頼性を確保する規定）*</font>
の仕組みを提供するプロトコルです。

TCPとUDPには、それぞれ動作の仕組みに特徴があります。

## ・ TCP

TCP<font color="gray">*（Transmission Control Protocol）*</font>の通信は、
データを正確に通信するための仕組みを多く備えている
信頼性が高い通信プロトコルです。

TCPとIP<font color="gray">*（Internet Protocol）*</font>という2種類のプロトコルによって構成されています。

IPは、IPアドレスを元に通信先を指定し、データをIPパケットにして届けるためのプロトコルです。
基本的にTCPとセットで使われています。

TCPはIPアドレスの上位で動くプロトコルです。
IPアドレスを利用した通信の中で、通信の工程を制御しています。

<font color="gray">*（ データを送信するタイミングを調整する。届けられたデータを順番通りに復元する。などなど）*</font>

TCPは始めに、通信するコンピューター同士がコネクションを
確立してからデータの送受信を開始する「コネクション型」の通信方式を採用しています。

コネクションとは、送受信側がお互いに通信可能かを確認し合うような仕組みです。

TCPは通信相手とのコネクションを確立してからデータの転送を開始するため、
データを通信相手に確実に届けられることが保証されています。

## ・ UDP

UDP<font color="gray">*（User Datagram Protocol）*</font>の通信は、必要最低限の通信量で
データを送受信できることを目的としています。

TCPのように通信するコンピューター同士でコネクションを確立せず、
送信先のコンピューターに対してデータを一方的に送り続けます。
またデータが正しく届けられたことを確認するための通信も行いません。

<font color="gray">*（ 送信したコンピューターは、送ったデータが受信相手に正確に届いているかを知る手段がなく、
　 また受信したコンピューターも、受け取ったデータが正しいことを前提に処理を進めます。）*</font>

UDPは通信速度を重視し、データが正確に転送されたかを担保するための通信を行わないため、
高速にデータ転送ができます。そのためUDPはデータを送受信するコンピューター同士が
リアルタイムにデータ通信をおこなうケースに用いられる場合が多いです。

例えば、動画配信のケースでは音声や動画などの大容量のデータを送信し、
リアルタイムに再生をおこなう必要があります。UDPの通信では
一部のデータが欠損していても音声や動画が乱れるだけで、動画の再生が継続されます。


<strong>　→ OSCはTCP/IPを使うこともありますが、
　　リアルタイム性のメリットを活かすためにUDPを使用するケースが多い</strong>


# ■ 最後に

特にデバイス間でのデータの連携ではケーブルを繋いでデータ転送をするイメージが強かったですが、
ハードウェア、ソフトウェア間でデータを連携したい。という目的において本当に様々な形で応用して
使うことができそうだなと思いました。

最後まで読んでいただきありがとうございました。