37
SSAW08 第8回 OpenSoundControlの活用 2008年6月17日

Ssaw08 0617

Embed Size (px)

Citation preview

Page 1: Ssaw08 0617

SSAW08 第8回

OpenSoundControlの活用2008年6月17日

Page 2: Ssaw08 0617

今日の内容

• ネットワークを用いた作品を制作してみる• OSCについて• Max/MSP同士のコミュニケーション• OpenSoundControl• udpsend, udpreceive

• Max/MSPとFlashのコミュニケーション• FlashのXMLSocket通信• flashserver

• Max/MSPとProcessingのコミュニケーション• P5osc

Page 3: Ssaw08 0617

OSCとは

• カルフォルニア州立大学バークレー校のCNMAT(Center for New Music and Audio Technorogies)を中心に開発

• コンピュータ音楽のための通信プロトコル(規則)• ポストMIDI!• 詳しくは、OSCのページを参照• http://opensoundcontrol.org/

Page 4: Ssaw08 0617

MIDIの限界

• バンド幅の限界• 複雑な音楽情報を制御するには、通信帯域が狭すぎる• (31,250 bit/sec程度)

• データの遅延も無視できない程生じてしまう• 相互接続の限界• 短方向の通信しかできないので通信の方向ごとにケーブルが必要(IN, OUT, THRU)

• チャンネル数にも制限がある• 音楽記述の限界• 平均率の楽譜表現に偏ったプロトコル• 音色を記述することができない• 連続する値の変化を記述できない

Page 5: Ssaw08 0617

OSCの特徴

• 開放的・動的なネーミング手法• URL(= Uniform Resorce Locator)とよく似た考え方

• 数値、記号双方を通信できる• 高度なパターンマッチング• 高解像度の時間制御• 帯域幅の制限はしていない• 多くのソフトウェア、プログラミング言語に実装済み

Page 6: Ssaw08 0617

OSI参照モデル

• コンピュータの持つべき通信機能を階層構造に分割したモデル• 通信機能を以下の7階層に分割する• 第1層 - 物理層:電気信号の変換等• 第2層 - データリンク層:通信機器間の直接的な信号の受け渡し• 第3層 - ネットワーク層:ネットワークにおいて通信経路の選択• 第4層 - トランスポート層:ネットワークにおける通信管理• 第5層 - セッション層:通信プログラム間の通信の開始から終了までの手順

• 第6層 - プレゼンテーション層:データの表現方法• 第7層 - アプリケーション層:ユーザーが操作するインターフェース

Page 7: Ssaw08 0617

OSI参照モデル

第1層物理層

第2層データ・リンク層

第3層ネットワーク層

第4層トランスポート層

第5層セッション層

第6層プレゼンテーション層

第7層アプリケーション層

Ethernet

IP

TCP UDPhttp ftp POP

ftp ssh

OSC

Page 8: Ssaw08 0617

Max/MSPへOSCをインストール

• CNMATのダウンロードページからMax/MSPのバージョンにあわせてOSCのバージョンが異るので注意!• http://cnmat.berkeley.edu/downloads

• Max4.6以降• Mac OSX Mach-OバージョンのOpenSoundControlとOSC-routeをダウンロードする

• Max4.5• Mac OSX CFMバージョンのOpenSoundControlとOSC-routeをダウンロードする

• Max4.3以前• 古いバージョンのOpenSoundControlとotudp (UDPの送受信環境)が必要

• http://archive.cnmat.berkeley.edu/MAX/OS9.html• OpenSoundControl and UDP objects release 2.4をダウンロード

Page 9: Ssaw08 0617

OSCメッセージの送受信

• OSCメッセージの送信

Page 10: Ssaw08 0617

OSCメッセージの送受信

• OSCの送信• Max/MSP4.3以前のバージョンを使用している場合には送信部分を以下のように書き換える (これ以降のサンプルに関しても同様に)

Page 11: Ssaw08 0617

OSCメッセージの送受信

• OSCメッセージの受信

Page 12: Ssaw08 0617

OSCメッセージの送受信

• OSCの受信• Max/MSP4.3以前のバージョンを使用している場合には受信部分を以下のように書き換える (これ以降のサンプルに関しても同様に)

