Posted by Karsten on 24/06/2009 – 22:15
- Last.fm Api basierte listening history Analyse
- Hörverhalten einer Users über spezifischen Zeitraum(im Beispiel 18 Monate)
- Core- und new discovery-musicians über Farbcodierung
- Spiegel für: Was gehört? Wann gehört? Trendänderungen und eventuellen Zusammenhang zwischen Genre, Interpret und den Hörgewohnheiten
Listening History by Lee Bryon
Posted by steffen on 15/06/2009 – 21:23
Letzte Woche durchgesprochen und hier noch mal im Blog zum anschauen. Für alle Projekte die auf der Nutzereingabe von Name und Passwort basieren.

Wir nutzen dabei die von Andreas Schlegel geschriebene Bibliothek controlP5 – ideal für das Erstellen von simplen Benutzeroberflächen.
Nach dem Anlegen der beiden Textfelder im setup(), wird bei ENTER die Funktion controlEvent() aufgerufen. Innerhalb entscheidet die Länge der Text ob diese für die Verbindung zur API genutzt werden. In diesem Fall müssen beide Felder ausgefüllt sein.
Der letzte Schritt besteht im Ändern des ‘ready’ Wertes von false auf true. Dies veranlasst die Bedingung im draw() den eigentlichen Zeichenprozess (das Arbeiten mit den Daten) zu beginnen.
import utils.*;
import lastfm.*;
import controlP5.*;
ControlP5 c5;
Textfield tfName;
Textfield tfPass;
boolean ready = false;
Lastfm fm;
void setup () {
size (580, 240);
// Allgemeines ControlP5 Objekt
c5 = new ControlP5 (this);
// TextFelder für beide Werte Anlegen
tfName = c5.addTextfield ("username", 20, 100, 200, 18);
tfPass = c5.addTextfield ("userpass", 20, 140, 200, 18);
// Passwort wird im Sternchenmodus angezeigt
tfPass.setPasswordMode (true);
}
void draw () {
background (40);
if (ready) {
// MAGIC!
}
}
/**
* Diese Funktion wird bei jeder ControlP5-Eingabe aufgerufen.
* Das 'ControlEvent' gibt Aufschluss über den Auslöser und
* damit über dessen Wert bzw. Zustand. In diesem Fall der Text.
*/
void controlEvent (ControlEvent theEvent) {
String user = tfName.stringValue ();
String pass = tfPass.stringValue ();
// Wenn Textfeldinhalte jeweils länger als 0 sind
if (user.length () > 0 && pass.length () > 0) {
// GUI ausblenden
tfName.hide ();
tfPass.hide ();
// API INITIALISIEREN
fm = new Lastfm (user, pass, "xx", "xx");
// Startschuss für den draw-Block geben
ready = true;
}
}
Posted by laura on 10/06/2009 – 12:48

Metropop Denim
Fashion Photography and Generative Artwork by Clayton Cubitt and Tom Carden
Posted by jonas on 10/06/2009 – 11:32
INPUT / OUTPUT
-
1. FINDE
Finde dein Ausgangsmaterial. Ein Video, ein Geräusch, ein Musikstück, ein Text (vom Gedicht bis zur Webseite), eine Fotografie, eine Grafik, ein Geruch,…
2. TRANSFORMIERE
Analysiere dein Ausgangsmaterial. Welche Charakteristika hat es? Was zeichnet es aus? Wie ist es beschaffen? Wie sieht es aus?
Interpretiere, Rekonstruiere, Transformiere dein Ausgangsmaterial zu etwas Neuem. Einer ästhetischen Form, ein Muster, einer generative Struktur, einer (Info)Grafik,… . Das Endergebnis kann eine Bildschirmmanwendung, ein Plakat oder ein Video sein. Die Analyse kann, muss aber nicht mit Processing stattfinden. Die eigentliche Transformation muss mit Processing gelöst werden.
3. PRÄSENTIERE
Präsentiere das von dir gewählte Ausgangsmaterial, den Transformationsprozess und das Endergebniss in einer 10 minütigen Beamerpräsentation.
Richtlinien: Screengröße: 1024 x 768, Schriftgröße min. 21 Pt.
Termin: 22.07.09
Posted by steffen on 09/06/2009 – 12:29
Der folgende Sketch ermittelt zufällige Positionen innerhalb einer vorgegebenen Maske (Freiform), und stellt diese durch kleine Kreuze im Sketchfenster dar.

Die rein mathematische Lösung für einen zufälligen Punkt in einer Freiform ist für unser Anliegen zu aufwendig. Im Folgenden bedienen wir uns dem Trick einer Maskierung durch ein Pixelbild. Dieses besteht im Idealfall nur aus schwarzen und weißen Pixeln – wobei die schwarzen die Form bestimmen. Die get() Funktion, zum Auslesen von Farbwerten, wird in einer Funktion platziert, welche die zufällig ermittelte Position zurück gibt. Da sich eine Funktion auch selbst aufrufen kann (Rekursion), ist diese in der Lage so lange zu suchen, bis ein Punkt innerhalb der Form bestimmt wurde.
Weil eine Funktion nur eine Variable als Rückgabewert zur Verfügung hat, verwenden wir einen Vektor.
Beispiel runterladen
PVector imgPos; // Position der Maske im Sketch
PImage img; // Kontainer für die Masek
void setup () {
size (240, 160);
// Laden der Maske
img = loadImage ("cloud.png");
// Vektor für die Position der Maske im Sketch
imgPos = new PVector ();
// Maske im Fenster zentrieren
imgPos.x = (width - img.width) / 2;
imgPos.y = (height - img.height) / 2;
}
void draw () {
background (255);
for (int i=0; i < mouseX * 2; i++) {
// Ermittle eine zufällige Position in der Maske
PVector pos = randomPoint (img, imgPos);
// Zeichne ein kleines Kreuz an dieser
drawCross (pos);
}
}
/**
* Funktion ermittelt rekursiv die Position eines Pixels
* in einem gegebenen Bild, welches schwarz ist. Diese
* Koordinaten werden mit der Bildposition (Vektor)
* summiert und zurückgegeben.
*/
PVector randomPoint (PImage theImage, PVector thePos) {
// Zufallsposition im Bild
int x = (int) random (theImage.width);
int y = (int) random (theImage.height);
// Wenn Pixel an Position x,y schwarz ist
if (brightness (theImage.get (x, y)) == 0) {
// Gibt die Position als Vektor zurück
return new PVector (thePos.x + x, thePos.y + y);
}else{
// Sonst versuche es erneut
return randomPoint (theImage, thePos);
}
}
/**
* Funktion zeichnet ein Kreuz an dessen Mittelpunkt.
*/
void drawCross (PVector thePos) {
line (thePos.x-1, thePos.y-1, thePos.x+1, thePos.y+1);
line (thePos.x-1, thePos.y+1, thePos.x+1, thePos.y-1);
}
Posted by jonas on 07/06/2009 – 12:08
Anbei das Update. Im examples Ordner findet ihr zwei kleine Beispiele für den Umgang mit Tags und Bildern, sowie die Kombination Vektoren mit Lastfm-Daten.
schöne Grüße
Posted by jonas on 03/06/2009 – 01:27
Filed under cc1, cc2, input
Neben großartigen Schriften veröffentlichen »Die Gestalten« auch gute Bücher
