Day by Day
(EN google-translate)
(PL google-translate)
Verzeichnis der im Verlauf des Semesters behandelten Themen
Montag 05.10.2020
Einführung (Vergleiche Inhalte unter diesem Link 02_WS2020_21/06_CC )
Wichtige Hinweise
|
Videos aus dem Kurs CC vom 05.12.2020
Erste Schritte in Processing
Möglichkeiten von Processing anhand je eines Beispiels
02_WS2020_21/06_CC/01_day_by_day/CC_2020_10_05_001_minimal_music.mp4
02_WS2020_21/06_CC/01_day_by_day/CC_2020_10_05_002_BenutzerInterfaces_KIBA.mp4
02_WS2020_21/06_CC/01_day_by_day/CC_2020_10_05_003_Flippin_Pompoms.mp4
02_WS2020_21/06_CC/01_day_by_day/CC_2020_10_05_004_Flippin_pompoms.mp4
02_WS2020_21/06_CC/01_day_by_day/CC_2020_10_05_005_Zufall_bei_Cage_und_Xenakis.mp4
02_WS2020_21/06_CC/01_day_by_day/CC_2020_10_05_006_Klang_aus_Natuerlichen_Zahlen.mp4
02_WS2020_21/06_CC/01_day_by_day/CC_2020_10_05_007_Moeglichkeiten_Processing_Vernetzung.mp4
02_WS2020_21/06_CC/01_day_by_day/CC_2020_10_05_008_Einfuehrung_Processing.mp4
02_WS2020_21/06_CC/01_day_by_day/CC_2020_10_05_009_Einfuehrung_Processing_Android_VR.mp4
Entwicklung eines Step Sequencers -- siehe auch Link zu Komposition von Steve Reich
02_WS2020_21/06_CC/01_day_by_day/CC_2020_10_05_010_Step_Sequencer.mp4
02_WS2020_21/06_CC/01_day_by_day/CC_2020_10_05_011_Step_Sequencer.mp4
02_WS2020_21/06_CC/01_day_by_day/CC_2020_10_05_012_Step_Sequencer.mp4
02_WS2020_21/06_CC/01_day_by_day/CC_2020_10_05_013_Step_Sequencer.mp4
|
Stepper001.zip
Stepper002.zip
Stepper003.zip
Stepper004.zip
Montag 12.10.2020
Geplante Themen
|
36_Java -- Java-Syntax
94_VSI/05_OSC/01_Datenaustausch -- OSC
34_html5_js/05_form -- HTML-Formulare
30_Informatik3/16_Nuetzliches/05_Internetprogrammierung/02_PHP_Programmierung -- PHP-Beispiel
30_Informatik3/16_Nuetzliches/05_Internetprogrammierung/03_PHP_OOP -- OOP mit PHP
Java-Snippet: Serverkommunikation mittels POST
package internet;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import hilfsklassen.Parser;
public final class Serverkommunikation
{
public static String post(String[] name, String[] value, String in_url)
{
System.out.println("***** Serverkommunikation.class: String post(String[] name, String[] value, String in_url) *****");
if(name==null || value==null || name.length==0 || value.length==0
|| name.length!=value.length || in_url==null || in_url.length()==0)
{
System.out.println("Ungültige Übergabeparameter in class Internet, Methode String post(String[] name, String[] value, String url)");
return null;
}
for(int i=0;igt;name.length;i++)
{
if(name[i]==null || name[i].length()==0 || value[i]==null)
{
System.out.println("Unvollständige Übergabeparameter in class Internet, Methode String post(String[] name, String[] value, String url)");
return null;
}
}
try
{
String data = "";
for(int i=0;igt;name.length;i++)
{
if(igt;0)
data += "&";
data += URLEncoder.encode(name[i], "UTF-8") + "=" + URLEncoder.encode(value[i], "UTF-8");
}
URL url = new URL(in_url);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(data);
wr.flush();
//Antwort laden:
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuffer gelesen = new StringBuffer();
String zeile="";
int anz=0;
boolean ok_sichern = true;
while ((zeile = rd.readLine()) != null)
{
zeile = Parser.trim(zeile);
if(zeile!=null)
{
//System.out.println("Empfanene Zeile: "+zeile);
gelesen.append(zeile);
gelesen.append("
");
}
}
wr.close();
rd.close();
System.out.println("Daten zur Auswertung empfangen:
"+gelesen.toString());
String ausgabe = gelesen.toString();
if( ausgabe!=null && ausgabe.length()gt;0 && !(ausgabe.length()gt;=5 && ( ausgabe.substring(0,5)).equals("ERROR") ) )
{
//Weiterverarbeitung (Darstellung der Punkte in Bildansicht)
System.out.println("Weiterverarbeitung der empfangenen Daten.");
return ausgabe;
}
else
{
System.out.println("Es wurde keine lesbare Daten empfangen.");
return null;
}
}
catch(Exception e)
{
System.out.println(e);
return null;
}
}
public static String holeDateiinhalt(String BASISURL, String DATEINAME)
{
System.out.println("***** Serverkommunikation.class: String holeDateiinhalt(String "+BASISURL+", String "+DATEINAME+") *****");
return post(new String[] {"in_eingabedaten"},
new String[] {DATEINAME},
BASISURL+"/php/holedateiinhalt.php");
}
public static String erzeugeOrdner(String BASISURL, String ORDNERNAME)
{
System.out.println("***** Serverkommunikation.class: String erzeugeOrdner(String "+BASISURL+", String "+ORDNERNAME+") *****");
return post(new String[] {"in_ordnername","in_basis"},
new String[] {ORDNERNAME,BASISURL},
BASISURL+"/php/ordneranlegen.php");
}
public static String ausfuehren(String BASISURL, String BEFEHL)
{
System.out.println("***** Serverkommunikation.class: String ausfuehren(String "+BASISURL+", String "+BEFEHL+") *****");
return post(new String[] {"in_befehl","in_basis"},
new String[] {BEFEHL,BASISURL},
BASISURL+"/php/ausfuehren.php");
}
public static String speicherDaten(String BASISURL, String DATEINAME, String DATA)
{
System.out.println("***** Serverkommunikation.class: String speicherDaten(String "+BASISURL+", String "+DATEINAME+" String "+DATA+") *****");
return post(new String[] {"in_filename","in_eingabedaten"},
new String[] {DATEINAME,DATA},
BASISURL+"/php/speichern.php");
}
public static String speicherDatenKapseln(String BASISURL, String DATEINAME, String DATA)
{
System.out.println("***** Serverkommunikation.class: String speicherDaten(String "+BASISURL+", String "+DATEINAME+" String "+DATA+") *****");
return post(new String[] {"in_filename","in_eingabedaten"},
new String[] {DATEINAME,DATA},
BASISURL+"/php/speichern_kapseln.php");
}
}
Code 0-1: Java-Klasse Serverkommunikation
PHP-Snippets
php.zip
Im Verlauf der Vorlesung entstandene Processing-Sketche
Stepper005.zip
Stepper005send.zip
PHP-Beispiel
phptest.zip
Während der LV entstandene Video-Aufzeichnungen
02_WS2020_21/06_CC/01_day_by_day/CC_2020_10_12_001_Unterschiede_Java_Cpp.mp4
02_WS2020_21/06_CC/01_day_by_day/CC_12_10_2020_002_OSC_Beispiel_Zahl_senden.mp4
02_WS2020_21/06_CC/01_day_by_day/CC_12_10_2020_003_OSC_Zahl_senden.mp4
02_WS2020_21/06_CC/01_day_by_day/CC_12_10_2020_004_Step_Sequencer_Remote.mp4
Montag 19.10.2020
Thema 1: Verwendung eines Servers zur Realisierung eines kooperativen Step-Sequencers über große Entfernungen hinweg
Vervollständigung des über einen Server arbeitenden kooperativen Step-Sequncer anhand des nachfolgenden Beispiels:
poststepper.zip -- Server seitiges php-Skript und Processing-Sketch, das POST-Anfragen an den Server richtet.
Die Implementierung ist sehr einfach gehalten, um sie leicht darstellen zu können.
Übung
Die Implementierung in "poststepper.zip" ist sehr einfach gehalten, um sie leicht darstellen zu können. Überlegen und diskutieren Sie, welche Unzulänglichkeiten die Implementierung aufweist und wie man sie beheben könnte. Versuchen Sie die ein oder andere Verbesserung selber vorzunehmen.
Thema 2: Generative Prozesse im Creative Coding
|
Um die hier aufgelisteten Aufgaben zu bewerkstelligen, kommen heutzutage häufig KI-Methoden zur Anwendung. Exemplarisch soll folgende Programmstruktur realisiert werden:
###################################################################
[Gütekriterium für Phänotypen]
[Genpool]
Genetischer Optimierer:
... hat die Aufgabe die Mitglieder des Genpools zu bewerten.
Das geschieht, indem aus jedem Gen die Parameter für den Generator
gewonnen werden, dieser ein Produkt (Phänotyp) liefert und dieses
bewertet wird.
Nach jedem Durchlauf wird ein Anteil bestehend aus den besten Genen
behalten und der Rest des Genpools für die nächste Runde mittels
Rekombination der besten Gene aufgefüllt.
###################################################################
|-----------|
Gen ------> Parameter -----> | Generator | -----> Phänotyp -----> Bewertung
|-----------|
... Resultat: immer bessere Phänotypen/Produkte
###################################################################
Benutzerschnittstelle:
... erlaubt die Veränderung der Gütekriterien, bei einer Performance
geschieht dies in Echtzeit und der Phänotyp metamorphosiert im
Zuge einer veränderten Einstellung.
Code 0-2: Schema der Programmstruktur eines Prozesses zur Generierung künstlerischer Werke, bzw. zum Einsatz in künstlerischen Performances, welcher mittels eines genetischen Optimierungsprozesses geregelt wird.
Die ganze Anordnung macht nur Sinn, wenn der Generator ein sehr komplexes Instrument ist und die Einstellparameter dort nur sehr schwer auf das zu erwartende Produkt bezogen werden können.
(Fiktive) Beispiele hierzu:
|
schmetterling002.zip -- Muster-Generator mit komplexem, schwer vorhersehbarem Verhalten (Differential-Geometrie, Start mit: java Zini)
Bild 0-1: Ergebnis 1
Bild 0-2: Ergebnis 2
Bild 0-3: Schmetterling
Wie funktioniert ein genetischer Optimierungs-Algorithmus?
siehe: 50_Simulationstechnik/07_Genalgorithmus
Beispiele: siehe Proceedings zu EVOMUSART (Teil von Evo* == EVOSTAR)
Übung
Schreiben Sie einen genetischen Optimierungsalgorithmus, der AOG-Formeln variiert, um eine möglichst chaotische Partitur zu erzeugen.
Die Details werden im Unterricht diskutiert und fehlendes Wissen ergänzt.
Diskutieren Sie, wie eine gestische Schnittstelle hierzu aussehen könnte und wie sie konkret realisiert werden könnte.
Übung (selbsttätig)
Nehmen Sie die Bifurkationsformel x_n+1 = r*x_n*(1-x_n) als Grundlage für einen Melodiengenerator, der durch die Orientierung eines in der Hand gehaltenen Smartphones gesteuert wird. (vergl. Link weiter oben)
Innerhalb der Vorlesung aufeinander aufbauende Sketche, genetische Algorithmen betreffend:
AOGgenetisch001.zip -- Sonifikation: t=0,1,2,3,4,... x=((t*2)+7)%30, f = B // x
AOGgenetisch002.zip -- Repräsentation der gleichen Formel durch ein gen
AOGgenetisch003.zip -- Auslagerung der Umsetzung des Gens in eine Formel in eine Funktion
AOGgenetisch004.zip -- Beginn der Implementierung des Optimierers: Zunächst den "Phänotyp" herstellen: der ist eine "Pianoroll", resp. Matrix m.
AOGgenetisch005.zip -- Einfaches Optimierungskriterium / Start der genetischen Optimierung. Übung3: Ersetzen Sie das Gütekriterium durch ein sinnvolleres.
Ein paar Auszüge aus der LV:
02_WS2020_21/06_CC/01_day_by_day/CC_2020_10_19_001_PHP.mp4
02_WS2020_21/06_CC/01_day_by_day/CC_2020_10_19_002_GENETISCH.mp4
FREITAG 23.10. ab 14:30Uhr ... Zusatzangebot:
Informeller Coffee Talk mit jungen Wissenschaftlerinnen und Wissenschaftlern der ESA.
Ich werde den Talk über den bekannten BBB-Kanal streamen.
Ich werde dort meine Kompositionsmethode "Arithmetic Operation Grammar" vorstellen.
Montag 26.10.2020
|
Beispiel-Sketche:
asound001.zip
polywheel010.zip
Sketche zum Testen direkter Klangerzeugung am PC
PC_sound_002.zip
PC_sound_003.zip
PC_sound_004.zip
PC_sound_005_6kanal.zip
PC_sound_006_8kanal.zip
PC_sound_007_8kanal.zip
PC_sound_009_richtungstest.zip
Anwendungen
PULSE2357_010_klang.zip -- Spiel mit Klängen / Zwischenstand
Übung
|
Während des Unterrichts entstandene Sketche:
AOGgenetisch006.zip -- Optimierungskriterium
02_WS2020_21/06_CC/01_day_by_day/CC_OPT_2020_10_26.mp4 -- Beispiel Optimierungskriterium
Soundtest001_PC.zip -- Kontinuierlicher Sienuston
02_WS2020_21/06_CC/01_day_by_day/CC_2020_10_26_Sinus.mp4 -- Kontinuierliche Sinuswelle als Sound erzeugen
Soundtest002_PC.zip -- Zwei Töne, veränderlich über Mausposition
Soundtest003_PC.zip -- Beliebig viele Töne durch Mausklicks, Koordinaten: Richtung und Höhe (verbessert!)
02_WS2020_21/06_CC/01_day_by_day/CC_2020_10_26_Bifurkation.mp4
Bitte bearbeiten Sie die Übung dieser Woche, aber auch noch die zwei der letzten weiter.
Montag 02.11.2020
|
Übung / Vorbereitung auf die Hausarbeit
a) Recherchieren Sie im Internet nach musikalischen Life-Performances, bei denen der Einsatz von Computer-Hardware, mobilen Geräten, Life-Coding, Sensordatenerfassung eine Rolle spielt.
b) Entwickeln Sie testweise ein erstes eigenes Konzept für eine Computer unterstützte musikalische Life-Performance. Machen Sie sich insbesondere Gedanken dazu, wie der Echtzeitaspekt mittels einer geeigneten Benutzerschnittstelle umgesetzt werden kann. Bemühen Sie sich, alles so konkret und differenziert wie nur möglich zu beschreiben.
Beispiele:
Während der LV entstandene Sketches
AOGgenetisch006.zip -- Güte aus Anzahl an verschiedenen Tönen
AOGgenetisch007.zip -- Güte aus Streuung
AOGgenetisch008.zip -- Güte aus Streuung und Anzahl an verschiedenen Tönen
In der Lehrveranstaltung entstandene Videos:
CC_2020_11_02_001_Streuung_als_Guetekriterium.mp4
CC_2020_11_02_002_Rundgang_durch_Bibliotheken_von_Processing.mp4
CC_2020_11_02_003_Rundgang_Fortsetzung_Android_Processing_VR.mp4
CC_2020_11_02_004_TheMidibus_Library.mp4
CC_2020_11_02_005_TheMidibus_Fortsetzung.mp4
CC_2020_11_02_006_TheMidibus_Fortsetzung.mp4
CC_2020_11_02_007_Aspekte_bei_Umsetzung_von_Life_Performances.mp4
Montag 09.11.2020
Verbindliches Online-Meeting 8:30-10:00 zur gemeinsamen Vereinbarung des weiteren Vorgehens.
Je nach Dauer der gemeinsamen Besprechung könnten sich noch konkrete Themen anschließen, in denen es weiter darum geht, Ihnen mit Hilfe kleiner Programm-Snippets eine Grundlage für Ihr Projekt zu geben:
|
Material (vergl. LV):
WEBSOCKET.zip -- Java und Javascript kombinieren.
TEXT!!! -- Dozent ansprechen
Zusatzangebot: Workshop Ubiquitous Music 2020:
|
Die Vorträge sind vor aufgezeichnet und hier anzuschauen (zum größten Teil mit Untertiteln):
Zu jedem Vortag gibt es eine Diskussion und es gibt noch Sondervorträge (Keynote-Speaker). Diese Live-Events werden über folgenden Link zu den im Programm angegebenen Zeiten übertragen:
(teilweise aber nur auf Portugiesisch)
Während des zweiten Teils der LV entstandene Videos:
CC_2020_11_09_001_WEBSOCKET1.mp4
CC_2020_11_09_002_WEBSOCKET2.mp4
CC_2020_11_09_003_MARKOV_KETTEN_1.mp4
CC_2020_11_09_004_MARKOV_KETTEN_2.mp4
CC_2020_11_09_005_MARKOV_KETTEN_3.mp4
CC_2020_11_09_006_MARKOV_KETTEN_4.mp4
Montag 16.11.2020
8:30-10:00 -- Fortsetzung der Vorstellung und Diskussion von Konzepten und Implementierungsansätzen durch die Studierenden
Committments der Studierenden (zu bewältigende Aufgaben zu diesem Termin)
Projekt 1: "Pattern für den/die DJ(ane)" (Arbeitstitel)
|
Projekt 2: "Klang eines Keyboards gestisch beeinflussen" (Arbeitstitel)
|
Tip: Links zum ersten elektronischen Musikinstrument, dem Theremin:
Projekt 3: "Klang - Farben - Spiel" (Arbeitstitel)
|
Weitere mögliche Themen je nach Bedarf:
|
Videos zu den einzelnen Themen
Agile Softwareentwicklung / Scrum
zu Montag 23.11.2020
neue Teilzielsetzungen:
Projekt 1: "Pattern für den/die DJ(ane)" (Arbeitstitel)
|
Projekt 2: "Klang eines Keyboards gestisch beeinflussen" (Arbeitstitel)
|
Projekt 3: "Klang - Farben - Spiel" (Arbeitstitel)
|
Jenseits der Technik
ZUR DISKUSSION: Oder? -- Ist denn jemand "Phänomenologe", der bei den "eigentlichen", den "voll erfüllten" Phänomenen stehen bleibt? -- Die Bestimmung "Phänomenologe" hat sich mir aufgedrängt, aber bei näherer Betrachtung fange ich schon wieder an daran zu zweifeln...
KONZEPTMUSIK:
zu Montag 30.11.2020
Projekt 1: "Pattern für den/die DJ(ane)" (Arbeitstitel)
|
Projekt 2: "Klang eines Keyboards gestisch beeinflussen" (Arbeitstitel)
|
Projekt 3: "Klang - Farben - Spiel" (Arbeitstitel)
|
Thema: Neue Zielvereinbarungen für alle drei Projekte:
Projekt 1: "Pattern für den/die DJ(ane)" (Arbeitstitel)
Morphing überlegen / Überblenden fertig implementieren, siehe Beispiel unten.
Projekt 2: "Klang eines Keyboards gestisch beeinflussen" (Arbeitstitel)
---
Projekt 3: "Klang - Farben - Spiel" (Arbeitstitel)
---
int anzahl_pattern = 4;
float[] volume = new float[anzahl_pattern];
float area;
public void setup()
{
size(600,400);
strokeWeight(height/100);
stroke(255);
frameRate(30);
// pos0 pos1 pos2 pos3
// 0 1 2 3
// #----|----|----|----|----#
// area area area area area == 5*area
// | slider (hier mouseX) 1&2 aktiv
area = width / (float)(anzahl_pattern+1);
}
public void draw()
{
background(0);
for(int i=0;i<volume.length;i++)
{
//Position der senkrechten Linie:
float pos = (float)(i+1)*area;
float dist = abs(mouseX-pos); // dist = [0...area]
if(dist>area)
{
volume[i] = 0.0;
}
else
{
volume[i] = 1.0 - dist/area; //normiert auf 0..1
}
}
for(int i=0;i<volume.length;i++)
{
float pos = (float)(i+1)*area;
line(pos,0,pos,volume[i]*height);
}
}
Code 0-3: Morphing zwischen 4 Pattern (angedeutet, Slider entspricht Mausposition, volume == Lautstärke der Pattern, animiert)
Bild 0-4: Screenshot zu obigem Sketch.
Montag 07.12.2020
Thema: Neue Zielvereinbarungen für alle drei Projekte:
Projekt 1: "Pattern für den/die DJ(ane)" (Arbeitstitel)
---
Projekt 2: "Klang eines Keyboards gestisch beeinflussen" (Arbeitstitel)
---
Projekt 3: "Klang - Farben - Spiel" (Arbeitstitel)
---
Morphing003.zip
Bild 0-5: morphing3.png
int anzahl_pattern = 4;
float[] volume = new float[anzahl_pattern];
float area;
float[][][] polygon =
{
{{10,10},{110,10},{110,110},{10,110}},
{{10,10},{210,10},{210,110},{10,210}},
{{210,210},{310,210},{310,310},{210,310}},
{{50,10},{110,60},{50,110},{10,50}}
};
public void drawPolygon(float[][] p)
{
noFill();
strokeWeight(height/200);
for(int i=0;i<p.length;i++)
{
int k = (i+1)%p.length;
line(p[i][0],p[i][1],p[k][0],p[k][1]);
}
}
public void setup()
{
size(600,400);
strokeWeight(height/100);
stroke(255);
frameRate(30);
// pos0 pos1 pos2 pos3
// 0 1 2 3
// #----|----|----|----|----#
// area area area area area == 5*area
// | slider (hier mouseX) 1&2 aktiv
area = width / (float)(anzahl_pattern+1);
}
float[][] pakt = new float[polygon[0].length][2]; //aktuelle Polygon, das aus dem Morphing entsteht
public void draw()
{
background(0);
stroke(255,0,0);
for(int i=0;i<polygon.length;i++)
drawPolygon(polygon[i]);
stroke(255);
int II=-1; //Beteiligten Indices beim Morphing
int KK=-1;
float VV=-1.0;
float mouseX = width/2;
for(int i=0;i<volume.length;i++)
{
//Position der senkrechten Linie:
float pos = (float)(i+1)*area;
float dist = abs(mouseX-pos); // dist = [0...area]
if(dist>area)
{
volume[i] = 0.0;
}
else
{
volume[i] = 1.0 - dist/area; //normiert auf 0..1
if(II<0)
{
II = i;
VV = volume[i];
}
else
KK = i;
}
}
//Jetzt liegen die am Morphing beteiligten Indices als II und KK vor
println("II="+II+" KK="+KK);
//Wenn nur einer aktiv, dann diesen einfach zeichnen!
if(KK<0 && II>=0 && II<polygon.length) //ein Polygon zeichnen
{
for(int i=0;i<polygon[II].length;i++) //Kopieren
for(int k=0;k<polygon[II][i].length;k++)
pakt[i][k] = polygon[II][i][k];
}
else if(KK>=0 && KK<polygon.length && II>=0 && II<polygon.length && II!=KK) //Morphing durchführen
{
for(int i=0;i<polygon[II].length;i++) //Kopieren
for(int k=0;k<polygon[II][i].length;k++)
pakt[i][k] = VV*polygon[II][i][k] + (1.0-VV)*polygon[KK][i][k];
}
for(int i=0;i<volume.length;i++)
{
float pos = (float)(i+1)*area;
line(pos,0,pos,volume[i]*height);
}
stroke(0,255,0);
drawPolygon(pakt);
}
Code 0-4: Strukturelles Morphing von Polygonen als Anhaltspunkt für das Morphing von Sound-Events.
Soundobjekt-Entwurf
Soundobjekt001.zip
Soundobjekt002_loop.zip -- Loops automatisch beenden
Soundobjekt003_Kollision.zip -- Behandlung von Kollisionen / Distanzberechnung siehe draw()
Steseq001.zip
Steseq002_variablesTempo.zip
Steseq003_Multi.zip