kramann.info
© Guido Kramann

Login: Passwort:










6 Demonstratoren

6 (EN google-translate)

6 (PL google-translate)

Um bei dem Treffen mit den Tänzern am Montag 22.10. auch einen Eindruck davon vermitteln zu können, was technisch machbar ist und wie das Gesamtszenario am 17.12. aussehen könnte, werden an dem Termin eine Reihe Demonstrationen dazu gemacht, wie Klang und wie Licht durch tänzerische Bewegungen gesteuert werden könnte.

Die Demonstratoren zeigen immer nur Einzelaspekte auf. Natürlich ist die Grundidee alles mit allem in weiter entwickelter Weise kombinieren zu können.

Teilweise sind die Programm minimalistisch gehalten, um sie leicht verstehen und selber ausnutzen zu können, teilweise sind sie so aufwändig gemacht, dass sie auch bereits ästhetisch überzeugen sollten.

Demonstrator Nr.1: Ein dynamisches Beamerbild mit dem Smartphone steuern

Eine einfache Smartphone-App sendet die drei Sensordaten vom dreiachsigen Beschleunigungsaufnehmer an ein Processing-Programm auf dem PC.

Am PC werden die Sensordaten in Farbinformationen umgerechnet und als Bild dargestellt.

Spezielle Grundidee: Eine Veränderung breitet sich wellenförmig über das Bild aus.

Wichtige Hinweise:
  • Die IP des PCs kann sich ändern und muß immer im Senderprogramm auf dem Smartphone angepaßt werden.
  • Vorteil dieser Anordnung, auch wenn es um Sound geht: Der PC ist schnell und als Smartphone reichen kleine billige Geräte aus.
import ketai.sensors.*;

//Für daten über W-Lan zu senden:
import oscP5.*;
import netP5.*;

OscP5 oscP5;
NetAddress myRemoteLocation;

KetaiSensor sensor;

float XX, YY, ZZ;
float LAENGE=1.0f;
int R=0,G=0,B=0;

String IP_VON_ZIEL_PC = "172.20.246.84"; //IP des Ziel-PCs über W-LAN. ANPASSEN!!!
//Außerdem: Smartphone muß auch im W-LAN angemeldet werden.

//WICHTIG:
//Bei Android->Sketch-Permissions INTERNET anhaken !!!!!!!!!

void setup()
{
  oscP5 = new OscP5(this,12000);
  myRemoteLocation = new NetAddress(IP_VON_ZIEL_PC,12000);
  
  fullScreen();
  orientation(LANDSCAPE);
  textSize(32);
  
  sensor = new KetaiSensor(this);
  sensor.start();
}

public void draw()
{
     background(R,G,B);
     fill(0);
     text("x="+XX,50,50);
     text("y="+YY,50,100);
     text("z="+ZZ,50,150);
}

int ZZZ=0;
void onAccelerometerEvent(float x, float y, float z)
{
  XX += 0.01f*(x - XX);
  YY += 0.01f*(y - YY);
  ZZ += 0.01f*(z - ZZ);
  
  LAENGE = sqrt(XX*XX+YY*YY+ZZ*ZZ);
  
  if(LAENGE<0.000000001f)
      LAENGE = 9.81f;
  XX/=LAENGE;
  YY/=LAENGE;
  ZZ/=LAENGE;
  
  if(ZZZ>=5)
  {
      OscMessage myMessage = new OscMessage("/XYZ");
  
      myMessage.add((int)(XX*1000.0f)); /* add an int to the osc message */
      myMessage.add((int)(YY*1000.0f)); /* add an int to the osc message */
      myMessage.add((int)(ZZ*1000.0f)); /* add an int to the osc message */
  
      /* send the message */
      oscP5.send(myMessage, myRemoteLocation);     

               R = (255*((int)(XX*1000.0)+1000))/2000;
               G = (255*((int)(YY*1000.0)+1000))/2000; 
               B = (255*((int)(ZZ*1000.0)+1000))/2000;
    
    
      ZZZ=0;    
  }
  
  ZZZ++;
}

Code 6-1: D1a_smartphone

import oscP5.*;
import netP5.*;

int R=0,G=0,B=0;

OscP5 oscP5;
int[][] zeilenfarben;
int index_offset = 0;
void setup()
{
    oscP5 = new OscP5(this,12000);  
    fullScreen();
    zeilenfarben = new int[height][3];
    frameRate(30);  
}

public void draw()
{
     background(R,G,B);
     for(int ii=0;ii<zeilenfarben.length;ii++)
     {
           int i = (index_offset - ii + zeilenfarben.length) % zeilenfarben.length;
           stroke(zeilenfarben[i][0],zeilenfarben[i][1],zeilenfarben[i][2]);
           line(0,ii,width-1,ii);
     }
     fill(R,G,B);
     ellipse(width/2,height/2,width,height);
}

