Willkommen auf unserem Seminar-Blog

Immer auf dem aktuellen Stand bleiben

Dieser Seminar-Blog befindet sich noch im Aufbau und wird in den kommenden Tagen entsprechend verfeinert.

Member Login

Lost your password?

Registration is closed

Sorry, you are not allowed to register by yourself on this site!

You must either be invited by one of our team member or request an invitation by email at viad.info {at} zhdk {dot} ch.

Processing Tutorial

Grundlagen

Grundlage für die Umsetzung eurer Konzepte als funktionale Prototypen sollte eine genaue Übersicht der zu erstellenden Events sein. Am besten gliedert man diese Events nach folgenden Kriterien: 1. Reale Interaktion (Drehen, Drücken, Bewegen, usw.) 2. Logik und Mapping (Wenn...dann..., Wenn...und...dann...,usw.) 3. Übergabe (Midi Note, Controller Change, usw.) Diese Übersicht dient dann als Vorlage für die Umsetzung. Arduino werden wir für die Aufnahme der realen Interaktionen nutzen. In Processing werden die Logik, das Mapping und die Übergabe per Midi gestaltet. Der Ablauf sieht dann folgendermassen aus: 1. Aufnahme reale Interaktion (Arduino) 2. Übergabe der Werte an Processing (Serielle Kommunikation) 3. Berechnung der Logik und des Mappings (Processing) 4. Übergabe der Werte an MuLab (TheMidiBus) Für die Auswahl der entsprechenden Sensoren und deren Auslesen mit dem Arduino sei hier auf die Blog-Seite des Physical Computing Kurses (http://blogs.iad.zhdk.ch/physical-computing-hs-12/) verwiesen. Dort findet man auch die Informationen für die Weitergabe der Werte an Processing (http://blogs.iad.zhdk.ch/physical-computing-hs-12/08-arduino-und-processing/). Die Programmierung der Logik und des Mappings in Processing wird für jede Gruppe unterschiedlich sein und ist deshalb nicht Teil dieses Tutorials.

Processing zu MIDI

Für die Übergabe der Werte von Processing an MuLab verwenden wir die Library "TheMidiBus" (http://www.smallbutdigital.com/themidibus.php). Diese müsst ihr herunterladen und in euer Processing-Library-Verzeichniss kopieren (z.B. "Users/itz/Documents/Processing/libraries/). Dann stehen euch die Funktionen der Library zur Verfügung. Es gibt im wesentlichen zwei Arten von Midi Signalen, welche ihr mit Hilfe der MidiBus-Library erstellen könnt. Diese orientieren sich an den Signalen, die ihr auch mit den Midi-Keyboards auslösen könnt. 1. sendMidiNote(channel, pitch, velocity) channel = Kanal auf dem gesendet wird pitch = Tonhöhe velocity = Anschlag Die Funktion sendMidiNote() könnt ihr verwenden, wenn ihr ON/OFF Events an MuLab übergeben möchtet. Sie entspricht den Tastenanschlägen auf der Midi-Tastatur. 2. sendControllerChange(channel, number, value) channel = Kanal auf dem gesendet wird number = Nummer des Controllers value = Wert der gesendet werden soll Die Funktion sendControllerChange() wird verwendet, falls eine kontinuierliche Veränderung hervorgerufen werden soll. Sie entspricht dem drehen eines Reglers aus der Midi-Tastatur. Im folgenden ein kleines Beispiel, das demonstriert, wie sowohl eine MidiNote, wie auch ein ControllerChange gesendet werden kann.
import themidibus.*; //Import MidiBus library

MidiBus myBus; //Name for the Instance of MidiBus

//Values for sending a note
int channel = 1;
int pitch = 64;
int velocity = 127;

//Values for sending a controllerChange
int number = 20;
int value = 0;
int oldValue = 0;

void setup() 
{
  size(400, 400);
  background(0);

  MidiBus.list(); // List all available Midi devices
  myBus = new MidiBus(this, "", "P5toMIDI"); //Mac
  //myBus = new MidiBus(this, "", ""); //Win
}

void draw() 
{
  value = int(map(mouseX, 0, width, 0, 127));

  if (value!=oldValue)
  {
    myBus.sendControllerChange(channel, number, value);
  }

  oldValue = value;
}

void keyPressed()
{
  switch(key)
  {
  case 'a':
    myBus.sendNoteOn(channel, pitch, velocity); // Send a Midi noteOn
    break;
  }
}

void keyReleased()
{
  switch(key)
  {
  case 'a':
    myBus.sendNoteOff(channel, pitch, velocity); // Send a Midi nodeOff
    break;
  }
}

Processing zu OSC

Wenn Werte von Processing aus an weitere Applikationen (z.B. MAX) übergeben werden sollen, oder wenn in Processing Werte aus diesen Programmen empfangen werden sollen, verwenden wir die Processing Library oscP5 (http://www.sojamo.de/libraries/oscP5/). Diese muss ebenfalls heruntergeladen werden und dann im library Ordner von Processing platziert werden. Um diese nun per OSC an einen anderen Computer zu versenden müssen wir zunächst die OSC Library initialisieren:
import oscP5.*; // Import the OSC Libary
import netP5.*; // Import the net Library

OscP5 oscP5; // Make an instance of the OSC Library
NetAddress myRemoteLocation; // Set a net Address
Im nächsten Schritt übergeben wir die Werte für die OSC Kommunikation innerhalb des setup():
void setup()
{
  ...
  oscP5 = new OscP5(this,12000); // start oscP5, listening for incoming messages at port 12000  
  myRemoteLocation = new NetAddress("172.31.224.73",12000); // The Address defined here is the Address of the Receiver
  ...
}
Um ausgehende Daten zu handeln kreiert man nun lediglich eine neue OSC Message, hängt die zu schickenden Daten (in unserem Fall die Werte des Potentiometers) an und versendet dann das gesamte Packet:
  OscMessage myMessage = new OscMessage("Arduino"); // New Message 
  myMessage.add(theData); // Add Data
  oscP5.send(myMessage, myRemoteLocation); // Send Message
Ausgangspunkt für den Versand bzw. das Empfangen von Daten bilden folgende zwei Beispiele:
import oscP5.*; // Import the OSC Libary
import netP5.*; // Import the net Library
  
OscP5 oscP5; // Make an instance of the OSC Library
NetAddress myRemoteLocation; // Set a net Address

void setup() 
{
  size(400,400);
  oscP5 = new OscP5(this,0000); // start oscP5, listening for incoming messages at port 12000 
  myRemoteLocation = new NetAddress("172.31.224.95",1111); // The Address defined here is the Address of the Receiver
}


void draw() 
{
  background(0);  
  sendOSC(255);
}

void sendOSC(int theData)
{
  OscMessage myMessage = new OscMessage("Moritz"); // New Message 
  myMessage.add(theData); // Add Data
  oscP5.send(myMessage, myRemoteLocation); // Send Message
}
import oscP5.*;
import netP5.*;

OscP5 oscP5;
//NetAddress myRemoteLocation;

void setup() 
{
  size(800, 400);
  oscP5 = new OscP5(this, 7777);
  //myRemoteLocation = new NetAddress("localhost",12000);
}


void draw() 
{
}

void oscEvent(OscMessage theOscMessage) 
{
  print("### received an osc message.");
  println(" addrpattern: "+theOscMessage.addrPattern());
  //print(" typetag: "+theOscMessage.typetag());  
  //print(millis());
  if(theOscMessage.addrPattern().equals("/CoM"))
  {
    println(theOscMessage.get(0).stringValue()+" "+theOscMessage.get(1).stringValue()+" "+theOscMessage.get(2).stringValue());
  }
}
Links: Anleitung IAC Driver unter MacOS MIDI Driver für Windows 1 MIDI Driver für Windows 2