Haunted House _{ Brothers’ Room }


For the class Haunted House Final, which is a real haunted house held on the floor of ITP, Jonathan, Michelle and I created “Brothers’ Room“, depicting a tragedy happened between brothers and how the lived one is haunted by the guilt and grief.



  • Pere and his brother died in an accident and arrived at this intermediate stage between life/death. Brother, feeling unconflicted, moved on to afterlife, but Pere stays out of guilt, because he’s responsible for his brother’s death.
  • Pere is haunted by himself.



  • The room is a representation of Pere’s mind.
  • Showing the loop of emotions
  • (1) sweet memory with brother
  • (2) scared of Brother’s death
  • (3) freaks out as Brother’s ghost showing up in the mirror
  • (4) guilty and asks for forgiving
  • back to (1)


Technique / Effects
–> Reflecting Pere’s emotions, the room reflects this with more intense light, sound, and walls shaking. At the climax, the man realizes he’s responsible for his brother’s death, the wall of the hidden room drops, and his brother appears in the 2-way mirror. The man sees him and cracks. Annnnd, start over!

  • DMX lights: controlled by Arduino, Tinker.it! DMX shield, and Max/Msp patch
  • Sounds / Music: controlled by Max/Msp patch
  • Burned scar of Brother: latex gel, tissues, and colors
  • Hidden Room Revealed: fabric and strings!




Prep / Installation


Show Time


Other Scenes


Whole Crews 😀


Memory Glasses –> TO remember OR TO forget

[idea update, 10/19]

For the “Device to Forget”, I started brainstorming by thinking that who/what to do the action of forgetting? S/He/It could be meother peopleanimalsmachines, and even time. And then when I researched for forgetting, I gradually came out of the idea to replace the one you want to forget with the new one, like hallucinating yourself, and that can apply to my memory glasses idea!

Originally, “Memory Glasses” is putting objects that represent daily highlights into the glass bottles, and also restoring sounds related to it digitally. But now, I’m thinking about changing it into a device also can help you forgetting something too!

So. For example, A tries to forget B(could be a person or an event).

  1. First of all, A collected all the stimuli that relate to B, and put them into the glass bottles. With each glass bottles, A records the related memories into each bottles.
  2. A puts the device in a public place. People come close, looking at each bottles and listening to the memories.
  3. People are asked to come out their own versions of stories with each bottles, and record them with the device.
  4. From time to time, A comes to the device and, looking at the familiar objects but hearing the unfamiliar memories.
  5. Gradually, A‘s original memories relating to the objects fade, and new memories bloom.


[Note] – Before A listening to the stories/new memories, the device might need a C to be a filter.




[documentation, 10/13]

So. Prototype #2. Prototype #1 is a lovely but cranky one. Due to the bad connection between the theoretical workable but awful functional design, I decided to make another version of it. After the office hour with Daniel Rozin, I realized the importance of stableness of this installation. For people to casually take up and put back, the connection of switches should be robust enough, e.g. jack head base.


But because of the gear testing of Automata, I kind of fell in love with steel wire, and I’m wondering if it’s possible to cooperate glass bottles with steel wires.



And here’s the test! Thanks to Andy’s suggestion, I change the method of reading the status of the switches. From one by one to multiplexing. Here’s a detailed description/tutorial of it. It looks simple, like “oh just buttons big deal~”, but took me so much fxxking time. That’s just reminded me again: “Nothing is simple.”



***Remember to use the 10K as pull-down resistors!!! The main reason that made me struggle whole night…. even I used other resistors but not 10k. GEEZ.

interview and sensors test {FungU}

Interview with Stephen from Ecovative and Customer Service Lady from Fungi Perfecti:

  • Free form mycelium fabrication could be doable, just remember to degerm.
  • Can’t be pressed in small mold because it will be hard to take out of the mold.
  • Can try to put growing log in the mold I make to grow, but cut it in half equals to cut the nutrients in half.

Discuss with Scott:

  • Questions for myself
    • organic or clean? based on what message I want to send, what emotion I want people to have be intrigued, be bound, to have raw motion from
    • —> messy, wild, crazy —> Organic!




  • kind of achieve to mimic the movement of the mushroom: when no one near, the mushroom keeps swinging, when ppl come near, the mushroom is aware and then stops.
  • problems: swing speed needs to slow down, could be more sensitive and accurate. ASK around. Yo.


  • order oyster mushroom kit
  • try using mycelium as dough(if it’s doable, project might change)
  • physical design
  • software design
  • LAB in shops
  • blue foam: big & small fungi
  • wood base box
  • put oyster mushroom in it and wait it to grow!!!

