Random Acts of Vulnerability
Random Acts of Vulnerability ist ein immersives Spiel für vier Spieler*innen in vier Dimensionen. Durch Erkundung und Dokumentation der jeweils eigenen Dimension, formen die Spieler*innen anhand des Gesammelten und Erlebten die Erzählungen selbst. Auf ein installatives Netz aus experimentellen Materialen, soften Schaltkreisen, meditativen Klangwelten, grotesken Interfaces und verzerrten Output-Signalen aufbauend, werden Fragen nach Isolation, Einsamkeit, immaterieller und haptischer Vernetzung und der Herstellung von Verhandlungsgrundlagen gestellt.
Eine Arbeit von: Zoe Lohmann, Ella Estrella Tischa Raetzer, Rodolfo Acosta Castro, Lena Böckmann
Video: https://www.youtube.com/watch?v=850KCMYEAow&t=7s
Inhaltsverzeichnis
dokumentation_JAM 📎
- Bilddokumentation sammelt und einordnen
- künstlerisch/ästhetisch mit dem Material umgehen
- Dokumentieren auch Fehler, persönliche Ansprüche und Gespräche, Unerwartetes genauso wie
- Code-Snippets, Schaltpläne, Materialen, Skizzen
- usw.
- let's go! 🔥
PS --> how to display Emojis:
DOME 1
Harte Materialien
- Stretch-Jersey
- Polymorph
- Audiojacks
- Aux-Kabel
- Kunstblumen
- Röhrenfernsehe
etc...
Softe Materialien
- Processing-Codes
- Fingerhäkeln: https://www.youtube.com/watch?v=vfScF5EQ3sU
Sound
- Klangbeispiele hochladen
DOME 2
Harte Materialien
Watte, Silikon, Kunstblumen, LED-Kerzen....
Softe Materialien
Sound/Klang
Beispiele hochladen
DOME 3 (mini-dom)
Harte Materialien
Kunstrasen, Number pad, Bürstenroboter, ...
Hacks
Einfache Arduino-to-Arduino Kommunikation mit Vactrol
Sound
Beispiele hochladen
arbeitsprozess
1te Runde
Mini-Workshops
Ella Sound Workshop
Zoe Silicon Workshop
BAT
2te Runde
Proberaum HFS
NextLevel Festival
relevant links
ESP with Arduino: http://hyperdramatik.net/mediawiki/index.php?title=ESP32_mit_Arduino
MQTT: http://hyperdramatik.net/mediawiki/index.php?title=Hauptseite#MQTT
DOMEs: http://hyperdramatik.net/mediawiki/index.php?title=Dome_Pod_KIT
code examples from the project
Arduino code for sounds in the fishing-dome
// running on an ESP Spaghetti Monster
int numOfSensors = 6; byte analogPins[] = { 36, 39, 34, 35, 32, 33 }; void setup() { for (int i = 0; i < numOfSensors; i++) { pinMode(analogPins[i], INPUT); } Serial.begin(9600); } void loop() { for (int i = 0; i < numOfSensors; i++) { Serial.print(analogRead(analogPins[i])); Serial.print("\t"); } Serial.println(); delay(20); }
Processing code for sounds in the fishing-dome
CODE DESCRIPTION: 6 textile stretch sensors trigger 6 different sounds when they pass a threshold. sound files should be stored in a folder called "data" within the sketch folder.
/* RANDOM ACTS OF VULNERABILITY code for sounds in the fishing-dome 6 textile stretch sensors trigger 6 different sounds when they pass a threshold. sound files should be stored in a folder called "data" within the sketch folder. */ import processing.serial.*; import ddf.minim.*; Serial myPort; Minim minim; AudioSample sound0; AudioSample sound1; AudioSample sound2; AudioSample sound3; AudioSample sound4; AudioSample sound5; /////////////////////////////////// //change these: /////////////////////////////////// int numOfSensors = 6; int ADCmax = 4095; //int ADCmax = 1023; float[] sensorThresholds = {1000, 1000, 1000, 1000, 1000, 1000};//new float[numOfSensors]; /////////////////////////////////// float[] sensorValues = new float[numOfSensors]; float[] previousSensorValues = new float[numOfSensors]; float xpos = 0; void setup () { size(600, 400); smooth(); background(255); println(Serial.list()); String portName = Serial.list()[1]; myPort = new Serial(this, "/dev/cu.SLAB_USBtoUART", 9600); myPort.clear(); myPort.bufferUntil('\n'); minim = new Minim(this); sound0 = minim.loadSample( "harddisc_grummeln_kurz.wav", 512); sound1 = minim.loadSample("crazyfrogbardcore.wav", 512); sound2 = minim.loadSample("musterfinal.wav", 512); sound3 = minim.loadSample("harddisc_grummeln_kurz.wav", 512); sound4 = minim.loadSample("hihat_single.wav", 512); sound5 = minim.loadSample("kick_single.wav", 512); } void draw () { graph(); } void graph() { for (int i=0; i<numOfSensors; i++) { if (sensorValues[i] < sensorThresholds[i]) sound(i); // map the incoming values to an appropriate range: float ypos = map(sensorValues[i], ADCmax, 0, 0, height/numOfSensors); // figure out the y position for this particular graph: float graphBottom = i * height/numOfSensors; ypos = ypos + graphBottom; // draw the graph bottoms: stroke(0); strokeWeight(1); line(0, graphBottom, width, graphBottom); // draw the thresholds: stroke(200, 0, 0); strokeWeight(1); float redLine = map(sensorThresholds[i], ADCmax, 0, 0, height/numOfSensors); line(0, redLine + graphBottom, width, redLine + graphBottom); stroke(0); strokeWeight(2); line(xpos, previousSensorValues[i], xpos+1, ypos); previousSensorValues[i] = ypos; // if you've drawn to the edge of the window, start at the beginning again: if (xpos >= width) { xpos = 0; background(215); } else xpos+=0.1; } } void serialEvent (Serial myPort) { // get the ASCII string: String inString = myPort.readStringUntil('\n'); // if it's not empty: if (inString != null) { // trim off any whitespace: inString = trim(inString); // convert to an array of ints: int incomingValues[] = int(split(inString, "\t")); if (incomingValues.length <= numOfSensors && incomingValues.length > 0) { for (int i = 0; i < incomingValues.length; i++) { sensorValues[i] = incomingValues[i]; print(sensorValues[i] + "\t"); } println(); } } } void sound(int soundSample) { switch(soundSample) { case 0: sound0.trigger(); break; case 1: sound1.trigger(); break; case 2: sound2.trigger(); break; case 3: sound3.trigger(); break; case 4: sound4.trigger(); break; case 5: sound5.trigger(); break; } }
Processing code for sounds in the dating-dome
CODE DESCRIPTION: 4 very sensitive "balloon-pushbuttons" on a makey makey trigger sound files. every minute there is a scene change and the sound files are updated. sound files should be stored in a folder called "data" within the sketch folder.
/* RANDOM ACTS OF VULNERABILITY code for sounds in the dating-dome 4 very sensitive "balloon-pushbuttons" on a makey makey trigger sound files. every minute there is a scene change and the sound files are updated. sound files should be stored in a folder called "data" within the sketch folder. */ import ddf.minim.*; Minim minim; AudioSample sound0; AudioSample sound1; AudioSample sound2; AudioSample sound3; AudioSample sound4; AudioSample sound5; int delayTime = 800; boolean w_released = true; boolean d_released = true; boolean s_released = true; boolean a_released = true; int maxCount = 3; int w_count = 0; int a_count = 0; int s_count = 0; int d_count = 0; int szene = 0; int previousSzene; int soundChangeInterval = 5000; void setup () { size(1000, 800); smooth(); minim = new Minim(this); background(255); } void draw () { szene = minute() % 3; if (szene != previousSzene) { previousSzene = szene; println(szene); if (szene == 0) { sound0 = minim.loadSample("be.wav", 1000); sound1 = minim.loadSample("come.wav", 1000); sound2 = minim.loadSample("together.wav", 1000); sound3 = minim.loadSample("withMe.wav", 1000); } if (szene == 1) { sound0 = minim.loadSample("hihat_single.wav", 1000); sound1 = minim.loadSample("hihat_single.wav", 1000); sound2 = minim.loadSample("hihat_single.wav", 1000); sound3 = minim.loadSample("hihat_single.wav", 1000); } if (szene == 2) { sound0 = minim.loadSample("kick_single.wav", 1000); sound1 = minim.loadSample("kick_single.wav", 1000); sound2 = minim.loadSample("kick_single.wav", 1000); sound3 = minim.loadSample("kick_single.wav", 1000); } } } void keyPressed() { if ((key == 'w' || key == 'W') && w_released == true && w_count < maxCount) { background(0); w_released = false; sound(0); delay(delayTime); w_count ++; a_count = 0; s_count = 0; d_count = 0; } if ((key == 'a' || key == 'A') && a_released == true && a_count < maxCount) { background(200, 0, 0); a_released = false; sound(1); delay(delayTime); a_count ++; w_count = 0; s_count = 0; d_count = 0; } if ((key == 's' || key == 'S') && s_released == true && s_count < maxCount) { background(0, 200, 0); s_released = false; sound(2); delay(delayTime); s_count ++; w_count = 0; a_count = 0; d_count = 0; } if ((key == 'd' || key == 'D') && d_released == true && d_count < maxCount) { background(0, 0, 200); d_released = false; sound(3); delay(delayTime); d_count ++; w_count = 0; a_count = 0; s_count = 0; } } void keyReleased() { if (key == 'd' || key == 'D') { d_released = true; } if (key == 'a' || key == 'A') { a_released = true; } if (key == 's' || key == 'S') { s_released = true; } if (key == 'w' || key == 'W') { w_released = true; } } void sound(int soundSample) { switch(soundSample) { case 0: sound0.trigger(); break; case 1: sound1.trigger(); break; case 2: sound2.trigger(); break; case 3: sound3.trigger(); break; } } }