LoginSignup
11
6

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-02-06

■ 概要

本記事では、「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を使用するケースが多い

■ 最後に

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

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

11
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
6