[X]Sie sehen gleich die Aufzeichnungen eines KunststudentenDiese sind subjektiv, unvollständig und nicht frei von inhaltlichen sowie othographischen Fehlern.(1) Ich möchte niemandem schaden. Ich möchte aber meine Studienzeit in all seinen Facetten festhalten.
(2) Mich interessieren dabei lediglich Informationen, die mit dem Studium an der Hochschule, mit Kunst allgemein und mit meiner künstlerischen Arbeit im Speziellen zu tun haben.
(3) Rechtschreibfehler und Fehlinformationen sind ungewollt Teil der Notizen geworden. Sie sind meinem aktuellen Wissensstand, der Konzentration in stundenlangen Sitzungen, meinen Ohren und den temporären schlecht lesbaren handschriftlichen Notizen geschuldet.
(4) Zitate sind nur markiert, wenn ich mir sicher bin, dass es genau so gesagt wurde. Da ich mich keines Aufnahmegerätes bediene, sind die Zitate natürlich aus dem Zusammenhang gerissen. Das ist nicht böswillig. Es sind Äußerungen, die ich zum Beispiel sympathisch fand. Darüber dürfen sich Zitierte freuen!
(5) Ich bin auf der Suche. Die Frage Was ist Kunst? spielt in meinem Studium eine große Rolle. Auch meine künstlerische Arbeit hat immer die Suche und den Zweifel zum Thema. Deshalb nehme ich gerne in Einzelgesprächen mit Professoren, Werkstattleitern und Dozenten deren Sicht wahr und verarbeite diese später in den Notizen. Nur deshalb bin ich jetzt da, wo ich stehe. Wenn ich einen Hochschulangestellten also mit seiner Meinung darstelle, darf er sich freuen, aktiver Teil meiner künstlerischen Entwicklung zu sein.

frfr@hgb-leipzig.de
Klasse Bildende Kunst
HGB Leipzig

Kurs Multimediaprogrammierung

