4.1 Klangwiedergabe

Sound mit Processing

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?

Processing with MAX

Mew, Emily Groves

Creating instruments in MAX

The rather complex synthesizer ›X.FM‹ comes with MAX7

Exercise (20 minutes):
Build your own tiny MAX-instrument. Use the objects saw~, etc.

Exchange data with Open Sound Control (OSC)

Für das Senden und Empfangen von Daten zwischen Programmen oder auch zwischen zwei Computern (ob im gleichen WLAN oder übder das WWW) existieren Übertragungsprotokolle. Das bekannteste (oder zumindest am weitesten verbreitete) von ihnen ist TCP/IP (Transmission Control Protocol / Internet Protocol), das für die Übertragung der Daten im Internet verantwortlich ist.
Ein weiteres Protokoll ist UDP (User Datagram Protocol). Es sendet und empfängt im Gegensatz zu TCP/IP keine Verbindungsbestätigung. Bei Games können so bspw. Daten und aktuelle Spielstände zwischen Playern synchronisiert werden.
Für audiovisuelle und künstlerische Anwendungen hat sich OSC (Open Sound Control) als wichtiges Protokol durchgesetzt:

"Open Sound Control (OSC) is a protocol for communication among computers, sound synthesizers, and other multimedia devices that is optimized for modern networking technology. Bringing the benefits of modern networking technology to the world of electronic musical instruments, OSC's advantages include interoperability, accuracy, flexibility, and enhanced organization and documentation." (opensoundcontrol.org)

Exchange Data between Processing and MAX

MAX patch:

import netP5.*;
import oscP5.*;

OscP5 osc;
NetAddress myRemoteLocation; 

void setup(){
  size(800, 600);
  osc = new OscP5(this, 12000);
  myRemoteLocation = new NetAddress("127.0.0.1", 13000);
}

void draw(){
  
  
}


void mousePressed(){
 OscMessage myMessage = new OscMessage("hello");
 myMessage.add("world!");
 osc.send(myMessage, myRemoteLocation);
 println(myMessage);
}
  

Klangerzeugung

Nun, da wir wissen, wie man Daten von Processing nach MAX sendet, können wir diese verwenden, um Klänge zu steuern und zu generieren.

Samples abspielen

Generatoren / Oszilatoren