OSC通信を利用して、異なるPC間のリモート演奏を実験する。
OSC通信には、下図のように送信先のIPアドレスとポート番号が必須となる。(IPアドレスとポート番号の解説は別途)
①スケッチの準備
Processingを起動して、空のスケッチウィンドウに以下のコードをコピー&ペーストする。
import oscP5.*; //oscP5ライブラリの読み込み
import netP5.*;
import rwmidi.*; //RWMIDIライブラリの読み込み
import processing.net.*;
OscP5 oscP5;
MidiOutput output;
NetAddress myRemoteLocation;
int ch = 0; //Midi Chの設定 ここ変えるとKontakt Playeyの別のラックの音出せる
int note_on = 0; //NoteOnナンバー(変数)
int note_off = 60; //NoteOffナンバー(変数)
int pitch = 8192; //ピッチベンド
int vel = 100; //Velocity(音の強さ)の設定0〜127
int program = 20; //プログラムチェンジ(音色)の設定
int dev = 0; //音源の設定 UVI Workstsionの起動したときは1
int devLength = 0; //デバイスの数
int lock = 0; //マウスの連打を防止するため
int interval_cnt = 0;
float firstValue = 0;
String[] patt_address = new String[80]; //osc受信照合メッセージ格納
int noteNo = 0;
int rcv_port = 8000; //受信ポート
void setup () {
size (500, 300); //ウィンドウサイズ
frameRate (30);
oscP5 = new OscP5 (this, rcv_port); //受信アドレスとポート,thisはDHCPで自動に振られたアドレスになる
devLength = RWMidi.getOutputDevices ().length; //デバイスの数
output = RWMidi.getOutputDevices () [dev].createOutput(); //デバイスの設定
output.sendProgramChange (program); //プログラムチェンジの設定
//デバイスリストの表示
for (int i = 0; i < devLength; i++) {
println ("Output Device " + i + " : " + RWMidi.getOutputDevices () [i].getName() );
}
//このスケッチ同士で演奏し合うOSCパターンの初期化
for (int i = 41; i < 80; i++) {
patt_address[i] = "/naka" + String.valueOf(i);
}
myRemoteLocation = new NetAddress("192.168.0.8", 8000); //送信先IPアドレスとポート
}
void draw () {
background (0, 0, 0);
text ("***** OSC Communication!! *****", 15, 20);
text ("Device Name: " + output.getName (), 15, 40);
text ("Program Change: " + program, 15, 60);
if(note_on==0) {
text ("Pushed Key: --", 15, 100);
text ("Send Note No: --", 15, 120);
} else {
text ("Pushed Key: " + key, 15, 100);
text ("Send Note No: " + note_on, 15, 120);
}
if(noteNo==0) {
text ("OSC Message: --", 15, 160);
text ("Receive Note No: --", 15, 180);
} else {
text ("OSC Message: " + patt_address[noteNo], 15, 160);
text ("Receive Note No: " + noteNo, 15, 180);
}
//text ("This PC IP: " + Server.ip(), 15, 260);
text ("This PC IP: ***.***.***.***", 15, 260);
text ("PORT: " + rcv_port, 170, 260);
text ("Remote IP: " + myRemoteLocation.address(), 15, 280);
text ("PORT: " + myRemoteLocation.port(), 170, 280);
}
void keyPressed () { //キーを押した時
output.sendPitchBend( ch, 8192 );
if(lock==0){
switch(key) {
case'z': note_on = 41; break;
case'x': note_on = 43; break;
case'c': note_on = 45; break;
case'v': note_on = 47; break;
case'b': note_on = 48; break;
case'n': note_on = 50; break;
case'm': note_on = 52; break;
case',': note_on = 53; break;
case'.': note_on = 55; break;
case'/': note_on = 57; break;
case'_': note_on = 59; break;
case'a': note_on = 60; break;
case's': note_on = 62; break;
case'd': note_on = 64; break;
case'f': note_on = 65; break;
case'g': note_on = 67; break;
case'h': note_on = 69; break;
case'j': note_on = 71; break;
case'k': note_on = 72; break;
case'l': note_on = 74; break;
case';': note_on = 76; break;
case':': note_on = 77; break;
case']': note_on = 79; break;
default: note_on = 0; break;
}
OscMessage myMessage = new OscMessage("/naka"+ String.valueOf(note_on)).add(1.0);
oscP5.send(myMessage, myRemoteLocation);
lock=1;
}
}
void keyReleased () { //キーを離した時
switch(key) {
case'z': note_off = 41; break;
case'x': note_off = 43; break;
case'c': note_off = 45; break;
case'v': note_off = 47; break;
case'b': note_off = 48; break;
case'n': note_off = 50; break;
case'm': note_off = 52; break;
case',': note_off = 53; break;
case'.': note_off = 55; break;
case'/': note_off = 57; break;
case'_': note_off = 59; break;
case'a': note_off = 60; break;
case's': note_off = 62; break;
case'd': note_off = 64; break;
case'f': note_off = 65; break;
case'g': note_off = 67; break;
case'h': note_off = 69; break;
case'j': note_off = 71; break;
case'k': note_off = 72; break;
case'l': note_off = 74; break;
case';': note_off = 76; break;
case':': note_off = 77; break;
case']': note_off = 79; break;
default: note_off = 0; break;
}
OscMessage myMessage2 = new OscMessage("/naka"+ String.valueOf(note_off)).add(0.0);
oscP5.send(myMessage2, myRemoteLocation);
lock=0;
}
void mouseMoved ()
{
OscMessage myMessage3 = new OscMessage("/naka"+ String.valueOf(255)).add((float)mouseX/(float)width); //naka255をピッチベンドに設定
oscP5.send(myMessage3, myRemoteLocation);
}
//OSC受信処理
void oscEvent (OscMessage theOscMessage) {
for (int k = 41; k < 80; k++) {
if (theOscMessage.checkAddrPattern(patt_address[k])) {
if (theOscMessage.checkTypetag("f")) {
firstValue = theOscMessage.get(0).floatValue();
}
noteNo = k;
if (firstValue == 1) {
output.sendNoteOn( ch, noteNo, vel );
println("noteon: ", ch, noteNo, vel);
interval_cnt = interval_cnt ++;
} else {
delay(10);//パッドを軽く押したら、ボスって音がする noteonからnoteoffの間が短すぎる delayで解決
output.sendNoteOff( ch, noteNo, vel );
println("noteoff: ", ch, noteNo, vel);
output.sendPitchBend( ch, 8192 ); //ピッチベンドのリセット
}
}
}
//pitchbend 0〜16383
if (theOscMessage.checkAddrPattern("/naka255")) { //255をピッチベントに設定
if (theOscMessage.checkTypetag("f")) {
pitch = (int)(16383*theOscMessage.get(0).floatValue());
}
//println("pitch: " + pitch);
output.sendPitchBend( ch, pitch );
}
}
②送信IPアドレスの設定
パートナーPCのIPアドレス(送信先)を確認する。
システム環境設定>ネットワーク>詳細>TCP/IPのIPv4アドレス(下図)で確認。
コード43行目の"192.168.0.8"を送信先のIPアドレスに変更する。
③スケッチの実行(キーボードとマウスで演奏)
Runボタンを押して実行すると黒いウィンドウが表示される。
実験2と同じキーボードで送信先PCを利用して演奏することができる。キーを押したまま、マウスを左右に振ることで音高を変化させることもできる。送信先で音色や音源を変更するなど実験してみよう。
Pushed KeyとSend Note Noに操作情報、OSC MessageとReceive Note Noに受信情報が表示される。