リアルとバーチャルの間

気まぐれに書いてます。

ProcessingでOSCを使おう!

OSCとは、コンピュータ音楽のための通信プロトコルです。
OpenSound Control - Wikipedia

利点としては、双方向通信ができる。パターンマッチングができる。
帯域幅の制限がなく、多くのソフトウェアに実装されている事にあると思う。

通信機能には7階層の構造があります。
【階層】
第七層:物理層、電気信号の変換
第六層:データリンク層 通信機器間の直接的な信号の受け渡し
第五層:ネットワーク層 ネットワークにおいて通信経路の選択
第四層:トランスポート層 ネットワークにおける通信管理
第三層:セッション層 通信プログラム間の通信の開始から終了までの手順
第二層:プレゼンテーション層 データの表現方法
第一層:アプリケーション層 ユーザーが操作するインターフェイス

OSCは、7から5層に入ります。

【IPとポート番号について】

IPとは、インターネットやイントラネットなどのIPネットワークに接続されたコンピュータ1台1台に割り振られた識別番号(127.0.0.1自身のアドレス)

ポート番号とは
複数の相手と同時に接続を行うためにIPアドレスの下に設けられたサブアドレス
(0から65535)まで使用可能。

【OSCメッセージの仕組み】
URIと同様に/で区切ることで階層構造を表現しています。
/1/fader1 みたいな感じ。
processingだと、theOscMessage.checkAddrPatternで受け取れます。


では、メッセージを受け取って適当に処理されるプログラムを書いてみました。

import oscP5.*;
import netP5.*;

// VARIABLE //////////////////////////////////////////////
float xA = -100;
float yA;
float csXY = 40;
OscP5 oscP5;
NetAddress myBroadcastLocation;

// SETUP ////////////////////////////////////////////// 
void setup() {
  size(320, 240);
  background(0);
  smooth();
  
  //osc
  oscP5 = new OscP5(this,12000);
  //myBroadcastLocation = new NetAddress("127,0,0,1",32000);
}

// DRAW //////////////////////////////////////////////
void draw() {
  noStroke();
  fill(0, 30);
  rect(0, 0, width, height);
  plus();
}

// PRIVATE //////////////////////////////////////////////
void plus() {
  yA = sq(xA)/60;
  noStroke();
  fill(255, 255, 255, 80);
  ellipse(xA+width/2,yA,csXY,csXY);
  xA++;
  //println(yA);
  
  if(xA > 200){
   xA = -200; 
  }
  
}

void oscEvent(OscMessage theOscMessage) {
  println("### received an osc message with addrpattern "+theOscMessage.addrPattern()+" and typetag "+theOscMessage.typetag());
  theOscMessage.print();
  
  if(theOscMessage.checkAddrPattern("/1/fader1") == true){
   println("true");
   float value = theOscMessage.get(0).floatValue();
   println(value);
   csXY = 100*value;
  }else{
   println("false"); 
  }
  
}
||>

今回は、送信側はiphoneで済ませています。
500円しますが適度でいいです。
[https://itunes.apple.com/jp/app/touchosc/id288120394?mt=8:embed]