–––
Interface
Inhalt
Bild: Bildfilter
Video: Lochmaske/Linienmuster
OSC Netzwerk: Sender/Empfänger/touchOSC
Audio: Pegel/Mikrofoneingang/Synthesizer
Mindwave: Gehirnwellen
LeapMotion: Virtuelle Leinwand
controlP5: Digitale Fader
Kinect: Freisteller/Punktwolke
Myo: Gestensteuerung
MIDI-Controller: Drehregler und Buttons
Information und Kommunikation
Sammlung von Processing-Codebeispielen für verschiedenste Interfaces: Jedes der
Beispiele umfasst nur das Notwendigste und ist als Gerüst für eigene Projekte gedacht.
Für die Funktionsfähigkeit der Beispiele muss in der Regel eine externe Library in
Processing eingebunden werden und das verwendete Gerät physisch an den Rechner angeschlossen
sein. Die Sammlung umfasst folgende Themen: Bildfilter, Videofilter, OSC-Netzwerk,
Mikrofoneingang, Audioplayer, Synthesizer, Mindwave, LeapMotion, controlP5, Kinect und Myo.
–––
Bild
Bildfilter
PImage img;
void setup() {
size(800, 600);
img = loadImage(“80x60px.png“);
fill(0);
noStroke();
}
void draw() {
for (int x = 0; x < img.width; x = x + 1) {
for (int y = 0; y < img.height; y = y + 1) {
color c = img.pixels[y*img.width+x];
int graustufe = round(red(c)*0.222 + green(c)*0.707 + blue(c)*0.071);
float radius = map(graustufe, 0,255, 10,0);
int pixelabstand = 10;
ellipse (x*pixelabstand, y*pixelabstand, radius, radius);
}
}
}
zurück zur Übersicht
–
Video
Lochmaske
import processing.video.*;
int rX, rY, xypos;
Capture webcam;
void setup() {
size (1280, 720);
noStroke ();
String[] kameraliste = Capture.list();
webcam = new Capture(this, kameraliste[0]);
webcam.start();
}
void draw() {
background (0);
rX = 10; // rasterweite X
rY = 10; // rasterweite Y
if (webcam.available() == true) {
webcam.read();
webcam.loadPixels();
}
for (int x = 0; x < webcam.width; x = x + rX) {
for (int y = 0; y < webcam.height; y = y + rY) {
xypos = y*webcam.width + x; // Zeilen berechnen
color c = webcam.pixels[xypos];
fill (c);
rect (x, y, 2, 2);
}
}
}
Linienmuster
import processing.video.*;
int rX, rY, xypos;
Capture webcam;
void setup() {
size (1280, 720);
noStroke ();
String[] kameraliste = Capture.list();
webcam = new Capture(this, kameraliste[0]);
webcam.start();
}
void draw() {
background (0);
rX = 1; // rasterweite X
if (webcam.available() == true) {
webcam.read();
webcam.loadPixels();
}
int y = webcam.height/2;
for (int x = 0; x < webcam.width; x = x + rX) {
xypos = y*webcam.width + x; // Zeilen berechnen
color c = webcam.pixels[xypos];
stroke (c);
line (x, 0, x, webcam.height);
}
}
zurück zur Übersicht
–––
OSC Netzwerk
Sender
import oscP5.*;
import netP5.*;
OscP5 meinComputer;
NetAddress zielComputer;
float posX = 0;
float posY = 0;
void setup() {
size(400,400);
meinComputer = new OscP5(this,8001);
zielComputer = new NetAddress("10.0.2.95",8000);
}
void draw() {
background(0);
ellipse (posX, posY, 40, 40);
posX = mouseX;
OscMessage xNachricht = new OscMessage("/x");
xNachricht.add(posX);
meinComputer.send(xNachricht, zielComputer);
posY = mouseY;
OscMessage yNachricht = new OscMessage("/y");
yNachricht.add(posY);
meinComputer.send(yNachricht, zielComputer);
}
Empfänger
import oscP5.*;
import netP5.*;
OscP5 meinComputer;
NetAddress zielComputer;
float posX = 0;
float posY = 0;
void setup() {
size(400,400);
meinComputer = new OscP5(this,8000);
zielComputer = new NetAddress("10.0.2.4",8001);
}
void draw() {
background(0);
rect (posX, posY, 40, 40);
}
void oscEvent(OscMessage Nachricht) {
print("OSC-Nachricht eingegangen.");
print("Nachrichtenname: " +
Nachricht.addrPattern());
if (Nachricht.checkAddrPattern("/x")) {
posX = Nachricht.get(0).floatValue();
println("X-Koordinate: " + posX);
}
if (Nachricht.checkAddrPattern("/y")) {
posY = Nachricht.get(0).floatValue();
println("Y-Koordinate: " + posY);
}
}
touchOSC
import oscP5.*;
import netP5.*;
OscP5 oscP5;
float breite = 0.5;
float hoehe = 0.5;
void setup() {
size(400,400);
frameRate(25);
// Port 8000 für eingehende Nachrichten
oscP5 = new OscP5(this,8000);
}
void oscEvent(OscMessage nachricht) {
String addr = nachricht.addrPattern();
float val = nachricht.get(0).floatValue();
if (addr.equals("/fader/breite")) breite = val;
if (addr.equals("/fader/hoehe")) hoehe = val;
}
void draw() {
background(0);
ellipse(width/2, height/2, breite*400, hoehe*400);
}
zurück zur Übersicht
–––
Audio
Pegel
import processing.sound.*;
SoundFile song;
Amplitude pegel;
float durchmesser;
void setup() {
size (400, 400);
fill (255);
song = new SoundFile(this, "songmono.aiff");
song.loop();
pegel = new Amplitude(this);
pegel.input(song);
}
void draw() {
background (0);
durchmesser = pegel.analyze(); // 0 bis 1
durchmesser = durchmesser * 600; // Skalieren
ellipse (width/2, height/2,
durchmesser, durchmesser);
}
Pegelglättung
import processing.sound.*;
SoundFile song;
Amplitude pegel;
float durchmesser, signal, summe;
void setup() {
size (400, 400);
fill (255);
song = new SoundFile(this, "songmono.aiff");
song.loop();
pegel = new Amplitude(this);
pegel.input(song);
}
void draw() {
background (0);
signal = pegel.analyze(); // Wert 0 bis 1
summe = summe + (signal - summe) * 0.25;
// Signalglättung 0.1 bis 1
durchmesser = summe * 600; // Wert skalieren
ellipse (width/2, height/2, durchmesser, durchmesser);
}
Mikrofoneingang
import processing.sound.*;
AudioIn mikrofon;
Amplitude pegel;
float durchmesser;
void setup() {
size (400, 400);
// Eingangskanal 0
mikrofon = new AudioIn(this, 0);
mikrofon.start();
pegel = new Amplitude(this);
pegel.input(mikrofon);
}
void draw() {
background (0);
fill (255);
mikrofon.amp(1); // Eingangstärke 0 bis 1
durchmesser = pegel.analyze(); // 0 bis 1
durchmesser = durchmesser * 350;
ellipse (width/2, height/2,
durchmesser, durchmesser);
}
Synthesizer
import processing.sound.*;
TriOsc oszillator; // Synthesizerobjekt
Env huellkurve; // Hüllkurvenobjekt
// Huüllkurve
float A = 0.001; // AttackTime
float D = 0.004; // DecayTime, SustainTime
float S = 0.3; // SustainLevel
float R = 0.2; // ReleaseTime
float lautstaerke = 0.8;
// Midi-Noten
int[] noten = { 60, 61, 62, 63, 64,
65, 66, 67, 68, 69, 70, 71, 72};
int geschwindigkeit = 200; // Millisekunden
int metronom = millis(); // Taktgeber
int notenzaehler = 0; // Position in Notensequenz
void setup() {
size (400, 400);
background (255);
oszillator = new TriOsc(this);
huellkurve = new Env(this);
}
void draw() {
R = map( mouseX, 0 , width, 0, 0.2 ); // Skalierung
if ((millis() > metronom) && (notenzaehler < noten.length)){
oszillator.play( midiToFreq (noten[notenzaehler]), lautstaerke );
huellkurve.play( oszillator, A, D, S, R ); // Huüllkurve anwenden
metronom = millis() + geschwindigkeit; // Taktgeber
notenzaehler = notenzaehler + 1; // Nächste Note in Sequenz
if (notenzaehler == 12) {notenzaehler = 0;} // Notensequenzloop
}
}
// Midinote in Frequenzhöhe umrechnen
float midiToFreq( int note ){
return (pow(2, ((note-69)/12.0)))*440;
}
zurück zur Übersicht
–––
Mindwave
Gehirnwellen
import processing.serial.*;
import pt.citar.diablu.
processing.mindset.*;
MindSet gehirnwellen; // Mindwaveobjekt
int konzentration;
import processing.sound.*;
TriOsc oszillator; // Synthesizerobjekt
Env huellkurve; // Hüllkurvenobjekt
float lautstaerke = 0.8;
int frequenz = 0;
void setup() {
size (400, 400);
background (255);
fill (255);
noStroke ();
oszillator = new TriOsc(this);
huellkurve = new Env(this);
gehirnwellen = new MindSet (this, "/dev/tty.MindWave");
}
void draw() {
background (map(konzentration, 0, 100, 0, 255));
rect (width/2-5, height, 10, -konzentration*4);
lautstaerke = map(konzentration, 0, 100, 0.8, 0.1);
frequenz = int(map(konzentration, 0, 100, 0, 80));
oszillator.play (frequenz, lautstaerke);
huellkurve.play (oszillator, 0.001, 0.004, 0.3, 0.2);
println ("Konzentration " + konzentration);
}
void attentionEvent(int attentionLevel) {
konzentration = attentionLevel;
}
zurück zur Übersicht
–––
LeapMotion
Virtuelle Leinwand
import java.util.Map;
import java.util.concurrent.
ConcurrentMap;
import java.util.concurrent.
ConcurrentHashMap;
import com.leapmotion.leap.Controller;
import com.leapmotion.leap.Finger;
import com.leapmotion.leap.Frame;
import com.leapmotion.leap.Vector;
import com.leapmotion.leap.
processing.LeapMotion;
LeapMotion leinwand;
ConcurrentMap<Integer, Vector> fingerPositions;
void setup()
{
size(800, 800);
background(0);
stroke(0);
strokeWeight(2);
frameRate(60);
leinwand = new LeapMotion(this);
fingerPositions = new ConcurrentHashMap<Integer, Vector>();
}
void draw() {
for (Map.Entry entry : fingerPositions.entrySet()) {
Vector position = (Vector) entry.getValue();
float x = leinwand.leapToSketchX (position.getX());
float y = leinwand.leapToSketchY (position.getY());
stroke( map(x,0,800,0,255), map(y,0,800,0,255), 255 );
point (x, y);
}
}
void onFrame(final Controller controller) {
Frame frame = controller.frame();
fingerPositions.clear();
for (Finger finger : frame.fingers()) {
int fingerId = finger.id();
fingerPositions.put(fingerId, finger.tipPosition());
}
}
zurück zur Übersicht
–––
controlP5
Digitale Fader
import controlP5.*;
ControlP5 cp5;
int hintergrundfarbe = 100;
int durchmesser = 100;
void setup() {
size(400,400);
noStroke();
cp5 = new ControlP5(this); // Faderobjekt
cp5.addSlider("hintergrundfarbe")
.setPosition(10, 10)
.setRange(0,255)
;
cp5.addSlider("durchmesser")
.setPosition(10, 30)
.setRange(0,350)
;
}
void draw() {
background(hintergrundfarbe);
ellipse(width/2, height/2, durchmesser, durchmesser);
}
zurück zur Übersicht
–––
Kinect
Freisteller
import org.openkinect.freenect.*;
import org.openkinect.processing.*;
Kinect kamera; // Kameraobjekt definieren
int minTiefe = 0;
int maxTiefe = 800; // maximal 2048
float kamerawinkel = 30; // zwischen 0 und 30
int pixelabstand = 8;
float durchmesser;
void setup() {
size (620, 480);
noFill ();
stroke (255);
kamera = new Kinect(this); // Kameraobjekt erstellen
kamera.initDepth(); // Tiefeninformation des Bildes aktivieren
kamera.setTilt(kamerawinkel); // Kamerawinkel verändern
}
void draw() {
background(0);
int[] dataTiefe = kamera.getRawDepth(); // Tiefeninformation 0 bis 2048
for (int x = 0; x < kamera.width; x = x + pixelabstand) {
for (int y = 0; y < kamera.height; y = y + pixelabstand) {
if (dataTiefe[ y*kamera.width + x ] < maxTiefe) {
durchmesser = map (dataTiefe[ y*kamera.width + x ], 0, 2048, 0, 200);
ellipse (x, y, durchmesser, durchmesser);
}
}
}
}
Punktwolke
import org.openkinect.freenect.*;
import org.openkinect.processing.*;
Kinect kamera;
float[] tiefenmeter = new float[2048];
float drehung = 0;
void setup() {
size(800, 600, P3D);
kamera = new Kinect(this);
kamera.initDepth();
for (int n = 0; n < tiefenmeter.length; n++) {
tiefenmeter[n] = tiefe_in_meter (n);
}
}
void draw() {
background (0);
translate (width/2, height/2, -50);
rotateY (drehung);
int[] tiefe = kamera.getRawDepth();
int filter = 4;
float zoom = 800;
for (int x = 0; x < kamera.width; x += filter) {
for (int y = 0; y < kamera.height; y += filter) {
int xypos = y*kamera.width + x; // XY-Welt
int tiefenWert = tiefe[xypos]; // Tiefe
if (tiefenWert < 800) { // Freisteller
PVector v = tiefe_zu_welt (x, y, tiefenWert); // XYZ-Welt
stroke(255); // Zeichenelement
pushMatrix();
translate (v.x*zoom, v.y*zoom, zoom - v.z*zoom);
rect (0, 0, 1, 1);
popMatrix();
}
}
}
drehung += 0.015f;
}
float tiefe_in_meter (int tiefenWert) { // 0 bis 2048 in Metern
if (tiefenWert < 2047) {
return (float)(1.0 / ((double)(tiefenWert)
* -0.0030711016 + 3.3309495161));
}
return 0.0f;
}
PVector tiefe_zu_welt (int x, int y, int tiefenWert) {
final double fx_d = 1.0 / 5.9421434211923247e+02;
final double fy_d = 1.0 / 5.9104053696870778e+02;
final double cx_d = 3.3930780975300314e+02;
final double cy_d = 2.4273913761751615e+02;
PVector result = new PVector();
double tiefe = tiefenmeter[tiefenWert];
result.x = (float)((x - cx_d) * tiefe * fx_d);
result.y = (float)((y - cy_d) * tiefe * fy_d);
result.z = (float)(tiefe);
return result;
}
zurück zur Übersicht
–––
Myo
Gestensteuerung
import de.voidplus.myo.*;
Myo myo;
float durchmesser = 10;
void setup() {
size (400, 400);
noStroke ();
rectMode (CENTER);
background (0);
fill (0);
myo = new Myo(this);
}
void draw() {
ellipse (width/2, height/2, durchmesser, durchmesser);
}
void myoOnPose (Myo myo, long timestamp, Pose pose) {
switch (pose.getType()) {
case FIST:
rect(width/2, height/2, durchmesser, durchmesser);
myo.vibrate();
break;
case FINGERS_SPREAD:
background (0);
fill (255);
break;
case DOUBLE_TAP:
background(255);
fill(0);
break;
case WAVE_IN:
durchmesser = durchmesser - 25;
break;
case WAVE_OUT:
durchmesser = durchmesser + 25;
break;
default:
break;
}
}
zurück zur Übersicht
–––
MIDI-Controller
Drehregler und Buttons
import themidibus.*;
MidiBus meinBus;
float breite, hoehe;
boolean schalter;
void setup() {
size(800, 800);
noFill();
MidiBus.list();
// individuelle Anpassung anhand der Avaible MIDI Devices Liste im Datafenster
// Suche deinen Controller in der Input- und Outputliste
meinBus = new MidiBus(this, 2, 3); // hier: 2 für Input, und 3 für Output
schalter = true;
breite = 400;
hoehe = 400;
}
void draw() {
background(255);
ellipse(400, 400, breite, hoehe);
if (schalter == true) fill(0);
if (schalter == false) noFill();
}
void controllerChange(int ch, int num, int val) {
println ("ch ", ch, " num ", num, " val ", val);
if (num == 21) breite = map(val, 0, 127, 10, 400);
if (num == 22) hoehe = map(val, 0, 127, 10, 400);
}
void noteOn (int ch, int pitch, int vel) {
println ("ch ", ch, " pitch ", pitch + " vel ", vel);
if (pitch == 9) schalter = !schalter;
}
zurück zur Übersicht