Open Sound Control 1.0仕様

バージョン 1.0, 2002年3月26日, Matt Wright

導入

Open Sound Control (OSC)は、コンピュータ、サウンド シンセサイザ、その他のマルチメディアデバイスの通信用に開発された、オープンで、トランスポート独立で、メッセージ指向のプロトコルである。

OSCの文法

このセクションではOSCデータの文法を定義する。

アトミックデータ型

全てのOSCデータは以下の基礎データ型のいずれかによって構成される:

int32
32ビット、ビッグエンディアン、2の補数による整数型
OSC-timetag
64ビット、ビッグエンディアン、固定小数点による時刻タグ(以下で意味を規定)
float32
32ビット、ビッグエンディアン、IEEE754浮動小数点数
OSC文字列 (OSC-string)
nullを終端とする非null ASCII文字の列。0~3個のnull文字をとり、32の倍数ビットに揃えられる。(OSC文字列の例) このドキュメントでは、例示されるOSC文字列はnull文字を終端とせず、二重引用符によって囲まれている。
OSC-blob
int32サイズの大きさを有し、8ビットの整数倍となる任意のバイナリデータ。0~3個の0バイトをとり、32の倍数ビットに揃えられる。

OSCの全てのアトミックデータ型のサイズは、32ビットの倍数となる。この事実により、もしOSCデータのブロックの先頭が32ビット境界にあれば、全てのOSCデータにおける数値が32ビットに揃えられることが保証される。

OSCパケット

OSCの転送単位はOSCパケットである。OSCパケットを送信するアプリケーションはOSCクライアントである。OSCパケットを受信するアプリケーションはOSCサーバである。

OSCパケットは、バイナリデータの連続ブロックであるコンテンツと、8ビット バイトの整数で表されるサイズからなる。 OSCパケットのサイズは常に4の倍数となる。

OSCパケットを配信する下位ネットワークが、OSCアプリケーションにコンテンツとサイズの両方を配信する責務を負う。 OSCパケットは、UDPのようなネットワークプロトコルによって、データグラムとして自然に表現される。TCPのようなストリームベースのプロトコルでは、ストリームはint32で最初のパケットを送り、最初のパケットの内容を続け、次のパケットのサイズを送る…といった順序で行われることになろう。

OSCパケットのコンテンツは、OSCメッセージまたはOSCバンドルである。パケットのコンテンツの1バイト目が、この2種類を明確に区別する。

OSCメッセージ

OSCメッセージは、OSCアドレスパターンOSC型タグ文字列、任意の数のOSC引数からなる。

備考: OSCの古い実装のいくつかは、OSC型タグ文字列を省略することがある。そのような実装が全てアップデートされるまで、OSC実装はそのようなOSC型タグ文字列の欠落に耐えるよう作成されるべきである。

OSCアドレスパターン

OSCアドレスパターンは、'/' 文字(前方向スラッシュ)で始まるOSC文字列である。

OSC型タグ文字列

OSC型タグ文字列は、','(コンマ)で始まり、そのメッセージのOSC引数に一致する数の文字の列で続けられる、OSC文字列である。 コンマ以降の各文字はOSC型タグと呼ばれ、OSC引数に対応する型を表す。 (OSC型タグ文字列がコンマで始まるという要件は、OSCメッセージにOSC型タグ文字列が欠落しているかどうかを、メッセージ受信者が判別するために有用なものである。)

この表では、OSC型タグと対応するOSC引数の型の対応を示す:

各OSC型タグの意味
OSC型タグ 対応する引数の型
i int32
f float32
s OSC文字列
b OSC-blob

OSCのアプリケーションには、この仕様で規定されていない、追加の非標準引数型を用いて通信するものがある。OSCアプリケーションは、これらの型を認識しなくてもよい。OSCアプリケーションは、OSC型タグ文字列のうちに認識できないOSC型タグを含むようなメッセージを、破棄すべきである。 追加の引数型を使用するアプリケーションは、次の表に示すOSC型タグを用いてそれらをエンコードしなければならない:

