3.1 Klangwiedergabe

Zunächst muss die in Processing für Sound zuständige Library importiert werden:


import processing.sound.*

Bevor ein Soundfile abgespielt werden kann muss es in den Speicher geladen werden. Zu diesem Zweck steht der Datentyp SoundFile zur Verfügung:


SoundFile track;

Das Objekt wird initialisiert, indem der Filename dem Konstruktor übergeben wird. Processing akzeptiert derzeit Sound-Dateien vom Typ .wav, .aiff und .mp3.


track = new SoundFile(this, 'song.mp3');

Da das Laden von Sound-Dateien von der Festplatte ein recht langsamer Vorgang ist, sollte die der entsprechende Code im setup()-Bereich des Sketches stehen (und somit den draw()-loop nicht ausbremsen).

Geladene Sounds lassen sich mit play() oder loop() abspielen.


track.play();

Folgende Funktionen stellt das SoundFile-Objekt zur Kontrolle der Wiedergabe bereit:

Funktion Aufgabe
play() Sound wiedergeben
loop() Sound in Schleife abspielen
pause() Wiedergabe pausieren
stop() Wiedergabe stoppen
amp() Lautstärke der Wiedergabe
pan() Position im Stereo-Spektrum einstellen
rate() Geschwindigkeit der Wiedergabe einstellen

Beispiel 3-1


import processing.sound.*;

SoundFile track;
float loudness, mouseRate;
boolean manipulate = false;;

void setup(){
  size(200,200);
  background(255);
  track = new SoundFile(this, "dot.mp3");
  track.play();  
}

void draw(){
  background(255);
  if (manipulate){
    loudness = map(mouseY, height, 0, 0.0, 1.0);
    println(loudness);
    track.amp(loudness);
    mouseRate = map(mouseX, 0, width, -1, 3);
    track.rate(mouseRate);
    line(mouseX, 0, mouseX, width);
    line(0, mouseY, height, mouseY);
  }
}

void keyPressed(){
  if (key == '0'){
     manipulate = !manipulate;
  }
  if (key == '1'){
     track.jump(0); 
     print(track.duration());
  }
  if (key == '2'){
     track.jump(track.duration()/2); 
  }  
}

Wie lässt sich eine Tastensteuerung realisieren, die es erlaubt in Schritten von 10 Sekunden vorwärts bzw. rückwärts zu springen?

Beispiel 3-2


import processing.sound.*;

PVector middle;
PVector point = new PVector();
float radius = 600;
float dotRadius = 80;
float time = 0;
float step = 360/120;

SoundFile bassdrum;
SoundFile snaredrum;
SoundFile high;

void setup(){
  size(800,800);
  background(255);
  rectMode(CENTER);
  middle = new PVector(width/2, height/2);
  bassdrum = new SoundFile(this, "bd.wav");
  snaredrum = new SoundFile(this, "sn.wav");
  high = new SoundFile(this, "hh.wav");
}

void draw(){
  fill(255, 50);
  rect(width/2,height/2,width, height);
  fill(0);
  if (time == step*0){
      ellipse(middle.x+sin(radians(time))*radius/2, middle.y+cos(radians(time))*radius/2, dotRadius, dotRadius);
      bassdrum.play();
  }
  if (time == step*60){
      rect(middle.x+sin(radians(time))*radius/3, middle.y+cos(radians(time))*radius/3, dotRadius/1.2, dotRadius/1.2);
      snaredrum.play();
  }
  if (time == step*30 || time == step*90){
      ellipse(middle.x+sin(radians(time))*radius/6, middle.y+cos(radians(time))*radius/6, dotRadius, dotRadius);
      high.play();
  }
  if(time < 360){
    time += step;
  } else {
    time = 0;
  }

  point.x = middle.x+sin(radians(time))*radius/2;
  point.y = middle.y+cos(radians(time))*radius/2;
  line(middle.x, middle.y, point.x, point.y);
  noFill();
  ellipse(middle.x, middle.y, radius, radius);
  ellipse(middle.x, middle.y, radius/1.5, radius/1.5);
  ellipse(middle.x, middle.y, radius/3, radius/3);
}

3.2 Klangeingabe

Durch das AudioIn-Objekt lassen sich Klangdaten der Soundkarte auslesen.


import processing.sound.*;
AudioIn in;

void setup() {
  size(200, 200);
  in = new AudioIn(this, 0);
  in.play();
  in.amp(0.1);
}      

void draw() {
}

Der Code bewirkt, dass das des eingebauten Mikrophons wiedergegeben wird. Da diese Wiedergabe gleichzeitig auch wieder aufgenommen wird entsteht eine Endlosschleife aus Klangartefakten.

Beispiel: I am sitting in a room (Alvin Lucier, 1969)

Beispiel: Cam & Sound-Input


import processing.video.*;          // Die Video-Library importieren
import processing.sound.*;

Amplitude amp;
AudioIn in;
Capture video;                          // Das Capture-Objekt deklarieren

float resX = 50;
float resY = 50;
int shape = 1;
int thickness = 1;

void setup() {
  size(1280, 720);
  video = new Capture(this, 1280, 720);   // Apple Facetime-Cam HD Auflösung
  video.start();
  rectMode(CENTER);
  amp = new Amplitude(this);
  in = new AudioIn(this, 0);
  in.start();
  amp.input(in);
}

void draw() {
  //background(255);
  float ana = amp.analyze();
  for(int y=0; y < height; y += resY){ 
     for(int x=0; x < width; x += resX){
       int pos = x + y * width;
       color c = video.get(x,y);
       fill(c);

         int xCur = x+int(random(-resX,resX));
         int yCur = y+int(random(-resY,resY));
         color cCur = video.get(xCur,yCur);
         stroke(cCur,255);
         strokeWeight(ana*100);
         line(xCur,yCur, x+random(ana*100), y+random(ana*100));
     }
   }
}

void captureEvent(Capture video) {
  video.read();                    // das verfügbare Bild der Kamera auslesen
}