Page 13: Ssaw08 0617

OSCメッセージの送受信

• 送受信2つのパッチを両方開いて、メッセージがやりとりされていることを確認

• うまくいったら、近所のマシーン同士でLANを介してOSCのメッセージをやりとりしてみる• ネットワーク環境設定で、周囲のマシンのIPアドレスを調べる• 任意のポート番号を設定して、先程調べたIPアドレスを指定して、OSCのメッセージをお互いに送受信してみる

Page 14: Ssaw08 0617

IPとポート番号

• IPとは• 127.0.0.1:自分自身のアドレス(localhost)のこと• システム環境設定のネットワーク設定を参照して、近くのマシンのIPを調べ、ネットワーク越しにメッセージをやりとりしてみる

• ポート番号とは• 複数の相手と同時に接続を行なうためにIPアドレスの下に設けられたサブ(補助)アドレス

• 0から65535までの数字が使われる

Page 15: Ssaw08 0617

• OSCメッセージの仕組み• URI (Uniform Resource Identifier)と同様に”/”で区切ることで階層構造を表現している

• さっきのサンプルの場合

udpsendとudpreceive

/message

/control /number

/level

/bang

Page 16: Ssaw08 0617

Sinwave Quartetto!

• OSCを用いてネットワーク越しに4人でアンサンブルするパッチを作ってみる

• Sinwave Quartetto!• それぞれのパートは、sin波のオシレータにテープディレイを付加したもの• 操作できるパラメータ• 周波数(freq)、音量(amp)、ディレイタイム(delay)、演奏のタイミング(bang)

Page 17: Ssaw08 0617

Sinwave Quartetto!/freq/amp/delay/bang

/osc1

/freq/amp/delay/bang

/osc2

/freq/amp/delay/bang

/osc3

/freq/amp/delay/bang

/osc4

Page 18: Ssaw08 0617

Sinwave Quartetto!

• クライアント(4種類)

Page 19: Ssaw08 0617

Sinwave Quartetto!

• Max4.3以前の場合はこちら

Page 20: Ssaw08 0617

Sinwave Quartetto!

• サーバー

Page 21: Ssaw08 0617

Sinwave Quartetto!

• サーバー (Max4.3以前の場合)

Page 22: Ssaw08 0617

異なるアプリケーション間の接続

• ネットワークを活用することで、異なるアプリケーション同士を接続することが可能となる

• 例えば…• Processingのモーショングライックに合わせて、Max/MSPで音響合成する

• Processingでアルゴリズミックに形態を生成して、その形態に対応した音響をMax/MSPで生成する

• 音響合成の部分はMax/MSPの代わりにSuperColliderやChucKにすることも可能

Page 23: Ssaw08 0617

Max/MSPとProcessingの接続

• oscP5を利用する• http://www.sojamo.de/libraries/oscP5/• ProcessingにOSCを喋らせるためのライブラリー

Page 24: Ssaw08 0617

Max/MSPとProcessingの接続例 (1)

• Max/MSP ←→ P5 簡単なメッセージの送受信の実験• Max/MSP側

Page 25: Ssaw08 0617

Max/MSPとProcessingの接続例 (1)

/* Processing側 */import oscP5.*;import netP5.*;

OscP5 oscP5;NetAddress myRemoteLocation;

void setup() { size(400,400); frameRate(25); /* OSCをスタートし、ポート12000のOSCメッセージの受信を監視 */ oscP5 = new OscP5(this,12000); /* OSC送信のために、ip:127.0.0.1 ポート:12000のネットワークアドレスを準備 */ myRemoteLocation = new NetAddress("127.0.0.1",12000);}

void draw() { background(0); }

Page 26: Ssaw08 0617

Max/MSPとProcessingの接続例 (1)

/* マウスクリックでOSC送信 */void mousePressed() { OscMessage myMessage = new OscMessage("/test"); myMessage.add(123); oscP5.send(myMessage, myRemoteLocation); }

/* OSCの受信を監視するイベントリスナー */void oscEvent(OscMessage theOscMessage) { if(theOscMessage.checkAddrPattern("/test")==true) { if(theOscMessage.checkTypetag("i")) { int value = theOscMessage.get(0).intValue(); println(" values: "+value); return; } } }