Kurs Multimediaprogrammierung Vorstellung Aufgabe Webcambild mit Mikrofon verzerren OpenCV: Gesichtserkennung (Idee mit Heiligenschein) OSC mit Processing PureData steuern 3D-Kamera Daten zu Processing schicken Kommunikation zw. unterschdl. Programmen auf selben Rechner / zw. unterschdl. Rechnern CV-Bibliothek einbinden: import hypermedia.ivid.*; Bibliothek in C geschrieben (wegen Geschwindigkeitsvorteil) OpenCV: mit eigener Capture-Funktion erzeugen mit: opencv = new OpenCV(this); Bild lesen (für späteren Zugriff): opencv.read; Speicher anlegen: capture(640,480); Bild anzeigen (inkl. Skalierung): image(opencv.image(),0,0,800,600); Profildatei lesen (im Hintergrund werden Schritte für Gesichtserkennung durchgeführt): opensv.cascade(OpenCV.CASCADE_FRONTALFACE_ALT); Rechteck um erkannten Kopf: Rectanglefaces[] = opencv.detect(1.2,2,OpenCV.HAAR_DO_CANNY_PRUNING[50,50]); komplexer MotionFlow-Algorithmus (nicht nur Helligkeitswerte, sondern auch Richtung und Entfernungsänderungen) Rectangle einbinden, vor setup(): import java.awt.Rectangle; Anzahl erkannter Gesichter: println(faces.length); Tiefpass-Filter : bei schneller Bewegung den Mittelwert nehmen
Selbstporträt mit Beispiel-Skript, Processing
Selbstporträt mit Beispiel-Skript, Processing
Kurs Multimediaprogrammierung mehrere draw-, -keyPressed, -mouseOver-Funktionen bei komplexen Programmen sinnvoll (wie Spiele mit Menü, Spiel mit unterschdl. Levels, Abspann) arbeiten mit Webcam (Heiligenschein) public class Level1{void draw(){}} andere draw-Funktion aufrufen: registerMethod("draw", new Level1()); wieder herausnehmen mit unregisterMethod(); Audio-Bibliothek minim AudioPlayer sound; Minim soundSystem=new Minim(this); sound = soundSystem.loadFile("sound.wav"); sound.loop(); FFT (Fast Fourier-Transformation) mathematischer Algorithmus, der Funktion in anderen Raum transformiert fft = new FFT(sound.bufferSize(), sound.sampleRate()); bufferSize: Buffergröße kleiner Buffer: System reaktionsschnell, aber ungenauer fft.specSize(): Fenstergröße, die verarbeitet wird (Anzahl unterscheidbarer Frequenzen) fft.forward(sound.mix): führt die Frequensanalyse durch Frequenz auslesen: fft.getBand(i); Mikrofon: AudioInput sound; sound = soundSystem.getLineIn(); Video integrieren Bibliothek: video Capture cam; cam = new Capture (this, width, height); in der draw-Funktion: image(cam,0,0); cam.read(); Selbstporträt mit Beispiel-Skript, Processing processing-capture.jpg Beispiele unter File > Samples > Libraries > video > Capture Möglichkeiten/Spielereien mit der Webcam aufgelistet alle Pixel eines Bildes sind normalerweise in einem "Band" angeordnet muss in x und y umgerechnet werden (Breite x Höhe): x+y*width Pixelausgabe: updatePixels(); stellt Array des letzten Kamerabildes zur Verfügung: cam.loadPixel(); Aufgabe: mit Mikrofon das Webcam-Bild beeinflussen (je nach Tonlage oder Lautstärke Bild verzerren oder farblich verändern)
Kurs Multimediaprogrammierung Unterschiede Funktion / Klasse Pufferüberlauf (buffer overflow), häufigste Sicherheitslücke in aktueller Software zu große Datenmengen in einem zu kleinen reservierten Speicherbereich: andere Speicherstellen werden überschrieben auf Bibliotheken zugreifen, "Libraries" Sound-Bibliothek, Bsp. "Minim" Sprachausgabe: "ttslib" Bibliothek in Processing-Ordner "libraries" kopieren (Apfel+d = Datei kopieren) über "Import > Library" "ttslib" in aktuelles Projekt importieren TTS sprecher = new TTS(); "TTS" = Klassenname "sprecher" = Variable, selbst gewählt sprecher.speak("Hi!"); Frequenz ändern: setPitch() "map": Abbildung von einem Wertebereich in einem anderen 0 als 50 und width als 200 festgesetzt: map(mouseX,0,width,50,200); Frequenz 100 = Normalwert mehrere Stimmen gleichzeitig thread("sprecher1"); Funktion wird parallel zum Hauptprogramm abgearbeitet Name der Funktion wird übergeben ("sprecher1") notiert ein Lied mit richtiger Herzzahl und Tonlänge per Computer nachahmen Import Library > minim (mit mp3- und wav-Dateien arbeiten) Minim soundSystem = new Minim(this); AudioSnippet s; (1) s = soundSystem.loadSnippet("sound.wav"); (2) s = SoundSystem.loadSample("sound.wav"); loadSample: mehr Funktionalität als loadSnippet (nur einfaches Abspielen) roten Text in Meldefenster ausgeben: system.err.println() Sounddatei "anschubsen" (mehrere Male hintereinader ausführbar): s.trigger(); notiert nur bestimmte Teile einer Sounddatei abspielen: aus einem vorhandenen Satz mit dem selben Material eine andere Aussage machen (Bsp: "wahr" > "falsch", wobei das nur bei längeren Sätzen geht) getLineOut(); AudioOut dac = soundSystem.get LineOut(Minim.Stereo,1024); dac.addSignal(ton); ton.setFreq(200); Aufgabe: Melodie aus Frequenzen herstellen
bit.fall, Julius Popp, 2007
bit.fall, Julius Popp, 2007
bit.flow, Julius Popp
bit.flow, Julius Popp
Polygone, Processing
Polygone, Processing
Kurs Multimediaprogrammierung Vorteile Benutzung von Klassen Klasse = allgemeine Vorlage für ein Objekt Eigenschaften von Objekt in Klasse definiert (Farbe, Form usw.) Methoden zum "manipulieren" vom Objekt (drehen, vergrößern usw.) Bibliothek hinzufügen Sprach-Bibliothek (Vorlesen von Text) Prozesse gleichzeitig abarbeiten, nicht mehr über draw() bei delay() sollen weiterhin Prozesse stattfinden Gravitation / Ablenkung von einzelnen Körpern (kompliziertes Beispiel Sonnensystem) notiert zufällig herumfliegende Objekte ergeben nach einer gewissen Zeit ein erkennbares Symbol (über den Endzustand wird rechnerisch "zurückgespuhlt"), siehe Idee "Uhrwerk" chaotische Systeme bit.fall, Julius Popp, 2007 bitfall.jpg bit.flow, Julius Popp bitflow.jpg Julius Popp Übung Klassen Feld anlegen (Zeiger, noch keine Inhalte): objekte[] = new Objekt[10] Feld-Inhalt erzeugen: objektei = new Objekt() pushMatrix(), popMatrix(): Zustand des Koordinatensystems wird abgespeichert und nach Objektzeichnung wieder verwendet Polygone, Processing ergebnis.jpg beginShape(), endShape(): definieren, was alles zu einem Objekt gehört beginShape([POINTS, LINES, TRIANGLES, QUADS, …]) endShape(filled?CLOSE:OPEN) "filled" ist true oder false Bézierkurve, modellierte Kurve, wichtiges Werkzeug für Vektorgrafiken curveVertex(); popStyle, pushStyle: Eigenschaften nur für ein Objekt verwenden Aufgabe: einzelne Objekte mit Tab-Taste aktivieren (farblich kennzeichnen) und drehen, skalieren, Position ändern Datenfeld hinzufügen: append() Aufgabe: ein Objekt als Kind-Element von einem anderen Objekt definieren (mitdrehen, mitskalieren,…)
Leuchtschnur in Natur, Bild über Stiers Lichtanlagen
Leuchtschnur in Natur, Bild über Stiers Lichtanlagen
Balance, Hans Kotter, London 2008
Balance, Hans Kotter, London 2008
Kurs Multimediaprogrammierung Elektrolumineszenzfolien (EL-Folie) funktioniert mit Inverter flexible Folie, leuchtet bei angelegter elektrischer Spannung Entdeckung Elektrolumineszenz / Destriau-Effekt 1936 durch Georges Destriau im Labor von Marie Curie in Luft- und Raumfahrt eingesetzt Leuchtschnur in Natur, Bild über Stiers Lichtanlagen leuchtkunst.jpg Balance, London, 2008 Vorteile: geringe Einbautiefe, Flexibilität, homogene Lichtverteilung, geringe Leistungsaufnahme Abschottung gegenüber Sauerstoff und Wasser wichtig (Lebensdauer sonst verringert) Lebensdauer: 4.000 Stunden Mechanismen u.a. "Wechselfeldanregung" Folie aufgebaut wie Kondensator Elektronen werden beschleunigt, in angeregten Zustand versetzt senden Licht aus und fallen in Grundzustand zurück Balance, Hans Kotter, London 2008 balance.jpg notiert "wach ich oder träum ich" mit Elektrolumineszenzfolie im Hintergrund, damit mehr Licht durch rote und blaue Folie Processing: "Klassen" Timer programmieren mgl. Aufgabe: Töne nach bestimmter Zeit ausgeben Stopuhr programmieren: "Stopuhr uhr;" ("Stoppuhr" wird als "uhr" definiert) Aufgabe: Zeit stoppen, die Person braucht, um mit der Maus auf ein Element auf dem Bildschirm zu klicken Funktion in Klasse, die Klassennahmen trägt: spezielle Funktion, die automatisch bei name.draw() einmal aufgerufen wird boolean getroffen (float mx, float my) millis(): Anzahl vergangener Millisekunden, nachdem Arduino Board aktuelles Programm ausführte class B extends A (Klasse B übernimmt alles von Klasse A) "super.variable": greift auf Variable aus Oberklasse zu saveFrame() und saveFrame("bild###.jpg") ### wird automatisch durch FrameRate-Nummer ersetzt image(loadImage("fadenkreuz.jpg"), mouseX,mouseY); Fadenkreuz fürs Spiel statt Maus einbinden skalieren (b,h): image(Bild,x,y,b,h) (mit Dreisatz proportional skalieren) notiert PackMan mit eigenem Gesicht (Webcam) ausstatten Aufgabe: Klasse erstellen mit mehreren Funktionen (Kreise, Rechtecke, "PackMans" und Bilder bewegen sich im Raum und prallen aneinander ab)
Kurs Multimediaprogrammierung Animation Welle als Klasse Klassenkonzept bisherige Verwendung: zusammengesetzte Variable class Ball() Ball b=new Ball(); Bsp: b.r, b.x, b.y, … Klassen zur Strukturierung der eigenen Programme eigenen Variablentypen definieren Zeichenketten, Zahlen uvm. zu "Mega-Variablen" zusammenfassen eigene Bibliothek basteln in extra Datei auslagern color f übergeben: "255x255x255x0" oder "#ffffff00" oder "0xffffff00" int*y: Zeiger auf int-Variable step(autist): autistischer Ball, der nicht mit anderen Bällen agiert neuen Tab: "Ball" (muss genau den Namen der Klasse haben) void DrawBall() in Klasse = Methode der Klasse "this." bezieht sich immer auf eine Klassen-Variable Anzahl Elemente in Array: ".length" for-Schleife ohne geschweiften Klammern: gilt immer nur für ein Befehl Stoppuhr programmieren mit Klassen (alle 5 Sekunden eine Ellipse zeichnen= Klassen Uhr.start(); und Uhr.aktuell(); Abstand zw. zwei Punkten (x,y,z): dist();
Kurs Multimediaprogrammierung keine Maus: noCursor(); wieder anzeigen: cursor(ARROW) bei Alpha-Transparenz bleibt oft ein wenig Farbe übrig (rundet den Wert auf und kommt nie auf 0% Farbe) mit arc-Funktion PackMan programmieren (Mund auf und zu) Spiel angefangen zu programmieren (unkonzentriert abgebrochen)
Kurs Multimediaprogrammierung 6 Minuten zu spät random: kein echter Zufallsgenerator deterministische Funktion für Außenstehende schaut es wie Zufall aus echter Zufall: in Kryptographie genutzt Zufall in der Quantenwelt durch Ungenauigkeit der Zahlen entstehen Muster Fixpunkt: Algorithmus hat sich "festgefressen" Aufgabe: überall wo ich hinklicke soll ein Stern gezeichnet werden Koordinaten von Linien für Stern aufgeschrieben und umgesetzt mit translate() und rotate() umgesetzt Farbraum HSB: Farbkreis colorMode(HSB,360,100,50); 360 = Farbe bei 360 Grad 100 = Sättigung 50 = Helligkeit for-Schleifen for(int i=1; i<=anz; i++){} mouseButton==RIGHT oder mouseButton==LEFT \t = Tab-Zeichen für print() und println() notiert Domain www.hgb-leipzıg.de oder www.hgb-leipzīg.de registrieren Teilen mit Rest: modulo() Bsp: 100 % 100 = 0 (Rest 0) oder 200 % 100 = 0
kleines Spiel programmiert (Kugeln versuchen den Spieler aufzufressen und werden jedesmal größer; Spiel endet, sobald der Spieler aufgefressen wurde)
kleines Spiel programmiert (Kugeln versuchen den Spieler aufzufressen und werden jedesmal größer; Spiel endet, sobald der Spieler aufgefressen wurde)
Kurs Multimediaprogrammierung 2 Minuten zu spät 14 Minuten später angefangen Variablen "byte": Grundtyp, wenn man noch nicht weiß, was Inhalt sein soll 2^8 Zustände Datei einlesen: byte b[] = loadBytes("daten.dat"); notiert Website der Hochschule auf den Kopf stellen; über Sonderzeichen-URL, die der eigentlichen Domain ähnlich kommt; im Computerraum als Startseite anlegen (wird bei Neustart behalten) boolean: true oder false Vollbild mit Funktion: boolean sketchFullscreen(){return(true);} DisplayWidth und DisplayHeight: Gesamthöhe/-breite nutzen Variable global oder lokal definieren (je nach Gebrauch) Hintergrundfarbe heller werden lassen und danach wieder dunkler, mit If-Abfragen realisieren keyPressed: Faktor für schnelleres heller werden ändern line(0,0,l,0); translate(l,0); rotate(w); float w=radians(5); (5 Grad) translate(verschieben) scale() (vertikal und/oder horizontal spiegeln) pushMatrix() und popMatrix() Werte werden in andere Funktion übergeben und mittels popMatrix wieder gespeichert l+=random(-1,1); w+=0.01; translate zwar einfach, aber schlecht zu "überwachen (bei erreichen des Bildschirmrandes soll zum Beispiel die Richtung gewechselt werden) cos() und sin() Winkeländerung "dw" global ablegen kleines Spiel programmiert (Kugeln versuchen den Spieler aufzufressen und werden jedesmal größer; Spiel endet, sobald der Spieler aufgefressen wurde) kugeln.gif Aufgabe: Ellipse nehmen und Position so ändern, dass sie innerhalb des Bildschirmbereiches wandert (an den Ecken soll die Ellipse wieder in den Bildschirm reinwandern)
Das ist das Haus vom Nikolaus
"Das ist das Haus vom Nikolaus"
Kurs Multimediaprogrammierung Aufgabe bis heute: "Das ist das Haus vom Nikolaus" mit Processing umsetzen E-Mail von gestern: "Na, da brauchst Du morgen gar nicht erst kommen. Schleifen werden wir wohl noch nicht behandeln." "Das ist das Haus vom Nikolaus" dasistdashausvomnikolaus.gif zuerst alle neun Punkte, die für Verbindung von Linien wichtig sind, in zwei Arrays (für x und y) ablegen Bsp: int[] punktx = {0, 10, 10, 0, 0, 10, 5, 0, 10} mittels translate() wird Objekt zentriert und mit scale() vergrößert in for-Schleife mit line(punktxi, punktyi, punktx[i+1], punkty[i+1], j) Linien zeichen (j = Tiefe) Variable als boolean definieren: Wert 0 und 1 Vollbild mit size(displayWidth, displayHeight, P3D) und boolean sketchFullScreen(){return true;} P3D: für räumliches Erleben Haus rotieren lassen mit rotateX(), rotateY(), rotateZ() und rotate() inkl. kleiner grafischer Effekte riesige Kugel mit Lichteffekt für Hintergrund: lights() und sphere(650+zoom/1)
Mandelbrot-Menge mit farbig dargestellter Umgebung
Mandelbrot-Menge mit farbig dargestellter Umgebung
Code
Code
Ergebnis
Ergebnis
Kurs Multimediaprogrammierung zu spät Einleitung Processing rein mathematische Formeln ergeben organische Formen: Mandelbrot / Apfelmännchen Mandelbrot-Menge mit farbig dargestellter Umgebung apfelmaennchen.jpg Fraktal = Form, die sich - immer kleiner werdend - unendlich oft wiederholt Grundsystem: Speicher (Daten) und Verarbeitungseinheit (jene verarbeiten) leere Datei belegt ohne Inhalt 4 KByte (kleinste Sektorgröße bei Festplatten von ehemals 512 Bytes auf 4 KB) Kommentare in Processing: // (einzeilig) und /* (mehrzeilig) */ alles, was benutzt werden kann unter "Help > Refference" zu finden jeder Befehl / Aufforderungssatz endet mit Semikolon Farbe festlegen: stroke(120); (Grauwert), stroke(120,5,10); (Farbwert) Ellipse: ellipse(50,50,30,20); 2*Pi: einmal den Kreis entlang radiand(360): Grad-Angabe statt Pi Bildgröße: size(100,100); Dreieck: triangle(x1,y1,x2,y2,x3,y3); Linienstärke: strokeWeight(10); QUARTER_PI: nicht Pi/4, da bei größeren Skripten unnötige Rechnungen bei Animationen: Funktionen initialisieren void setup() und Funktion void draw() Menü "Edit > Auto Format": automatisches Einrücken und Leerzeichensetzung frameRate(30): 30 mal je Sekunde Bild aktualisieren gebrochene Zahlen deklinieren: float wert; ganze Zahlen: int wert; print und println: Text ausgeben im Messagefenster Code processing1.jpg Ergebnis processing2.jpg Hintergrund neu zeichnen (bei Animationen sinnvoll): background(); Rechteck zeichnen mit Aplhawert für transparenten Hintergrund: fill(200,40); rect(0,0,100,100); Elemente verschieben (z nach hinten und vorne): translate(x,y,z); Aufgabe: Animation das-ist-das-Haus-vom-Nikolaus programmieren
Kurs Multimediaprogrammierung Vorstellung verschiedener Autorensysteme freie 3D-Grafik-Software Blender Funktionen zur Modellierung, Texturierung und Animation dreidimensionaler Körper integrierte Programmiersprache: Python Video-Beispiele, in Blender entstanden Modelle erstellen, zum Fräsen kleine Interventionen in vorhandene Filme Kamerablick, Licht-Elemente Ausstellungs-Situation planen Scripting (wie Objekte duplizieren, Positionen verändern, Koordinaten-Datei einpflegen, Schleifen, Zufälligkeit) Pure Data: graphische Programmierumgebung für interaktive Multimediaprojekte Lifeübertragung von Daten (für Sound-Installationen) Baumstrukturen vor allem audiobasiert, aber auch u.a. Anbindung von Webcam mit anderen Programmiersprachen arbeiten (wie per PHP Daten aufbereiten und erzeugte Text-Datei in Pure Data importieren und verarbeiten) Processing: Einsatzbereich Grafik, Simulation und Animation spezialisiert für Gestalter, Künstler und Programmieranfänger, auch für eigene Android-Apps basiert auf Java Bsp.: line(10,10,90,90), rect(30,30,50,50) Im weiteren Verlauf Arbeit mit Processing (Projekt-Ideen für Umsetzung sammeln)