ある種の非標準引数型に用いられるOSC型タグ
OSC型タグ 対応する引数型
h 64ビット、ビッグエンディアン、2の補数による整数
t OSC時刻タグ
d 64ビット(倍精度)IEEE 754浮動小数点数
S OSC文字列として表現される型(例えば、"symbols" を "strings"と区別するシステム)
c 32ビットで送信されるASCII文字
r 32ビットのRGBA色
m 4バイトMIDIメッセージ. MSBからLSBの順に: ポートID、ステータスバイト、データ1、データ2
T 真。引数データ バイトには何も確保されない。
F 偽。引数データ バイトには何も確保されない。
N Nil値。引数データ バイトには何も確保されない。
I 無限。引数データ バイトには何も確保されない。
[ Indicates the beginning of an array. The tags following are for data in the Array until a close brace tag is reached.
] Indicates the end of an array.

OSC型タグ文字列の例

OSC引数

OSC引数の列は、それぞれの引数のバイナリ表現の連続列として表現される。

OSC バンドル

OSCバンドルは、順に、OSC文字列 "#bundle"、OSC時刻タグ、任意の数のOSCバンドル要素から成る。OSC時刻タグは、64ビットの固定小数点時刻タグであり、その意味は以下で説明する

1つのOSCバンドル要素は、サイズコンテンツからなる。 サイズは8ビットバイトの数を表すint32であり、常に4の倍数となる。 コンテンツは1つのOSCメッセージまたは1つのOSCバンドルとなる。

再帰的な定義であることに注意: バンドルにはバンドルが含まれうる。

この表は、2つ以上の要素を有するOSCバンドルの部分とそれぞれのサイズを8ビットバイトで示している。

OSCバンドルの部分
データ サイズ 目的
OSC文字列 "#bundle" 8バイト これがバンドルであることを認識する手段
OSC時刻タグ 8バイト このバンドル全体に適用される時刻タグ
最初のバンドル要素のサイズ int32 = 4バイト 最初のバンドル要素
最初のバンドル要素の内容 「最初のバンドル要素のサイズ」で指定されたバイト数
2番目のバンドル要素のサイズ int32 = 4バイト 2番目のバンドル要素
2番目のバンドル要素の内容 「2番目のバンドル要素のサイズ」で指定されたバイト数
etc.   さらなるバンドル要素

OSCのセマンティクス

このセクションではOSCデータのセマンティクス(意味)を定義する。

OSCアドレス空間とOSCアドレス

全てのOSCサーバには、OSCメソッドの集合が含まれる。 OSCメソッドは、OSCサーバが受信したOSCメッセージの潜在的な目的地であり、アプリケーションが利用可能にしている、それぞれの制御点に該当する。OSCメソッドを「呼び出す」というのは、プロシージャ コールに類するものである。メソッドと引数を渡して、そのメソッドを実行するということを意味するものといえる。

OSCサーバに含まれるOSCメソッドは、OSCアドレス空間と呼ばれるツリー構造に並べられる。このツリーのリーフノードはOSCメソッドであり、ブランチノードはOSCコンテナと呼ばれる。 OSCサーバのOSCアドレス空間は動的なものでありうる。つまり、そのコンテンツおよび形体は、時間とともに変化しうる。

ツリーのルート以外の各OSCメソッドおよび各OSCコンテナには、以下のものを除く印刷可能文字のASCII文字列からなるシンボル名がある:

OSCメソッドおよびOSCコンテナで許容されないASCII印刷可能文字
文字 名前 ASCIIコード (整数)
' ' 空白 32
# ナンバーサイン(いげた) 35
* アスタリスク 42
, コンマ 44
/ 前方向スラッシュ 47
? 疑問符 63
[ 開き角括弧 91
] 閉じ角括弧 93
{ 開き中括弧 123
} 閉じ中括弧 125

OSCメソッドのOSCアドレスは、OSCアドレス空間における、OSCメソッドの完全パスにおけるシンボル名であり、ツリーのルートから始まる。 OSCメソッドのOSCアドレスは、文字 '/' (前方向スラッシュ)から始まり、OSCメソッドへのツリーのルートからの経路となるべく全コンテナの名前が順番に続き、前方向スラッシュ文字で区切られ、OSCメソッドの名前が続く。OSCアドレスの文法は、URLの文法に適合するように選ばれている。(OSC アドレスの例)

OSCメッセージのディスパッチとパターンマッチング

OSCサーバがOSCメッセージを受信すると、そのOSCメッセージのOSCアドレスパターンに基づいて、OSCアドレス空間における適切なOSCメソッドを呼び出さなければならない。 このプロセスは、OSCアドレスパターンにマッチするOSCメソッドへのOSCメッセージのディスパッチと呼ばれる。マッチする全てのOSCメソッドは、同一の引数データ(すなわちそのOSCメッセージのOSC引数)により呼び出される。

