Kurs Multimediaprogrammierung
Montag, 20. Januar 2014
Kurs Multimediaprogrammierung mehrere draw-, -keyPressed, -mouseOver-Funktionen bei komplexen Programmen sinnvoll (wie Spiele mit Menü, Spiel mit unterschiedlichen 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: Puffergröße kleiner Puffer: 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 Selbstbildnis mit Beispiel-Skript, Processing
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)
Montag, 13. Januar 2014
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, Beispiel "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 hintereinander ausführbar): s.trigger(); notiert nur bestimmte Teile einer Sounddatei abspielen: aus einem vorhandenen Satz mit dem selben Material eine andere Aussage machen (Beispiel: "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 herstellenMontag, 6. Januar 2014
Kurs Multimediaprogrammierung Vorteile Benutzung von Klassen Klasse = allgemeine Vorlage für ein Objekt Eigenschaften von Objekt in Klasse definiert (Farbe, Form, …) Methoden zum "manipulieren" vom Objekt (drehen, vergrößern, …) 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ückgespult"), siehe Idee "Uhrwerk" chaotische Systeme bit.fall, Julius Popp, 2007
bit.flow, Julius Popp
Julius Popp Übung Klassen Feld anlegen (Zeiger, noch keine Inhalte): objekte[] = new Objekt10 Feld-Inhalt erzeugen: objektei = new Objekt() pushMatrix(), popMatrix(): Zustand des Koordinatensystems wird abgespeichert und nach Objektzeichnung wieder verwendet Polygone, Processing
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, …)
Montag, 16. Dezember 2013
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
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
notiert "wach' ich oder träum' ich" mit Elektrolumineszenzfolie im Hintergrund, damit mehr Licht durch rote und blaue Folie Processing: "Klassen" Timer programmieren mögliche Aufgabe: Töne nach bestimmter Zeit ausgeben Stoppuhr programmieren: "Stoppuhr 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 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)
Montag, 9. Dezember 2013
Kurs Multimediaprogrammierung Animation Welle als Klasse Klassenkonzept bisherige Verwendung: zusammengesetzte Variable class Ball() Ball b = new Ball(); Beispiel: b.r, b.x, b.y, … Klassen zur Strukturierung der eigenen Programme eigenen Variablentypen definieren Zeichenketten, Zahlen … 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 zwischen zwei Punkten (x,y) bzw. (x,y,z): dist();Montag, 18. November 2013
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)Montag, 11. November 2013
Kurs Multimediaprogrammierung 6 Minuten zu spät zu spät random: kein echter Zufallsgenerator deterministische Funktion für Außenstehende schaut es wie Zufall 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() Beispiel: 100 % 100 = 0 (Rest 0) oder 200 % 100 = 0
Montag, 4. November 2013
Kurs Multimediaprogrammierung 2 Minuten zu spät 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)
Aufgabe: Ellipse nehmen und Position so ändern, dass sie innerhalb des Bildschirmbereiches wandert (an den Ecken soll die Ellipse wieder in den Bildschirm reinwandern)
Montag, 28. Oktober 2013
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"
zuerst alle neun Punkte, die für Verbindung von Linien wichtig sind, in zwei Arrays (für x und y) ablegen Beispiel: 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() inklusive kleiner grafischer Effekte riesige Kugel mit Lichteffekt für Hintergrund: lights() und sphere(650+zoom/1)
Montag, 21. Oktober 2013
Kurs Multimediaprogrammierung zu spät zu spät Einleitung Processing rein mathematische Formeln ergeben organische Formen: Mandelbrot / Apfelmännchen Mandelbrot-Menge mit farbig dargestellter Umgebung
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
Ergebnis
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