void oscEvent(OscMessage theOscMessage) 
{
    if(theOscMessage.checkAddrPattern("/XYZ")==true)
    {
         if(theOscMessage.checkTypetag("iii"))
         {
               int x = theOscMessage.get(0).intValue();  
               int y = theOscMessage.get(1).intValue();  
               int z = theOscMessage.get(2).intValue();
               R = (255*(x+1000))/2000;
               G = (255*(y+1000))/2000; 
               B = (255*(z+1000))/2000;
               zeilenfarben[index_offset][0] = R; 
               zeilenfarben[index_offset][1] = G;
               zeilenfarben[index_offset][2] = B;
               index_offset++;
               index_offset%=zeilenfarben.length;
         }
    }
}

Code 6-2: D1b_PC

D1a_smartphone.zip
D1b_PC.zip

Demonstrator Nr.2: Fließender Übergang zwischen verschiedenen Dreiklängen und Rhythmen

Mittels Android-Processing-VR wird die Orientierung des Smartphones im Raum erfaßt und jeder von 6 orthogonalen Raumrichtungen ein Dreiklang und noch einmal ein Rhythmus für jeden Ton zugeordnet (plus eine Wechselnote im diatonischen Terzabstand).

Es wurden 4 Varianten erstellt:

  • Demonstrator110b_VR -- VR & Percussion
  • Demonstrator110_VRkonti -- VR & Orgel
  • Demonstrator109b_ketai -- Ketai & Percussion
  • Demonstrator109_kontinuum -- Ketai & Orgel
Hinweise
  • Die Wav-Klänge wurden mit Capella, sox und fluidsynth aus Soundfonts gewonnen. Siehe dazu:
www.kramann.info/92_Soundinstallation/03_material/11_Snippets/03_Generating_Soundfiles
  • Der Sound wird sinnvollerweise an Bluetooth-Lautsprecher gestreamt.
  • Dies ist aber sehr Datenlastig und kann zu Latenzzeiten (Verzögerungen) führen.
  • Schneller und besser für Echtzeitanwendungen ist das Konzept nur Daten vom Smartphone aus an einen PC zu senden und den Sound dort generieren zu lassen.
  • Vorteil wenn das Smartphone den Sound erzeugt liegt aber in der Kompaktheit und Sicherheit des Konzeptes.

Unterschied VR zu Ketai: VR liefert eine Orientierung um Raum, Ketai nur die relative Orrientierung gegenüber dem Schwerkraftvektor.


Demonstrator109b_ketai.zip
Demonstrator109_kontinuum.zip
Demonstrator110b_VR.zip
Demonstrator110_VRkonti.zip
  • Luise tanzt mit Nr.2

Demonstrator Nr.3: Virtuelle Töne verschießen, die an einer Wand abprallen

Grundidee: Eine sehr bekannte musikalische Form ist der Imitations-Kanon. Hier setzt eine zweite Stimme zeitlich versetzt ein und wiederholt alles, was die erste gebracht hat. Dann folgen ggf. weitere Stimmen. Beispiele sind: "Der Hahn ist tot", "Bruder Jakob" u.ä. Den Effekt des Kanons oder Echos kann man sich ins Räumliche gedacht auch so vorstellen, dass ein Ton durch Schütteln des Smartphones ausgelöst wird und dann den Spieler/Tänzer radial verläßt, um schließlich auf eine "Wand" zu treffen, die man sich kreisförmig um den Spieler herum bestehend vorstellen kann. Beim Auftreffen auf diese Wand wird der Ton wiederholt. Die Tonhöhe und andere musikalische Parameter könnten sich durch die Schleuderrichtung bestimmen lassen.


Durch die zeitlich immer in gleicher Weise verzögerte Antwort, etabliert sich ein fester Rhythmus in Wechselwirkung mit dem Spieler/Tänzer.


Dies ist auch ein Beispiel für einen musikalischen Algorithmus mit "Gedächtnis". Hier kann man sich auch wesentlich komplexere Dinge vorstellen, wie das Erfassen zeitlich ausgedehnter Gesten u.ä.

Überschreitet die Komplexität ein gewisses Maß, oder ist so ein Algorithmus einfach ziemlich kompliziert, so wird der Zusammenhang zwischen Bewegung und Klang langsam zwar interesant, aber verliert seine Transparenz/Durchschaubarkeit. Hier gilt es ein gutes Maß für Beides zu finden.

Als Analogon dazu denke man an Filmmusik: Bei Zeichentrickfilmen trifft man oft auf das s.g. Mickeymousing, bei dem jede Bewegung mit einem bestimmten Klang verknüpft ist. Als Gegenpol gibt es Musik, die die aktuelle Stimmung atmosphärisch widergibt, aber kaum einen bezug zu einzelnen Bewegungen hat.

Screenshot vom PC-Programm

Bild 6-1: Screenshot vom PC-Programm

D3a_smartphone_virtuellerBall.zip -- Smartphone-Sketch. PC-IP ANPASSEN!!!
D3b_PC_virtuellerBall.zip -- PC-Sketch.

Demonstrator Nr.4: Lichtharfe mit Hilfe einer USB-Kamera

  • Luise und Michael tanzen mit Nr.4
Klangkunst06.zip -- PC-Sketch für Lichtharfe.

Demonstrator Nr.5: Jede Achsrichtung ein Tonschlag + Wasserrauschen

  • Michael tanzt mit Nr.5
Demonstrator008_VR.zip -- Android-Sketch für Nr.5