Pandora’s Wreath: Story of Redemption

The Beginning: 

When I first started conceptualizing this project, I was mainly interested in creating an immersive horror experience inspired by the myth of Pandora’s box. However, as I dug deeper into the original story and examined different interpretations, I began to see Pandora in a new light.

The more common retelling portrays her as careless or even spiteful for releasing evil upon humanity. Yet upon exploring the historical and cultural context further, I realized this is an overly simplistic and frankly unjust characterization. Pandora was a curious young woman who was manipulated by the gods, not an orchestrator of malice.

It was important for me to help share this new perspective I gained. Too often, powerful female figures from mythology are reduced to one-dimensional villains thanks to biased storytelling over time. With this project, I want to highlight Pandora’s humanity – her innate desire to understand the world around her, which should not be punished. Above all, I hope people come away with a renewed appreciation for hope, the greatest gift left in Pandora’s box according to the myth. It is my goal to spread more empowering portrayals of such influential women from antiquity. I believe reexamining their depiction through a modern lens can help us today.

CONCEPT AND DESIGN

My project, titled “Pandora’s Wreath: The Story of Redemption”, reimagines the myth of Pandora’s box through an interactive narrative experience. Through early research into the original myth and different interpretations, I discovered that Pandora is often portrayed overly simplistically and unjustly. My essay exploring this new perspective led to the formation of the project’s concept: to challenge the traditional misogynistic narrative and instead highlight Pandora’s humanity, courage, and the ultimate message of hope.

To evoke empathy for Pandora’s experience, I designed the project to literally place users in her shoes by casting them as Pandora. This immersive first-person perspective informed design decisions like structuring the narrative progression to mirror Pandora’s emotional transformation from curiosity defeating anger to finally, melodic relief. to . I also incorporated different symbolic elements like ascending ambient sounds and metaphorical boxes to immerse users and guide them along Pandora’s emotional journey. Each box was equipped with light sensors that would trigger the sounds and lights for that “stage” of Pandora’s journey. 

Video 1

During user testing, I observed that participants had some difficulty connecting emotionally due to a lack of visual storytelling elements. To address this, I added visual metaphors inside the boxes like human organs or eyes to enhance the immersion. I also received feedback that the initial emotions of wonder didn’t come through strongly enough. Therefore, I amplified the atmosphere of curiosity and mystery at the beginning with brighter yellow lights and softer music. These adaptations helped users connect with Pandora’s perspective more deeply.

Video 2

FABRICATION AND PRODUCTION

The most significant steps of the production process involved developing the interactive narrative within the boxes, as well as the physical construction of the boxes themselves.

For the interactive elements, I aimed to use light sensors and ambient sounds played through a speaker to guide the user’s emotional progression. However, I faced difficulties where certain sounds would get over-triggered or fail to respond properly to the light inputs. Testing revealed issues with the sensor sensitivity – not enough light would prevent activation. To solve this, Kevin helped me reorganize the code into separate “states”  and use Boolean true/false statements to make sure the sounds get looped but do not interfere with each other.  

In constructing the boxes, I wanted visual elements and textures to enhance the immersive experience. However, adding clay structures, door handles, and other chosen design features caused the boxes to no longer close completely. To resolve this, I incorporated black side curtains – though this altered the intended aesthetic. The tensions between interactive functionality vs physical design showcased the flaws in my planning. If I were to redo this project, I would better account for the dimensions of my physical decorations. 

 

For materials, I selected wood over 3D printing because it creates a more natural sensory experience aligned with the mythic narrative. Wood possesses the authentic feeling of a story rooted in ancient tradition. Though plastic may have had practical advantages, the intentional grounding of users in an earthy atmosphere was a priority informed by my project goals of emotional resilience.

 

I wanted to include an interactive, call-and-response element between the boxes and the user to enhance the immersive experience. Light sensors were the ideal choice to facilitate this iterative process. As the mythical narrative unfolds with each opened box, the sensors allow the experience to unfold organically through the user’s direct participation.