OSCアドレスのパートあるいはOSCアドレスパターンは、連続する前方向スラッシュ文字と最後の前方向スラッシュ文字に続く部分文字列のペアの間の部分文字列である。 ()

受信したOSCメッセージは、現在のOSCアドレス空間にあるOSCメソッドで、そのOSCメッセージのOSCアドレスパターンにOSCアドレスがマッチするもの全てに、ディスパッチされなければならない。OSCアドレスパターンは、以下の条件でOSCアドレスにマッチするものとされる

  1. そのOSCアドレスとOSCアドレスパターンが同数のパートを含み、
  2. そのOSCアドレスパターンの各パートが、対応するOSCアドレスのパートにマッチする

あるOSCアドレスパターンに含まれる全ての連続的な文字が、あるOSCアドレスの連続的な部分文字列にマッチし、OSCアドレスに含まれる全ての文字がそのOSCアドレスパターンのどこかにマッチする場合に、そのOSCアドレスパターンのパートは、そのOSCアドレスにマッチする。 OSCアドレスパターンに含まれる文字のマッチング規則は次の通りである:

  1. '?' がOSCアドレスパターンに含まれる場合は、任意の1文字とマッチする
  2. '*' がOSCアドレスパターンに含まれる場合は、任意数の文字の列とマッチする
  3. 角括弧文字にくくられた文字列(例. [string])がOSCアドレスパターンに含まれる場合は、その文字列に含まれる任意の文字とマッチする角括弧の中では、マイナス記号 (-) とエクスクラメーションマーク (!) には特別な意味がある:
  4. 中括弧で囲まれたカンマ区切り文字列 (例: "{foo,bar}") がOSCアドレスパターンに含まれる場合は、そのリストに含まれる任意の文字列にマッチする。
  5. その他の文字がOSCアドレスパターンに含まれる場合は、同一の文字にのみマッチする。

OSC時刻タグの時間的なセマンティクス

OSCサーバは正確な現在時刻の表現にアクセスできなければならない。OSCはクロック同期のメカニズムを提供しない。

OSCパケットが単一のOSCメッセージのみを受信した時、OSCサーバは対応するメソッドを直ちに(すなわち、パケットを受信し次第可及的速やかに)呼び出すべきである。 そうではなく、受信したOSCパケットにOSCバンドルが含まれていた場合、OSCバンドルのOSCメッセージで対応するOSCメッセージを呼び出すべきタイミングは、そのOSCバンドルのOSC時刻タグが決定する。 もしそのOSC時刻タグで表された時刻が現在時刻以前であれば、そのOSCサーバは(そのOSCサーバに到着が遅すぎたメッセージを破棄するよう、ユーザが設定していない限り)該当するメソッドを直ちに呼び出すべきである。 そうではなく、OSC時刻タグが未来の時刻を表していた場合、そのOSCサーバはそのOSCバンドルを指定時刻まで保持しておき、それから適切なOSCメソッドを呼び出さなければならない。

時刻タグは64ビット固定小数点で表現される。最初の32ビットは1900年1月1日からの経過秒数を指定し、残り32ビットは200ピコ秒精度での小数部分を指定する。 これはインターネットNTPタイムスタンプで使用されている表現である。63個の0のビットと最後の1のビットからなる時刻タグ値は「直ちに」という特別な意味を表す。

同一のOSCバンドルに含まれるOSCメッセージはアトミックと呼ばれる。その対応するOSCメソッドは、あたかもそのOSCメソッド呼び出しの間に他の処理が存在しないかのように、間を空けずに呼び出されるべきである。

OSCアドレスパターンが複数のOSCメソッドにディスパッチされる時、マッチするOSCメソッド群が呼び出される順序は不定とする。OSCバンドルに複数のOSCメッセージが含まれる時、そのOSCメッセージに含まれるOSCメソッドの集合は、そのパケットに含まれるOSCメッセージの出現と同一の順序で呼び出されなければならない。()

バンドルが他のバンドルを含む場合、包含されるほうのバンドルのOSC時刻タグは、包含するほうのバンドルのOSC時刻タグ以上の値でなければならない。同一のOSCバンドルに含まれるOSCメッセージのアトミック性の要件は、OSCバンドルに含まれるOSCバンドルについては当てはまらない。