開発環境
言語
- 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());
}
}