The ambient sounds are designed to first intrigue the user, mirroring Pandora’s own curiosity. But for the auditory storytelling to continue evolving, the user must physically engage by opening the boxes, allowing light to trigger the next phase. This creates a sense of discovery through the user’s actions, with their inputs naturally progressing both the technical and narrative aspects of the journey. By incorporating this call-and-response mechanism between boxes and light sensors, I aimed to transform the user from a passive observer into an active participant in Pandora’s redemptive story. 

CONCLUSION

The overarching goal of this project was to reimagine the myth of Pandora in a way that challenged the traditional misogynistic narrative and highlighted her humanity. Through an immersive multimedia experience placed within symbolic boxes, I aimed to guide users through Pandora’s emotional journey and foster empathy for her complex experience.

Based on the feedback I have received, my project was largely successful in achieving this goal. Participants reported feeling immersed in Pandora’s perspective and appreciating the project’s reexamination of her character. However, there were also technical challenges, such as issues with sensor sensitivity and sound triggers that disrupted fluid interaction at times.

If given more time, I would have invested in further refining the interactive elements to ensure a seamless call-and-response between user inputs and system outputs. I also learned the importance of balancing technical and production concerns to avoid compromising the intended aesthetic experience.

As an interactive multimedia project, there were competing priorities between making the user experience as fluid and seamless as possible versus achieving the intended aesthetic experience through tangible box constructions and visual elements.

Initially, I focused heavily on incorporating interactive elements like light sensors and ambient sounds without fully considering how additional physical components might impact things. When adding decorative handles, clay structures, and side curtains to the boxes, it compromised their ability to reliably close and subtly disrupted the sensor triggers at times.

Going forward, I realized I need to prototype and test production designs earlier in the process to avoid functional issues down the line. It’s important to evaluate technical specifications and interactive requirements simultaneously with aesthetic visions. More planning and iterative testing between mock-ups and working prototypes could have prevented unintended consequences on the user experience from physical additions.

While no project is perfect, overcoming setbacks taught me the value of perseverance and continual improvement through feedback integration.

I learned that scope is key when tackling ambitious hybrid projects. While pushing boundaries can yield exciting results, it also adds complexity that requires careful management. In the future, I will be more realistic about the time and resources needed to successfully merge different media.

Most significantly, I gained insight into the social and cultural influences that shape how stories are told and retold over generations. Myths are not fixed artifacts but living narratives that reflect the priorities of their tellers. 

DISASSEMBLY

APPENDIX

Inspiration Photos: 

Arduino Code: 

#include <FastLED.h>
#define NUM_LEDS 60  // How many LEDs in your strip?
#define DATA_PIN 3   // Which pin is connected to the strip’s DIN?
CRGB leds[NUM_LEDS];
int next_led = 0;    // 0..NUM_LEDS-1
byte next_col = 0;   // 0..2
byte next_rgb[3];    // temporary storage for next color
void setup() {
  Serial.begin(9600);
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  FastLED.setBrightness(50);  // external 5V needed for full brightness
  leds[0] = CRGB::Red;
  FastLED.show();
  delay(3000);
  leds[0] = CRGB::Black;
  FastLED.show();
}
void loop() {
  // to send values to Processing assign the values you want to send
  // this is an example:
  int sensor1 = analogRead(A0);
  int sensor2 = analogRead(A1);
  int sensor3 = analogRead(A2);
  int sensor4 = analogRead(A3);
  int a = map(sensor1, 0, 1023, 0, 10);
  int b = map(sensor2, 0, 1023, 0, 10);
  int c = map(sensor3, 0, 1023, 0, 10);
  int d = map(sensor4, 0, 1023, 0, 10);
  // send the values keeping this format
  Serial.print(sensor1);
  Serial.print(“,”);  // put comma between sensor values
  Serial.print(sensor2);
  Serial.print(“,”);
  Serial.print(sensor3);
  Serial.print(“,”);
  Serial.print(sensor4);
  Serial.println();  // add linefeed after sending the last sensor value
  // too fast communication might cause some latency in Processing
  // this delay resolves the issue
  delay(20);
  // end of example sending values
  while (Serial.available()) {
    char in = Serial.read();
    if (in & 0x80) {
      // synchronization: now comes the first color of the first LED
      next_led = 0;
      next_col = 0;
    }
    if (next_led < NUM_LEDS) {
      next_rgb[next_col] = in << 1;
      next_col++;
      if (next_col == 3) {
        leds[next_led] = CRGB(next_rgb[0], next_rgb[1], next_rgb[2]);
        next_led++;
        next_col = 0;
      }
    }
    if (next_led == NUM_LEDS) {
      FastLED.show();
      next_led++;
    }
  }
}
 