Page 27: Ssaw08 0617

Max/MSPとProcessingの接続例 (2)

• Max/MSPをProcessingへの情報入力用のインタフェイスとして用いる• 指定したサイズで丸か四角形をランダムに描く• 送信側:Max/MSP

Page 28: Ssaw08 0617

Max/MSPとProcessingの接続例 (2)

/* 受信側:Processing */import oscP5.*;import netP5.*;

/* OscP5オブジェクト */OscP5 oscP5;

void setup() { // 画面の初期設定 size(400,400); background(0); noStroke(); smooth(); frameRate(30); // OscP5をインスタンス化 (初期化) oscP5 = new OscP5(this, 12000);}

/* drawの処理が何もなくても記述する */void draw(){}

Page 29: Ssaw08 0617

Max/MSPとProcessingの接続例 (2)

/* OSCのメッセージを受信された際に起動されるイベントハンドラ */

void oscEvent(OscMessage msg){ // msgにOSCのメッセージを格納

// もしOSCのアドレスパターンが "/maru" だったら if(msg.checkAddrPattern("/maru") == true){ // 値を取り出してサイズとする int value = msg.get(0).intValue(); // ランダムに色を塗る fill(random(255), random(255), random(255), 100); // 丸を描く ellipse(random(width), random(height), value, value); }

Page 30: Ssaw08 0617

Max/MSPとProcessingの接続例 (2)

// もしOSCのアドレスパターンが "/sikaku" だったら if(msg.checkAddrPattern("/sikaku") == true){ // 値を取り出してサイズとする int value = msg.get(0).intValue(); // ランダムに色を塗る fill(random(255), random(255), random(255), 100); // 四角形を描く rectMode(CENTER); rect(random(width), random(height), value, value); }}

Page 31: Ssaw08 0617

Max/MSPとProcessingの接続例 (2)

• 実行結果

Page 32: Ssaw08 0617

Max/MSPとProcessingの接続例 (3)

• Processing上での壁に跳ね返るボールの位置にあわせて Max/MSPでSin波を合成してみる

Page 33: Ssaw08 0617

Max/MSPとProcessingの接続例 (3)

• 壁に当ったときの位置によって周波数を決める • ボールは8つ • OSCのメッセージの構成 • /osc0 • /osc1 • /osc2 • /osc3 • /osc4 • /osc5 • /osc6 • /osc7

Page 34: Ssaw08 0617

Max/MSPとProcessingの接続例 (3)

• 受信:Max/MSP側

Page 35: Ssaw08 0617

Max/MSPとProcessingの接続例 (3)

/* 送信側 */

import oscP5.*;import netP5.*;

OscP5 oscP5;NetAddress myRemoteLocation;int MAX = 8;Ball[] myBall = new Ball[MAX];

int sendToPort;String host;String oscP5event;

void setup() { size(400,400); frameRate(30); oscP5 = new OscP5(this, 12000); myRemoteLocation = new NetAddress("127.0.0.1",12000); for (int i = 0; i < MAX; i++) { myBall[i] = new Ball(i, random(-10,10), random(-10, 10)); } smooth();}

Page 36: Ssaw08 0617

Max/MSPとProcessingの接続例 (3)

void draw() { background(0); for (int i = 0; i < MAX; i++) { myBall[i].move(); } }

class Ball { int num; float xspeed; float yspeed; float xpos; float ypos;

Ball(int n, float xs, float ys){ num = n; xspeed = xs; yspeed = ys; xpos = random(width); ypos = random(height); ellipseMode(CENTER); noStroke(); fill(128); }

Page 37: Ssaw08 0617

Max/MSPとProcessingの接続例 (3)

void move(){ xpos += xspeed; ypos += yspeed; ellipse(xpos, ypos, 10, 10); if(xpos>width || xpos < 0){ OscMessage myMessage = new OscMessage("/ball"+num); myMessage.add(ypos); oscP5.send(myMessage, myRemoteLocation); xspeed *= -1; } if(ypos>height || ypos < 0){ OscMessage myMessage = new OscMessage("/ball"+num); myMessage.add(xpos); oscP5.send(myMessage, myRemoteLocation); yspeed *= -1; } }}