Basisversuche im i2audiolab
(EN google-translate)
(PL google-translate)
Befehle an die WFS-Anlage schicken
siehe auch:

Es wurden einige grundlegende Experimente durchgeführt, um die Möglichkeit auszutesten, die WFS-Anlage über ein Processing-Skript mittels OSC zu steuern.
Hierzu wurden Audiofiles erstellt, die jeweils in einer Sekunde eine ganze Welle enthalten. Dies ermöglicht sie ohne "Knacks" zu "loopen". Denn die Sounds werden von einem PC der Anlage bereitgestellt und werden dann über OSC-Befehle an bestimmte Stellen in der Hörebene als Punktschallquelle gesetzt, oder als Ambient-Sound.
// Quellen erstellen: // 48000Hz, mono, 16Bit, 1 Sekunde Dauer // 0..4 samp freq/Hz // 480/1 == 2*2*2*2*2*3*5 480 100 // 480/2 == 2*2*2*2*3*5 240 200 // 480/3 == 2*2*2*2*2 *5 160 300 // 480/4 == 2*2*2*3*5 120 400 // 480/5 == 2*2*2*2*2*3 96 500 mat = zeros(1,48000); teiler = [2,3,4,5]; for k=1:4 samp = 480/teiler(k); freq = 48000.0/samp; t=0.0; dt = 1.0/48000.0; for i=1:48000 wert = 0.5*sin(2*%pi*freq*t); mat(1,i)=wert; t=t+dt; end name = sprintf("sinus_neu%i_%iHz.wav",k,round(freq)); wavwrite(mat, 48000.0, 16, name); end
Code 0-1: Erstellen von Audiodateien, die geeignet sind für seamless loop mit Ardour.