5-in-5_Day1_Unicorn Striking through the Grass

“n-in-n”, a tradition around ITP, where students complete n project in n day, over a certain number of days.

In this case, 5 days, 5 projects. Besides participating bunch of workshops held by amazing 2nd-years, for my Day1 project, I was thinking about doing StormLighter with this tutorial, but cut it off because of the shortage of materials. So I moved on to other new stuff: Capacity Sensing Library, which I always wanted to try, and RGB Led, because why not. For few hours here’s my rainbow-ish project result.




#include <CapacitiveSensor.h>

int redPin = 11;
int greenPin = 10;
int bluePin = 9;

int sendPin = 4;
int RreceivePin = 2;
int GreceivePin = 6;
int BreceivePin = 8;

CapacitiveSensor   cs_4_2 = CapacitiveSensor(4,2);
CapacitiveSensor   cs_4_6 = CapacitiveSensor(4,6);
CapacitiveSensor   cs_4_8 = CapacitiveSensor(4,8);

void setup()
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);


void loop()
  long start = millis();
  long total1 =  cs_4_2.capacitiveSensor(30);
  long total2 =  cs_4_6.capacitiveSensor(30);
  long total3 =  cs_4_8.capacitiveSensor(30);

  Serial.print(millis() - start);       

  int colorR = (int)map(total1, 0, 100, 0, 255);
  int colorG = (int)map(total2, 0, 100, 0, 255);
  int colorB = (int)map(total3, 0, 100, 0, 255);

  setColor(colorR, colorG, colorB);


void setColor(int red, int green, int blue)
  analogWrite(redPin, red);
  analogWrite(greenPin, green);
  analogWrite(bluePin, blue);  

references: 1, 2


Burned my arduino...

Inspired by the crazy servo motor workpiece by David Bowen, I tried to learned controlling DC motor rotating direction with H-bridge through this tutorial but failed to change the direction. The result was either rotated or stopped. Thinking the possibility of my motor might be broken, I borrowed other’s official stater kit’s DC motor, which was smaller than mine, and then things just went wrong…

The motor spun so fast and Uno became kind of warm. I pulled out the power supply but it was too late. I couldn’t upload any sketches anymore. Even unplugged all the wires and run the Example sketch…. NOOO000ooo….

Too frustrated to take a pic of my breadboard. Should remember to avoid emotions stopping you document next time…

PComp_5_Don’t Touch My Cookie!

Fantasy kind of comes to live guys!

After the PComp class, I was inspired to do more about how the communications between Arduino and Processing. I want them to be more instinct, more meaningful, and more related to each other, not just switching on and off. And stay away using MOUSE to control/adjust my work all the time. My works should have their own behaviors patterns, without others tell them what to do. (kind of like users can only have small control/impact on them ;))

So I came out of an idea to control the chocolate spiders amount of my this week’s ICM homework! Since my intention of this project is scaring away people who try to eat it, why not building the interaction based on that? The more you come closer to the cookie(I use photosensor), the more chocolate spiders will come out alive. And the button at Top Left corner will turn red to warn!PComp_cookie_spider

And it worked! 😀 The contends and the behavior matched perfectly. First time! Exciting!! And my circuit looked simple as well.

2013-10-09 14.33.07

Come out a good/crazy idea, and then execute it well in the most instinct and simplest way. It’s my goal of life now.

Below are my To-Do-Lists that inspired through today’s PComp class:

  1. Change velocity, acceleration, changes, instead of just position and on-and-off, so when there’s no input(no one using it), animation still runs.
  2. Different modes with different compositions of inputs. (e.g. Mode A: button 1; Mode B: button 1+2 …)
  3. Let users feel they control something in an abstract way. (Wwwwooo complicated…)


In PComp class Billy and I make a Music Instrument that can adjust the pitch by pressing and tapping. Check this out!


#include "pitches.h"

int lastButtonState = LOW;
boolean switchIsOn = false;

const int threshold = 10;
const int speakerPinNum = 8;
const int noteDuration = 20;

const int potenPinNum = 5;
int volumeAnalogValue = 0;
int volume = 0;

const int potPinNum = 2;
float saveNote;

int note[] = {
  NOTE_C4, NOTE_E4};

