開発環境
言語
- Processing 3.1.1
eclipseを使用し、core.jarをインポートした環境でコーディングしているため、
ProcessingのIDEでは実行できません。
参考URL
http://hiroyukitsuda.com/archives/172
- java 1.8.0_9
Processingで使用しているバージョン
ソフトウェア
- Ableton Live 9.7.1
- Max 7.3.1
- java 1.6.0_65
Max for Liveで使用しているバージョン
補足
最新のバージョンでは利用できないため、1.6を使用する
JAVA_HOMEの切り替え手順
OS
- macOS sierra 10.12.2
Ableton liveより送信したOSCデータをProcessingで受信しイメージに反映する
OSCデータを受信
1.oscP5をインポート
次のサイトにライブラリが公開されています。
http://www.sojamo.de/libraries/oscP5/
Processing IDEのメニューより、スケッチ->ライブラリをインポート->ライブラリを追加
でダウンロードも可能です。
2.setupメソッドに受信ポートを設定
Ableton Liveのデフォルトポート2346を指定します。
Ableton LiveのOSC Monitorを使用しているとOSC Monitorがポートを使ってしまい受信できないので注意してください。
public void setup() { //〜〜〜〜〜省略〜〜〜〜〜〜〜〜〜〜 //2346ポートでOSCデータを受信 o = new OscP5(this, 2346); }
3.OSCデータを受信
OSCデータを受信するたびに呼び出されるメソッドoscEventを使用して
メッセージのタグに応じてデータの値を取得します。
受信したデータは適切な値にマッピングしておきます。
public void oscEvent(OscMessage theMsg) { //〜〜〜〜〜省略〜〜〜〜〜〜〜〜〜〜 //Note41[kick]の音で四角形の数、位置、横幅、縦幅を増加値を設定 if(theMsg.checkAddrPattern("/Note41")==true) { float note41 = theMsg.get(0).intValue(); oscRectNum = map(note41, 0, 127, 1, 30); oscPlace = map(note41,0,127,1,150); oscRectWidth = map(note41, 0, 127, 1, 600); oscRectHeight = map(note41, 0, 127, 1, 600); } //〜〜〜〜〜省略〜〜〜〜〜〜〜〜〜〜 }
4.OSCデータをイメージに反映
次の例は、四角形の横幅と縦幅に反映しています。
public void draw() { //〜〜〜〜〜省略〜〜〜〜〜〜〜〜〜〜 //四角形の横幅と縦幅 int rectWidth = (int)random(5,100 + oscRectWidth); int rectHeight = (int)random(5,100 + oscRectHeight); //〜〜〜〜〜省略〜〜〜〜〜〜〜〜〜〜 }
音とイメージは次のようにリンクさせています。
beep Note44 -> 横幅を増加、縦幅を減少
drone Note40 -> 描画をスタート
kick Note41 -> 四角形の数を増加、位置の範囲を増加、横幅を増加、縦幅を増加
click Note36 -> 使用していない。(今後,Phillips Hueと連携予定)
hihat Note50 -> 背景と図形の色を反転
コード
package rectangle; import oscP5.OscMessage; import oscP5.OscP5; import processing.core.PApplet; public class RandomRect_MaxMsp extends PApplet{ //描画のスタートを制御 boolean start; //色の反転を制御 boolean flash; //---------------- OSC --------------------- OscP5 o; //OSCデータのベロシティ値 float note37,note40,note44,note50; //OSC値で可変とする四角形の値 float oscRectNum = 1F; //表示数 float oscPlace = 0; //表示位置 float oscRectWidth = 0; //横幅 float oscRectHeight = 0; //縦幅 public void settings() { fullScreen(); smooth(); } public void setup() { noCursor(); println("width:"+width); println("height:"+height); frameRate(30); //背景を黒色 background(0); //2346ポートでOSCデータを受信 o = new OscP5(this, 2346); } public void draw() { //背景を黒色にし図形を初期化 background(0); //図形を白色 int baseColor = 255; //flashフラグがオンでイメージカラーを反転 if (frameCount / 5 % 2 == 0 && flash == true) { //白と黒を反転 background(baseColor); baseColor = 0; } if(start){ //四角形の数 int rectNum = (int)random(1,oscRectNum); pushMatrix(); translate(width/2, height/2); for(int i=0;i<=rectNum;i++){ //四角形の表示位置 int x = (int)random(-10-oscPlace,10+oscPlace); int y = (int)random(-10-oscPlace,10+oscPlace); //四角形の横幅と縦幅 int rectWidth = (int)random(5,100 + oscRectWidth); int rectHeight = (int)random(5,100 + oscRectHeight); //図形の色を透明に設定 noFill(); //線の彩度 int rectAlpha = (int)random(0,255); stroke(baseColor,rectAlpha); rectMode(CENTER); rect(x, y, rectWidth, rectHeight); } popMatrix(); } } public void oscEvent(OscMessage theMsg) { //Note40[drone]の音で描画を開始、停止 if(theMsg.checkAddrPattern("/Note40")==true) { float note40 = theMsg.get(0).intValue(); if(note40 == 0){ start = false; }else{ start = true; } } //Note41[kick]の音で四角形の数、位置、横幅、縦幅を増加値を設定 if(theMsg.checkAddrPattern("/Note41")==true) { float note41 = theMsg.get(0).intValue(); oscRectNum = map(note41, 0, 127, 1, 30); oscPlace = map(note41,0,127,1,150); oscRectWidth = map(note41, 0, 127, 1, 600); oscRectHeight = map(note41, 0, 127, 1, 600); } //Note44[beep]の音で四角形の、横幅の増加値、縦幅の減少値を設定 if(theMsg.checkAddrPattern("/Note44")==true) { float note44 = theMsg.get(0).intValue(); oscRectHeight = map(note44, 0, 127, -10, -100); oscRectWidth = map(note44, 0, 127, 1, 1700); } //Note50[hihat]の音でイメージカラーの反転を制御 if(theMsg.checkAddrPattern("/Note50")==true) { float note50 = theMsg.get(0).intValue(); if(note50 == 0){ flash = false; }else{ flash = true; } } } public void keyPressed() { switch (key) { case 's': start = !start; break; case 'f': flash = !flash; break; default: break; } } public static void main(String[] args) { PApplet.main(RandomRect_MaxMsp.class.getName()); } }