Erstes Experiment: Punktschallquellen erzeugen und einschalten.
import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import oscP5.*; import netP5.*; //Beispiel Ardourbefehl: // W-LAN xxx // PORT xxx // Ardour OSC googeln. // ARDOUR/transport_play // ARDOUR/transport_stop // ARDOUR/transport_stop // 48000 Samplerate! //String IP = "xxx"; //LAN //Ardour über Lan: 192.168.3.254 String IP = "xxx"; //W-LAN int PORT = xxx; double VSCHALL = 343.0; // m/s double BRAUM = 5.0; // m Breite des Raumes double HRAUM = 5.7; // m Tiefe des Raumes int[] ID = {0,1,2,3}; int BREITE = 640; //Fenster dieses Sketches int HOEHE = 480; double PIXEL_PRO_METER = 4.0; OSC osc; Performance performance; void setup() { size(BREITE,HOEHE); frameRate(25); osc = new OSC(IP,PORT); osc.initialisieren(); performance = new Performance(osc,VSCHALL,BRAUM,HRAUM,ID,BREITE,HOEHE,PIXEL_PRO_METER); performance.initialisieren(); performance.starten(); } void draw() { background(0); performance.draw(); }
Code 0-2: test001_punktquelle_erzeugen_und_einschalten.pde
public class Performance implements Runnable { //Speziell: 4 Quellen float[][] xy = {{0,0},{0,0},{0,0},{0,0}}; int[][] rgb = {{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; boolean[] aktiv = {false,false,false,false}; private int[] ID; private ScheduledExecutorService schedExecService; private long periode = 2000; private double VSCHALL; // m/s private double BRAUM; // m Breite des Raumes private double HRAUM; // m Länge des Raumes private int BREITE; private int HOEHE; private double PIXEL_PRO_METER; private OSC osc; public void setzePosition(int nr, double phi, double millis) { double r = VSCHALL*millis*0.001; double x = r*Math.cos(phi); double y = r*Math.sin(phi); float x_wfs = (float)( x );//+ BRAUM*0.5); float y_wfs = (float)( -y + HRAUM*0.5); xy[nr][0] = (float)(x*PIXEL_PRO_METER) + (float)(BREITE/2); xy[nr][1] = -(float)(y*PIXEL_PRO_METER) + (float)(HOEHE/2); osc.setzePosition(nr,x_wfs,y_wfs); } public void auffrischen() { setzePosition(ID[0],0.0, 100); setzePosition(ID[1],0.5*Math.PI,100); setzePosition(ID[2],1.0*Math.PI,100); setzePosition(ID[3],1.5*Math.PI,100); osc.setzeFarbe(ID[0],255,0,0); osc.setzeFarbe(ID[1],0,255,0); osc.setzeFarbe(ID[2],0,0,255); osc.setzeFarbe(ID[3],255,255,0); } public void initialisieren() { osc.deaktiviereQuelle(ID[0]); osc.deaktiviereQuelle(ID[1]); osc.deaktiviereQuelle(ID[2]); osc.deaktiviereQuelle(ID[3]); osc.setzeAlsPunktquelle(ID[0]); osc.setzeAlsPunktquelle(ID[1]); osc.setzeAlsPunktquelle(ID[2]); osc.setzeAlsPunktquelle(ID[3]); setzePosition(ID[0],0.0, 100); setzePosition(ID[1],0.5*Math.PI,100); setzePosition(ID[2],1.0*Math.PI,100); setzePosition(ID[3],1.5*Math.PI,100); osc.setzeFarbe(ID[0],255,0,0); osc.setzeFarbe(ID[1],0,255,0); osc.setzeFarbe(ID[2],0,0,255); osc.setzeFarbe(ID[3],255,255,0); rgb[0] = new int[] {255,0,0}; rgb[1] = new int[] {0,255,0}; rgb[2] = new int[] {0,0,255}; rgb[3] = new int[] {255,255,0}; } public void starten() { schedExecService.scheduleAtFixedRate(this, 0, periode, TimeUnit.MILLISECONDS); } public Performance(OSC osc,double VSCHALL,double BRAUM,double HRAUM, int[] ID, int BREITE, int HOEHE, double PIXEL_PRO_METER) { this.osc = osc; this.VSCHALL = VSCHALL; this.BRAUM = BRAUM; this.HRAUM = HRAUM; this.ID = ID; this.BREITE = BREITE; this.HOEHE = HOEHE; this.PIXEL_PRO_METER = PIXEL_PRO_METER; schedExecService = Executors.newSingleThreadScheduledExecutor(); } int ZAEHLER = 0; public void run() { println(" ++++ SENDE NEUE NACHRICHTEN ++++"); switch(ZAEHLER) { case 0: println("0000"); osc.deaktiviereQuelle(0); osc.deaktiviereQuelle(1); osc.deaktiviereQuelle(2); osc.deaktiviereQuelle(3); aktiv[0]=false;aktiv[1]=false;aktiv[2]=false;aktiv[3]=false; break; case 1: osc.stoppeArdourquellen(); //dadurch GRÜN nicht hörbar! println("1000"); osc.aktiviereQuelle(0); osc.deaktiviereQuelle(1); osc.deaktiviereQuelle(2); osc.deaktiviereQuelle(3); auffrischen(); aktiv[0]=true;aktiv[1]=false;aktiv[2]=false;aktiv[3]=false; break; case 2: osc.starteArdourquellen(); println("0100"); osc.deaktiviereQuelle(0); osc.aktiviereQuelle(1); osc.deaktiviereQuelle(2); osc.deaktiviereQuelle(3); auffrischen(); aktiv[0]=false;aktiv[1]=true;aktiv[2]=false;aktiv[3]=false; break; case 3: println("0010"); osc.deaktiviereQuelle(0); osc.deaktiviereQuelle(1); osc.aktiviereQuelle(2); osc.deaktiviereQuelle(3); auffrischen(); aktiv[0]=false;aktiv[1]=false;aktiv[2]=true;aktiv[3]=false; break; case 4: println("0001"); osc.deaktiviereQuelle(0); osc.deaktiviereQuelle(1); osc.deaktiviereQuelle(2); osc.aktiviereQuelle(3); auffrischen(); aktiv[0]=false;aktiv[1]=false;aktiv[2]=false;aktiv[3]=true; break; } ZAEHLER++; ZAEHLER%=5; } public void draw() { noStroke(); //Raum einzeichnen: fill(100,100,100); rect((float)(BREITE/2)-0.5f*(float)(BRAUM*PIXEL_PRO_METER), (float)(HOEHE/2) -0.5f*(float)(HRAUM*PIXEL_PRO_METER), (float)(BRAUM*PIXEL_PRO_METER), (float)(HRAUM*PIXEL_PRO_METER)); fill(100,100,255); rect((float)(BREITE/2)-0.5f*0.6f*(float)(BRAUM*PIXEL_PRO_METER), (float)(HOEHE/2) -0.5f*(float)(HRAUM*PIXEL_PRO_METER), 0.6f*(float)(BRAUM*PIXEL_PRO_METER), 0.1f*(float)(HRAUM*PIXEL_PRO_METER)); for(int i=0;i<xy.length;i++) { if(aktiv[i]==true) { fill(rgb[i][0],rgb[i][1],rgb[i][2]); ellipse(xy[i][0],xy[i][1],HOEHE/40,HOEHE/40); } } } }
Code 0-3: Performance.pde
public class OSC { private String[] nachrichten = { "/WONDER/source/activate", "/WONDER/source/deactivate", "/WONDER/source/type", "/WONDER/source/position", "/WONDER/source/color" }; private String IP; private int PORT; NetAddress zielgeraet; NetAddress zielgeraetArdour; OscP5 oscP5; public void initialisieren() { oscP5 = new OscP5(this,PORT); zielgeraet = new NetAddress(IP,PORT); zielgeraetArdour = new NetAddress(IP,3819); } public void pause() { try { Thread.sleep(1); } catch(Exception e) { } } public OSC() { this.IP = "127.0.0.1"; this.PORT = 12000; } public OSC(String IP, int PORT) { this.IP = IP; this.PORT = PORT; } public void starteArdourquellen() { OscMessage myMessage = new OscMessage("/ardour/transport_play"); //myMessage.add(nr); oscP5.send(myMessage, zielgeraetArdour); pause(); } public void stoppeArdourquellen() { OscMessage myMessage = new OscMessage("/ardour/transport_stop"); //myMessage.add(nr); oscP5.send(myMessage, zielgeraetArdour); pause(); } public void aktiviereQuelle(int nr) { OscMessage myMessage = new OscMessage(nachrichten[0]); myMessage.add(nr); oscP5.send(myMessage, zielgeraet); pause(); } public void deaktiviereQuelle(int nr) { OscMessage myMessage = new OscMessage(nachrichten[1]); myMessage.add(nr); oscP5.send(myMessage, zielgeraet); pause(); } public void setzeAlsPunktquelle(int nr) { OscMessage myMessage = new OscMessage(nachrichten[2]); myMessage.add(nr); myMessage.add(1); oscP5.send(myMessage, zielgeraet); pause(); } public void setzePosition(int nr, float x, float y) { OscMessage myMessage = new OscMessage(nachrichten[3]); myMessage.add(nr); myMessage.add(new Float(x)); myMessage.add(new Float(y)); oscP5.send(myMessage, zielgeraet); pause(); } public void setzeFarbe(int nr, int rot, int gruen, int blau) { OscMessage myMessage = new OscMessage(nachrichten[4]); myMessage.add(nr); myMessage.add(rot); myMessage.add(gruen); myMessage.add(blau); oscP5.send(myMessage, zielgeraet); pause(); } void oscEvent(OscMessage theOscMessage) { /* print the address pattern and the typetag of the received OscMessage */ print("OSC-Nachricht empfangen:"); String name = theOscMessage.addrPattern(); print("Name: "+name); println(" typetag: "+theOscMessage.typetag()); for(int i=0;i<nachrichten.length;i++) { if(name.equals(nachrichten[i])) { println("Nachricht wurde identifiziert:"); switch(i) { case 0: int nr0 = theOscMessage.get(0).intValue(); println("**** QUELLE mit ID "+nr0+" AN ****"); break; case 1: int nr1 = theOscMessage.get(0).intValue(); println("**** QUELLE mit ID "+nr1+" AUS ****"); break; case 2: int nr2 = theOscMessage.get(0).intValue(); int typ = theOscMessage.get(1).intValue(); println("**** SETZE QUELLE mit ID "+nr2+" ALS TYP "+typ+" ****"); break; case 3: int nr3 = theOscMessage.get(0).intValue(); float x = theOscMessage.get(1).floatValue(); float y = theOscMessage.get(2).floatValue(); println("**** SETZE QUELLE mit ID "+nr3+" AN POSITION x="+x+" y="+y+" ****"); break; case 4: int nr4 = theOscMessage.get(0).intValue(); int rot = theOscMessage.get(1).intValue(); int gruen = theOscMessage.get(2).intValue(); int blau = theOscMessage.get(3).intValue(); println("**** SETZE QUELLE mit ID "+nr4+" MIT FARBE rot="+rot+" gruen="+gruen+" blau="+blau+" ****"); break; } break; } } } }
Code 0-4: OSC.pde
Zweites Experiment: Kreisbewegung einer Punktschallquelle.
// 20 mal pro Sekunde die Positionen der vier Quellen ändern. // Kreisbewegung um die Raummitte herum. import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import oscP5.*; import netP5.*; //Beispiel Ardourbefehl: // W-LAN xxx // PORT xxx // Ardour OSC googeln. // ARDOUR/transport_play // ARDOUR/transport_stop // ARDOUR/transport_stop // 48000 Samplerate! //String IP = "xxx"; //LAN //Ardour über Lan: 192.168.3.254 String IP = "xxx"; //W-LAN int PORT = xxx; double VSCHALL = 343.0; // m/s double BRAUM = 5.0; // m Breite des Raumes double HRAUM = 5.7; // m Tiefe des Raumes int[] ID = {0,1,2,3}; int BREITE = 640; //Fenster dieses Sketches int HOEHE = 480; double PIXEL_PRO_METER = 4.0; OSC osc; Performance performance; void setup() { size(BREITE,HOEHE); frameRate(25); osc = new OSC(IP,PORT); osc.initialisieren(); performance = new Performance(osc,VSCHALL,BRAUM,HRAUM,ID,BREITE,HOEHE,PIXEL_PRO_METER); performance.initialisieren(); performance.starten(); } void draw() { background(0); performance.draw(); }
Code 0-5: test002_kreisbewegung_korrigiert3.pde
public class Performance implements Runnable { //Speziell: 4 Quellen float[][] xy = {{0,0},{0,0},{0,0},{0,0}}; int[][] rgb = {{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; boolean[] aktiv = {true,true,true,true}; private int[] ID; private ScheduledExecutorService schedExecService; private long periode = 50; private double VSCHALL; // m/s private double BRAUM; // m Breite des Raumes private double HRAUM; // m Länge des Raumes private int BREITE; private int HOEHE; private double PIXEL_PRO_METER; private OSC osc; public void setzePosition(int nr, double phi, double millis) { double r = VSCHALL*millis*0.001; double x = r*Math.cos(phi); double y = r*Math.sin(phi); float x_wfs = (float)( x + BRAUM*0.5); float y_wfs = (float)( -y + HRAUM*0.5); xy[nr][0] = (float)(x*PIXEL_PRO_METER) + (float)(BREITE/2); xy[nr][1] = -(float)(y*PIXEL_PRO_METER) + (float)(HOEHE/2); osc.setzePosition(nr,x_wfs,y_wfs); } public void initialisieren() { osc.deaktiviereQuelle(ID[0]); osc.deaktiviereQuelle(ID[1]); osc.deaktiviereQuelle(ID[2]); osc.deaktiviereQuelle(ID[3]); osc.setzeAlsPunktquelle(ID[0]); osc.setzeAlsPunktquelle(ID[1]); osc.setzeAlsPunktquelle(ID[2]); osc.setzeAlsPunktquelle(ID[3]); setzePosition(ID[0],0.0, 100); setzePosition(ID[1],0.5*Math.PI,100); setzePosition(ID[2],1.0*Math.PI,100); setzePosition(ID[3],1.5*Math.PI,100); osc.setzeFarbe(ID[0],255,0,0); osc.setzeFarbe(ID[1],0,255,0); osc.setzeFarbe(ID[2],0,0,255); osc.setzeFarbe(ID[3],255,255,0); //osc.aktiviereQuelle(ID[0]); //osc.aktiviereQuelle(ID[1]); //osc.aktiviereQuelle(ID[2]); osc.aktiviereQuelle(ID[3]); osc.starteArdourquellen(); rgb[0] = new int[] {255,0,0}; rgb[1] = new int[] {0,255,0}; rgb[2] = new int[] {0,0,255}; rgb[3] = new int[] {255,255,0}; } public void starten() { schedExecService.scheduleAtFixedRate(this, 0, periode, TimeUnit.MILLISECONDS); } public Performance(OSC osc,double VSCHALL,double BRAUM,double HRAUM, int[] ID, int BREITE, int HOEHE, double PIXEL_PRO_METER) { this.osc = osc; this.VSCHALL = VSCHALL; this.BRAUM = BRAUM; this.HRAUM = HRAUM; this.ID = ID; this.BREITE = BREITE; this.HOEHE = HOEHE; this.PIXEL_PRO_METER = PIXEL_PRO_METER; schedExecService = Executors.newSingleThreadScheduledExecutor(); } double PHI = 0.0; public void run() { //println(" ++++ SENDE NEUE NACHRICHTEN ++++"); setzePosition(ID[0],0.0 +PHI ,100); setzePosition(ID[1],0.5*Math.PI+PHI,100); setzePosition(ID[2],1.0*Math.PI+PHI,100); setzePosition(ID[3],1.5*Math.PI+PHI,100); PHI += 2.0*Math.PI / 200.0; // 50ms == 20mal pro Sek. => /200 10 Sek. pro Umdrehung, // Auflösung 360/200 = 1,8 Grad // } public void draw() { noStroke(); //Raum einzeichnen: fill(100,100,100); rect((float)(BREITE/2)-0.5f*(float)(BRAUM*PIXEL_PRO_METER), (float)(HOEHE/2) -0.5f*(float)(HRAUM*PIXEL_PRO_METER), (float)(BRAUM*PIXEL_PRO_METER), (float)(HRAUM*PIXEL_PRO_METER)); fill(100,100,255); rect((float)(BREITE/2)-0.5f*0.6f*(float)(BRAUM*PIXEL_PRO_METER), (float)(HOEHE/2) -0.5f*(float)(HRAUM*PIXEL_PRO_METER), 0.6f*(float)(BRAUM*PIXEL_PRO_METER), 0.1f*(float)(HRAUM*PIXEL_PRO_METER)); for(int i=0;i<xy.length;i++) { if(aktiv[i]==true) { fill(rgb[i][0],rgb[i][1],rgb[i][2]); ellipse(xy[i][0],xy[i][1],HOEHE/40,HOEHE/40); } } } }
Code 0-6: Performance.pde
public class OSC { private String[] nachrichten = { "/WONDER/source/activate", "/WONDER/source/deactivate", "/WONDER/source/type", "/WONDER/source/position", "/WONDER/source/color" }; private String IP; private int PORT; NetAddress zielgeraet; NetAddress zielgeraetArdour; OscP5 oscP5; public void initialisieren() { oscP5 = new OscP5(this,PORT); zielgeraet = new NetAddress(IP,PORT); zielgeraetArdour = new NetAddress(IP,3819); } public void pause() { try { Thread.sleep(1); } catch(Exception e) { } } public OSC() { this.IP = "127.0.0.1"; this.PORT = 12000; } public OSC(String IP, int PORT) { this.IP = IP; this.PORT = PORT; } public void starteArdourquellen() { OscMessage myMessage = new OscMessage("/ardour/transport_play"); //myMessage.add(nr); oscP5.send(myMessage, zielgeraetArdour); pause(); } public void stoppeArdourquellen() { OscMessage myMessage = new OscMessage("/ardour/transport_stop"); //myMessage.add(nr); oscP5.send(myMessage, zielgeraetArdour); pause(); } public void aktiviereQuelle(int nr) { OscMessage myMessage = new OscMessage(nachrichten[0]); myMessage.add(nr); oscP5.send(myMessage, zielgeraet); pause(); } public void deaktiviereQuelle(int nr) { OscMessage myMessage = new OscMessage(nachrichten[1]); myMessage.add(nr); oscP5.send(myMessage, zielgeraet); pause(); } public void setzeAlsPunktquelle(int nr) { OscMessage myMessage = new OscMessage(nachrichten[2]); myMessage.add(nr); myMessage.add(1); oscP5.send(myMessage, zielgeraet); pause(); } /* public void setzePosition(int nr, float x, float y) { OscMessage myMessage = new OscMessage(nachrichten[3]); myMessage.add(nr); myMessage.add(new Float(x)); myMessage.add(new Float(y)); oscP5.send(myMessage, zielgeraet); pause(); } */ public void setzePosition(int nr, float x, float y) { OscMessage myMessage = new OscMessage(nachrichten[3]); myMessage.add(nr); myMessage.add(new Float(x)); myMessage.add(new Float(y)); myMessage.add(new Float(50.0f/1000.0f)); //50ms Thread oscP5.send(myMessage, zielgeraet); pause(); } public void setzeFarbe(int nr, int rot, int gruen, int blau) { OscMessage myMessage = new OscMessage(nachrichten[4]); myMessage.add(nr); myMessage.add(rot); myMessage.add(gruen); myMessage.add(blau); oscP5.send(myMessage, zielgeraet); pause(); } void oscEvent(OscMessage theOscMessage) { /* print the address pattern and the typetag of the received OscMessage */ print("OSC-Nachricht empfangen:"); String name = theOscMessage.addrPattern(); print("Name: "+name); println(" typetag: "+theOscMessage.typetag()); for(int i=0;i<nachrichten.length;i++) { if(name.equals(nachrichten[i])) { println("Nachricht wurde identifiziert:"); switch(i) { case 0: int nr0 = theOscMessage.get(0).intValue(); println("**** QUELLE mit ID "+nr0+" AN ****"); break; case 1: int nr1 = theOscMessage.get(0).intValue(); println("**** QUELLE mit ID "+nr1+" AUS ****"); break; case 2: int nr2 = theOscMessage.get(0).intValue(); int typ = theOscMessage.get(1).intValue(); println("**** SETZE QUELLE mit ID "+nr2+" ALS TYP "+typ+" ****"); break; case 3: int nr3 = theOscMessage.get(0).intValue(); float x = theOscMessage.get(1).floatValue(); float y = theOscMessage.get(2).floatValue(); println("**** SETZE QUELLE mit ID "+nr3+" AN POSITION x="+x+" y="+y+" ****"); break; case 4: int nr4 = theOscMessage.get(0).intValue(); int rot = theOscMessage.get(1).intValue(); int gruen = theOscMessage.get(2).intValue(); int blau = theOscMessage.get(3).intValue(); println("**** SETZE QUELLE mit ID "+nr4+" MIT FARBE rot="+rot+" gruen="+gruen+" blau="+blau+" ****"); break; } break; } } } }
Code 0-7: OSC.pde