バージョン 1.0, 2002年3月26日, Matt Wright
Open Sound Control (OSC)は、コンピュータ、サウンド シンセサイザ、その他のマルチメディアデバイスの通信用に開発された、オープンで、トランスポート独立で、メッセージ指向のプロトコルである。
このセクションではOSCデータの文法を定義する。
全てのOSCデータは以下の基礎データ型のいずれかによって構成される:
OSCの全てのアトミックデータ型のサイズは、32ビットの倍数となる。この事実により、もしOSCデータのブロックの先頭が32ビット境界にあれば、全てのOSCデータにおける数値が32ビットに揃えられることが保証される。
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型タグ | 対応する引数の型 |
i | int32 |
f | float32 |
s | OSC文字列 |
b | OSC-blob |
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文字列 "#bundle"、OSC時刻タグ、任意の数のOSCバンドル要素から成る。OSC時刻タグは、64ビットの固定小数点時刻タグであり、その意味は以下で説明する。
1つのOSCバンドル要素は、サイズとコンテンツからなる。 サイズは8ビットバイトの数を表すint32であり、常に4の倍数となる。 コンテンツは1つのOSCメッセージまたは1つのOSCバンドルとなる。
再帰的な定義であることに注意: バンドルにはバンドルが含まれうる。
この表は、2つ以上の要素を有するOSCバンドルの部分とそれぞれのサイズを8ビットバイトで示している。
データ | サイズ | 目的 |
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コンテナには、以下のものを除く印刷可能文字の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アドレスパターンに含まれる全ての連続的な文字が、ある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メソッドを呼び出さなければならない。
時刻タグは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バンドルについては当てはまらない。