Processing Code: 
import processing.serial.*;
import processing.sound.*;

int NUM_OF_VALUES_FROM_ARDUINO = 4;  /* CHANGE THIS ACCORDING TO YOUR PROJECT */

/* This array stores values from Arduino */
int arduino_values[] = new int[NUM_OF_VALUES_FROM_ARDUINO];

Serial serialPort;
SoundFile sound;
SoundFile sound2;
SoundFile sound3;
SoundFile sound4;
SoundFile sound5;
SoundFile sound6;
SoundFile sound7;
SoundFile sound8;
SoundFile sound9;
SoundFile sound10;
SoundFile sound11;
SoundFile sound12;
SoundFile sound13;
SoundFile sound14;
SoundFile sound15;
SoundFile sound16;
SoundFile sound17;


int state = 0;

int NUM_LEDS = 60;                   // How many LEDs in your strip?
color[] leds = new color[NUM_LEDS];  // array of one color for each pixel
// ambience sound in the background


void setup() {
  size(900, 600);
  frameRate(30);

  printArray(Serial.list());
  // put the name of the serial port your Arduino is connected
  // to in the line below - this should be the same as you're
  // using in the "Port" menu in the Arduino IDE
  serialPort = new Serial(this, "COM4", 9600);

  println("Loading mp3...");

  sound = new SoundFile(this, "The_Arrival.mp3");
  sound2 = new SoundFile(this, "Monster_dark.mp3");
  sound3 = new SoundFile(this, "voice1_box1_v2.mp3");
  sound4 = new SoundFile(this, "angelic_voice.mp3");
  sound5 = new SoundFile(this, "demonic_scream.mp3");
  sound6 = new SoundFile(this, "sisters_voices.mp3");
  sound7 = new SoundFile(this, "possessed_laugh.mp3");
  sound8 = new SoundFile(this, "girl_scream.mp3");
  sound9 = new SoundFile(this, "song_of_the_sirens.mp3");
  sound10 = new SoundFile(this, "heavy_breathing.mp3");
  sound11 = new SoundFile(this, "metal_roar.mp3");
  sound12 = new SoundFile(this, "I_want_you_dead.mp3");
  sound13 = new SoundFile(this, "mechanical_footsteps.mp3");
  sound14 = new SoundFile(this, "metal_laugh.mp3");
  sound15 = new SoundFile(this, "box4_one.mp3");
  sound16 = new SoundFile(this, "box4_love.mp3");
  sound17 = new SoundFile(this, "horror_music.mp3");


  state = 0;
  background(0);
  stroke(255);
  fill(255);
}

