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
}