狠狠撸

狠狠撸Share a Scribd company logo
SSAW08 第8回

OpenSoundControlの活用
2008年6月17日
今日の内容

? ネットワークを用いた作品を制作してみる
? OSCについて
? Max/MSP同士のコミュニケーション
  ? OpenSoundControl
  ? udpsend, udpreceive
? Max/MSPとFlashのコミュニケーション
  ? FlashのXMLSocket通信
  ? ?ashserver
? Max/MSPとProcessingのコミュニケーション
  ? P5osc
OSCとは

? カルフォルニア州立大学バークレー校のCNMAT(Center for New Music
  and Audio Technorogies)を中心に開発
? コンピュータ音楽のための通信プロトコル(規則)
? ポストMIDI!
? 詳しくは、OSCのページを参照
   ? http://opensoundcontrol.org/
MIDIの限界

? バンド幅の限界
  ? 複雑な音楽情報を制御するには、通信帯域が狭すぎる
    ? (31,250 bit/sec程度)
  ? データの遅延も無視できない程生じてしまう
? 相互接続の限界
  ? 短方向の通信しかできないので通信の方向ごとにケーブルが必要(IN,
    OUT, THRU)
  ? チャンネル数にも制限がある
? 音楽記述の限界
  ? 平均率の楽譜表現に偏ったプロトコル
  ? 音色を記述することができない
  ? 連続する値の変化を記述できない
OSCの特徴

? 開放的?動的なネーミング手法
  ? URL(= Uniform Resorce Locator)とよく似た考え方
? 数値、記号双方を通信できる
? 高度なパターンマッチング
? 高解像度の時間制御
? 帯域幅の制限はしていない
? 多くのソフトウェア、プログラミング言語に実装済み
OSI参照モデル

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



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

第6層




                                               OSC
             http




                          POP




                                        ssh
                    ftp




                                 ftp
プレゼンテーション層

第5層
セッション層

第4層
                                TCP                  UDP
トランスポート層

第3層
                                          IP
ネットワーク層

第2層
データ?リンク層
                                       Ethernet
第1層
物理層
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をダウンロード
OSCメッセージの送受信

? OSCメッセージの送信
OSCメッセージの送受信

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

? OSCメッセージの受信
OSCメッセージの送受信

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

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

? IPとは
   ? 127.0.0.1:自分自身のアドレス(localhost)のこと
   ? システム環境設定のネットワーク設定を参照して、近くのマシンのIPを
     調べ、ネットワーク越しにメッセージをやりとりしてみる
? ポート番号とは
   ? 複数の相手と同時に接続を行なうためにIPアドレスの下に設けられたサ
     ブ(補助)アドレス
   ? 0から65535までの数字が使われる
udpsendとudpreceive

 ? OSCメッセージの仕組み
   ? URI (Uniform Resource Identi?er)と同様に / で区切ることで階層構
     造を表現している
   ? さっきのサンプルの場合


                /message


                /control         /number


                                 /level


                                 /bang
Sinwave Quartetto!

 ? OSCを用いてネットワーク越しに4人でアンサンブルするパッチを作って
   みる
 ? Sinwave Quartetto!
 ? それぞれのパートは、sin波のオシレータにテープディレイを付加したもの
 ? 操作できるパラメータ
    ? 周波数(freq)、音量(amp)、ディレイタイム(delay)、演奏のタイミング
      (bang)
Sinwave Quartetto!
                 /osc1   /freq
                         /amp
                         /delay
                         /bang
                 /osc2   /freq
                         /amp
                         /delay
                         /bang
                 /osc3   /freq
                         /amp
                         /delay
                         /bang
                 /osc4   /freq
                         /amp
                         /delay
                         /bang
Sinwave Quartetto!

 ? クライアント(4种类)
Sinwave Quartetto!

 ? 惭补虫4.3以前の场合はこちら
Sinwave Quartetto!

 ? サーバー
Sinwave Quartetto!

 ? サーバー (Max4.3以前の場合)
異なるアプリケーション間の接続

? ネットワークを活用することで、異なるアプリケーション同士を接続する
  ことが可能となる
? 例えば…
  ? Processingのモーショングライックに合わせて、Max/MSPで音響合
    成する
  ? Processingでアルゴリズミックに形態を生成して、その形態に対応し
    た音響をMax/MSPで生成する
  ? 音響合成の部分はMax/MSPの代わりにSuperColliderやChucKにする
    ことも可能
Max/MSPとProcessingの接続

? oscP5を利用する
   ? http://www.sojamo.de/libraries/oscP5/
   ? ProcessingにOSCを喋らせるためのライブラリー
Max/MSPとProcessingの接続例 (1)

? Max/MSP ←→ P5 簡単なメッセージの送受信の実験
  ? Max/MSP側
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);
}
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;
        }
    }
}
Max/MSPとProcessingの接続例 (2)

? Max/MSPをProcessingへの情報入力用のインタフェイスとして用いる
  ? 指定したサイズで丸か四角形をランダムに描く
  ? 送信側:Max/MSP
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(){
}
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);
   }
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);
    }
}
Max/MSPとProcessingの接続例 (2)

? 実行結果
Max/MSPとProcessingの接続例 (3)

? Processing上での壁に跳ね返るボールの位置にあわせて Max/MSPでSin
  波を合成してみる
Max/MSPとProcessingの接続例 (3)

? 壁に当ったときの位置によって周波数を決める
  ? ボールは8つ
  ? OSCのメッセージの構成
    ? /osc0
    ? /osc1
    ? /osc2
    ? /osc3
    ? /osc4
    ? /osc5
    ? /osc6
    ? /osc7
Max/MSPとProcessingの接続例 (3)

? 受信:Max/MSP側
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();
}
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);
	   }
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;
	   	       }
	   }
}

More Related Content

Ssaw08 0617