void draw() {
  // receive the values from Arduino
  getSerialData();

  // use the values like this:
  float a = map(arduino_values[0], 0, 1023, 0, 10);
  float b = map(arduino_values[1], 0, 1023, 0, 10);
  float c = map(arduino_values[2], 0, 1023, 0, 10);
  float d = map(arduino_values[3], 0, 1023, 0, 10);


  if (state == 0) {      //no box opened

    if (sound9.isPlaying() == false) {
      // start playing it
      sound9.play();
    }

    if (a >= 1) { //box1
      state = 1;
      sound9.stop();
    }
  } else if (state == 1) {    //box 1 was opened
    if (!sound.isPlaying()) {
    sound.play();
    }
    if (!sound2.isPlaying()) {
    sound2.play();
    }
    if (sound6.isPlaying() == false) {
      sound6.play();
    }
    if (sound3.isPlaying() == false) {
      sound3.play();
    }

    println("Sound 3 playing...");

    float progress = sound.position() / sound.duration();
    println(progress); // find out where we are in the song (0.0-1.0)
    if (progress >= 0 && progress <= 1.0) {
      for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = color(255, 190, 0); // turn a pixel to red
      }
    }

    sendColors();                        // send the array of colors to Arduino

    if (b >= 1) {
      state = 2;
      sound.stop();
      sound2.stop();
      sound3.stop();
      sound6.stop();
    }
  } else if (state == 2) {    //box 2 was opened
    //do other things
    if (!sound.isPlaying()) {
      sound.play();
    }
    if (!sound2.isPlaying()) {
      sound2.play();
    }
    if (!sound5.isPlaying()) {
      sound5.play();
    }
    if (!sound7.isPlaying()) {
      sound7.play();
    }

      if (sound8.isPlaying() == false) {
        sound8.play();
      }
      float progress = sound.position() / sound.duration();
      println(progress); // find out where we are in the song (0.0-1.0)
      if (progress >= 0 && progress <= 1.0) {
        for (int i = 0; i < NUM_LEDS; i++) {
          leds[i] = color(144, 12, 63); // turn a pixel to darker red
        }
      } else {
        // Turn off all LEDs if the progress is outside the valid range
        for (int i = 0; i < NUM_LEDS; i++) {
          leds[i] = color(0, 0, 0);
        }
      }

      sendColors();                        // send the array of colors to Arduino
      
    if (c >= 1) {
      state = 3;
      sound.stop();
      sound2.stop();
      sound5.stop();
      sound7.stop();
      sound8.stop();
    }
  } 
  else if (state==3) { //box 3 opened
     if(!sound12.isPlaying()) {
      sound12.play();
     }
     if(!sound10.isPlaying()) {
      sound10.play();
     }
      if (!sound17.isPlaying()) {
      sound17.play();
      }
      if (!sound13.isPlaying()) {
      sound13.play();
      }
      if(!sound11.isPlaying()) {
      sound11.play();
      }
      
      if (d >= 1) {
      state = 4;
      sound12.stop();
      sound11.stop();
      sound10.stop();
      sound17.stop();
      sound13.stop();
    }
    }
  else if (state == 4) {    //box 3 was opened
    //do other things
    if(!sound16.isPlaying()) {
      sound16.play();
    }
    if(!sound15.isPlaying()) {
      sound15.play();
    }
  }
  println(state);
}






// the helper function below receives the values from Arduino
// in the "arduino_values" array from a connected Arduino
// running the "serial_AtoP_arduino" sketch
// (You won't need to change this code.)

void getSerialData() {
  while (serialPort.available() > 0) {
    String in = serialPort.readStringUntil( 10 );  // 10 = '\n'  Linefeed in ASCII
    if (in != null) {
      print("From Arduino: " + in);
      String[] serialInArray = split(trim(in), ",");
      if (serialInArray.length == NUM_OF_VALUES_FROM_ARDUINO) {
        for (int i=0; i<serialInArray.length; i++) {
          arduino_values[i] = int(serialInArray[i]);
        }
      }
    }
  }
}

void sendColors() {
  byte[] out = new byte[NUM_LEDS*3];
  for (int i=0; i < NUM_LEDS; i++) {
    out[i*3]   = (byte)(floor(red(leds[i])) >> 1);
    if (i == 0) {
      out[0] |= 1 << 7;
    }
    out[i*3+1] = (byte)(floor(green(leds[i])) >> 1);
    out[i*3+2] = (byte)(floor(blue(leds[i])) >> 1);
  }
  serialPort.write(out);
}

One comment

Leave a Reply

Your email address will not be published. Required fields are marked *