XY PAINT OSC

lemur XYpad  

Processing + Lemur + MadMapper

LemurのXYパッドの入力をProcessingのスケッチにOSCで送り描画させる。
1つのXYパッドで2つの入力値が取れなかったため、2つのXYパッドを用意し、2点のタッチの軌跡を1つの画面上に描画。

 
// XY PAINT OSC
// Processing + Lemur + MadMapper
// <reference>
// http://rd.uniba.jp/blog/2010/06/18/processing%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%9D%E3%81%AE2/
// http://qiita.com/gansaibow/items/fcae51cff691b6b84905
// http://amano-kiyoyuki.hateblo.jp/entry/2015/03/01/101743

import codeanticode.syphon.*;// [lib]Syphon
import oscP5.*; // [lib]oscP5
import netP5.*; // [lib]oscP5

SyphonServer server; // [lib]Syphon
OscP5 oscP5; // [lib]oscP5

float valueX, valueY, valueX2, valueY2, valueXp, valueYp, valueX2p, valueY2p;
int colorStart = 0;
int colorEnd = 30;
int colorDifference = 10;
// HSB 0=red 60=yello 120=green 240=blue 300=purple
float colorChange = 0;

void settings(){
  size(600, 600, P3D);
  PJOGL.profile=1; // [lib]Syphon
}

void setup(){
  server = new SyphonServer(this, "Processing Syphon"); // [lib]Syphon
  oscP5 = new OscP5(this,8020); // [lib]oscP5  Lemurのポートと合わせる
  smooth();
  noStroke();
  colorMode(HSB, 360, 100, 100, 100);  
  background(0, 0, 0, 100);
}
 
void draw(){
  server.sendScreen(); // [lib]Syphon
  //println("valueX=" + valueX + " /valueY=" + valueY);
  // 描画球1
  if(valueXp == valueX && valueYp == valueY){// 無操作時延々と描画されないよう過去の現在のXY値と1フレーム前のX値を比較
    fadeFill();
  } else {
    int randX = int(random(-15, 15));
    int randY = int(random(-5, 5));
    float radiusR = random(5, 50);

    int H = int(random(colorStart + colorChange, colorEnd + colorChange));
    int S = int(random(0, 100));
    int B = int(random(40, 90));
    int a = int(random(30, 100));
    
    fill(H, S, B, a);
    ellipse(valueX + randX, valueY + randY, radiusR, radiusR);
  }
  // 描画球2
  if(valueX2p == valueX2 && valueY2p == valueY2){
    fadeFill();
  } else {
    int randX = int(random(-15, 15));
    int randY = int(random(-5, 5));
    float radiusR = random(5, 50);

    int H = int(random(colorStart + colorDifference + colorChange, colorEnd + colorDifference + colorChange));
    int S = int(random(0, 100));
    int B = int(random(40, 90));
    int a = int(random(30, 100));
    
    fill(H, S, B, a);
    ellipse(valueX2 + randX, valueY2 + randY, radiusR, radiusR);
  }
  valueXp = valueX;
  valueYp = valueY;
  valueX2p = valueX2;
  valueY2p = valueY2;
  // 色の変化
  if(colorChange + colorStart < 360){
    colorChange += 0.1;
  } else {
    colorChange = 0;
  }
}

void fadeFill(){
  noStroke();
  colorMode(HSB);
  fill(0, 0, 0, 8); // 小さい値だと完全に消え切らない
  rectMode(CORNER);
  rect(0, 0, width, height);
}

void oscEvent(OscMessage theOscMessage) {
  println("### received an osc message with addrpattern "+theOscMessage.addrPattern()+" and typetag "+theOscMessage.typetag());
  theOscMessage.print();
  //↑で受け取っている名前を確認して↓で指定
  if (theOscMessage.checkAddrPattern("/point1/x") == true) {
    // x1の位置
    valueX = map(theOscMessage.get(0).floatValue(), 0, 1, 0, float(width));
  } else if (theOscMessage.checkAddrPattern("/point1/y") == true) {
    // y1の位置
    valueY = height - (map(theOscMessage.get(0).floatValue(), 0, 1, 0, float(height)));
  } else if (theOscMessage.checkAddrPattern("/point2/x") == true) {
    // x2の位置
    valueX2 = map(theOscMessage.get(0).floatValue(), 0, 1, 0, float(width));
  }else if (theOscMessage.checkAddrPattern("/point2/y") == true) {
    // y2の位置
    valueY2 = height - (map(theOscMessage.get(0).floatValue(), 0, 1, 0, float(height)));
  } else {
    println("else");
  }

}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください