音と映像の同期[max/msp -> Processing]_その3


開発環境

言語

- 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の切り替え手順

http://qiita.com/mas0061/items/2fe9333f045800d00b5c

http://qiita.com/ringo/items/db58b34dc02a941b297f

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());
        }
}


実行結果