void setup() {
  saveNote = note[1];


void loop() {

  int buttonState = digitalRead(2);

  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      switchIsOn = !switchIsOn;

  lastButtonState = buttonState;

  if (switchIsOn == true) {

    int pitchRead = analogRead(0);
    int noteRead = analogRead(1);

    float pitch = map(pitchRead, 0, 950, 0, 100);

    if (pitch > 0) {
      note[1] += pitch;
    else {
      note[1] = saveNote;

    Serial.print(" ");

    if(noteRead > threshold) {
      tone(speakerPinNum, note[1], noteDuration);

As for my review for this on Sunday, I made a basic music kit that you can control on/off, volumes, pitches(higher/lower), and tempo. But since it’s a single-note playing machine instead of templates/clip of music triggered one, it makes no difference with the changes of tempo.


And thanks to almighty Moon! I got the idea of setting button-“released” as the command to adjust pitches, so that pitches won’t go crazy because of the unmeasurable amount/time of button-“pressed” when you press the button. Thank you Moon 😀

What I want to do next–

  1. make chords (office hour w/ resident booked!)
  2. play continuous clips instead of single notes
  3. be creative! not just pressing buttons… not interesting at all… go go go!

And here’s the code.

#include "pitches.h"

int lastButtonState = LOW;
boolean switchIsOn = false;

const int threshold = 600;
const int speakerPinNum = 8;
const int switchPinNum = 2;
const int higherPitchPinNum = 4;
const int lowerPitchPinNum = 3;

int pre_higherPitchRead = 0;
int pre_lowerPitchRead = 0;

const int tempoPinNum = 0;
const int noteGPinNum = 1;
const int noteEPinNum = 2;
const int noteCPinNum = 3;

const int noteDuration = 20;

int saveNote[3];
int note[] = {NOTE_C4, NOTE_E4, NOTE_G4};

void setup() {

  // save the original notes
  for (int i=0; i<3; i++) {
    saveNote[i] = note[i];

void loop() {

  // on-off switch setting
  int buttonState = digitalRead(switchPinNum);
  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      switchIsOn = !switchIsOn;
  lastButtonState = buttonState;

  // read different notes
  int noteCRead = analogRead(noteCPinNum);
  int noteERead = analogRead(noteEPinNum);
  int noteGRead = analogRead(noteGPinNum);

  // set up duration of notes
  int tempoRead = analogRead(tempoPinNum);
  int tempo = map(tempoRead, 0, 1023, 5, 100);

  // press buttons to make notes go higher/lower 
  int higherPitchRead = digitalRead(higherPitchPinNum);
  int lowerPitchRead = digitalRead(lowerPitchPinNum);

  // when switch is on
  if (switchIsOn == true) {

    Serial.print("  ");

    // make notes go higher or lower
    for (int i=0; i<3; i++) {
      if (higherPitchRead == LOW && pre_higherPitchRead == HIGH) {
        note[i] *= 2;
     if (lowerPitchRead == LOW && pre_lowerPitchRead == HIGH) {
        note[i] /= 2;
      note[0] = constrain(note[0], 32, 4192);
      note[1] = constrain(note[1], 41, 5280);
      note[2] = constrain(note[2], 49, 6272);

    // make sounds!
    if(noteCRead < threshold && noteERead < threshold && noteGRead < threshold) {
      for (int i=0; i<3; i++) {
        tone(speakerPinNum, note[i], tempo);
    } else if(noteCRead < threshold && noteERead < threshold) {
      tone(speakerPinNum, note[0], tempo);
      tone(speakerPinNum, note[1], tempo);
    } else if(noteCRead < threshold && noteGRead < threshold) {
      tone(speakerPinNum, note[0], tempo);
      tone(speakerPinNum, note[2], tempo);
    } else if(noteGRead < threshold && noteERead < threshold) {
      tone(speakerPinNum, note[2], tempo);
      tone(speakerPinNum, note[3], tempo);
    } else if(noteCRead < threshold) {
      tone(speakerPinNum, note[0], tempo);
    } else if(noteERead < threshold) {
      tone(speakerPinNum, note[1], tempo);
    } else if(noteGRead < threshold) {
      tone(speakerPinNum, note[2], tempo);

    Serial.print(" ");
    Serial.print(" ");
    Serial.print(" ");
    Serial.println(" ");

  } else {
    for (int i=0; i<3; i++) {      // when swtich-off
      note[i] = saveNote[i];       // restore the original notes

  // remember the previouse higher/lower pitch buttons status
  pre_higherPitchRead = higherPitchRead;
  pre_lowerPitchRead = lowerPitchRead;