ArtPal : Exhibition Suggestion Service

  • Concept
    “Web/Mobile service that user gets suggestion of exhibitions or collections in museums based on user’s preference and location.”
  • Target Group
    People who would like visit museum
    -People who do not know much about art
    -People who do not know which museum to go and what to see there
    -People who love art and visit museums regularly
    -People who want to explore huge collections in an efficient way
  • Information Diagram

diagram

 

  • Metadata

metadata

 

  • Wireframe

findpage

recompage

favoritepage

 

Concept design for web/mobile application. information architecture. collaboration with 3 people.

Interactive Fabric Instrument

Interactive Fabric Instrument – Prototype / Pure data, Arduino

This is a prototype for sound installation. Four pieces of fabric hang on a string, and each piece is about 1m 50cm long. When the fabrics sway, each piece generates a bell sound in different pitch. The original concept is hanging ribbons on a tree so that they can be played naturally by the wind. At the same time, when a person touches the ribbon, it generates sounds. Thus this installation can interact with the wind, a fan or a hand. A piezo (Piezoelectric sensor) is installed at the top of each fabric. As the fabric moves, the sensor gets analog values. Also there’s a contact mic which gets the values of noise when the wind blows. Since the real wind is not audible, puredata creates an artificial wind sound which reacts to the values. The bell sound, the wind sound, and the movement of fabrics are all merged and played in harmony together.

tree_s

: The concept image

Balloon Note app

default main

balloonnote

It’s not a rectangular shape note that you can organize texts linearly, but a circular shape note borrows a motif from balloons. There’s no complex menu, a user can just drag the screen and create balloons in size he/she wants, then write a short text on it. The user can decide classification and importance by selecting size, color and weight (position of the balloon : light balloons go up, heavy ones go down). Also, the user can delete the note (pop the balloon) by double tapping or two finger touch.

-to do list, idea note, keyword memo.
-free and creative approach to organize memos

Sunshine of last summer

sunshine2sunshine1

The concept is that I collected last summer’s sunshine and present it for those who are in a gloomy mood during the winter time because of lack of light. When you cover the jar with your hands, it will slowly glow and present you a bright atmosphere of last summer.

 

Winter is here. Daytime is too short.

I know that you are already missing the brilliant summer’s sunshine.

So here I brought one of my light collection for you.

‘Sunshine of last summer. Collected in July 2013’

Card flipping game

cardgame
Card flipping game, Processing.

View Source Code :-|

/*
Card memory game 
Caution : Don't click the cards too fast.
2013.12.05.NarimLee.
*/

int screenW = 740; 
int screenH = 1010; 

// cards front/back
int cardNum = 16;
int cardW = 160;
int cardH = 230;

String[] cardName = new String[cardNum];
PImage[] cardImg = new PImage[cardNum];
PImage[] back = new PImage[cardNum];

float[] rectX = new float[4];
float[] rectY = new float[4];
int[] imageRandom = new int[cardNum];
int margin = 20; 
int[][] matrix = 
{
  {0, 0}, {0, 1}, {0, 2}, {0, 3}, 
  {1, 0}, {1, 1}, {1, 2}, {1, 3},
  {2, 0}, {2, 1}, {2, 2}, {2, 3}, 
  {3, 0}, {3, 1}, {3, 2}, {3, 3},
};


// click image detection
int mouseCheck=0;
int clickImage1; 
float clickImage1X;
float clickImage1Y;
int clickImage2;
float clickImage2X;
float clickImage2Y;

// ending 
int finishCount=0;
PImage ending;

void setup(){
  
  background(255);
  size(screenW, screenH); 
  frameRate(20);
  
  // load card imgs 
  for(int i=0; i<cardNum; i++){
    back[i] = loadImage("back.jpg");
    cardName[i] = "card"+i+".jpg";
    cardImg[i] = loadImage(cardName[i]);
  }
  
  // X axis, Y axis position setting 
  for(int i=0; i<4; i++){
     rectX[i] = (cardW*i)+(margin*i)+margin;
     rectY[i] = (cardH*i)+(margin*(i+1));
   }
   
   // random position repeat preventing 
   for(int i=0; i<cardNum; i++){
    int j = int(random(cardNum));
    int k = int(random(cardNum));
    int temp = imageRandom[j]; 
    imageRandom[j] = imageRandom[k]; 
    imageRandom[k] = temp; 
  }  
  
  for(int i=0; i<cardNum; i++){
    imageRandom[i]=i;
  }
  
  // draw cards
  for(int i=0; i<cardNum; i++){
    //image(cardImg[imageRandom[i]], rectX[matrix[i][0]], rectY[matrix[i][1]]);
    image(back[imageRandom[i]], rectX[matrix[i][0]], rectY[matrix[i][1]]);
  }  
  
  ending = loadImage("ending.png");
}

void draw(){
  
  if(mousePressed){
    clickDetect(mouseX, mouseY);
  } 
  
  // check mouse click number
  if(mouseCheck == 1){
    println("CLICK 1");
  }
  if(mouseCheck == 2 ){
    println("CLICK 2");
    // check whether clicked cards are a pair or not 
    checkCorrect(clickImage1, clickImage2);
  }
  
  // Game End
  if(finishCount >= 8){
    imageMode(CENTER);
    image(ending, screenW/2, 520);
  }
}

void checkCorrect(int clickImage1, int clickImage2){
  
  // if clicked cards are the same... 
  if(clickImage1-clickImage2 == 8 || clickImage1-clickImage2 == -8){
    println("CORRECT, SAME");
    noFill(); stroke(255,200,0); strokeWeight(10);
    ellipse(clickImage1X+80, clickImage1Y+120, 100,100);
    ellipse(clickImage2X+80, clickImage2Y+120, 100,100);
    finishCount +=1; 
    mouseCheck = 0;
  }else{
    println("INCORRECT, NOT SAME");
    delay(500);
    image(back[imageRandom[clickImage1]], clickImage1X, clickImage1Y);
    image(back[imageRandom[clickImage2]], clickImage2X, clickImage2Y);
    mouseCheck = 0;
  }
}

// check mouse click number
void mouseReleased(){
  mouseCheck+=1;
}


void clickDetect(float mouseX, float mouseY){
  
  if(mouseCheck < 2){
    
    // if this area is clicked...
    if(mouseX > rectX[0] && mouseX < rectX[1]-margin && mouseY > rectY[0] && mouseY < rectY[1]-margin){
        // show this card image
        image(cardImg[imageRandom[0]], rectX[matrix[0][0]], rectY[matrix[0][1]]);
        // check whether this card is selected as the first or the second
        if(mouseCheck==1){
          clickImage1 = imageRandom[0];
          clickImage1X = rectX[matrix[0][0]]; clickImage1Y = rectY[matrix[0][1]]; 
        }else{
          clickImage2 = imageRandom[0];
          clickImage2X = rectX[matrix[0][0]]; clickImage2Y = rectY[matrix[0][1]];
        }
      }
      if(mouseX > rectX[0] && mouseX < rectX[1]-margin && mouseY > rectY[1] && mouseY < rectY[2]-margin){
        
        image(cardImg[imageRandom[1]], rectX[matrix[0][0]], rectY[matrix[1][1]]);
        if(mouseCheck==1){
          clickImage1 = imageRandom[1]; 
          clickImage1X = rectX[matrix[0][0]]; clickImage1Y = rectY[matrix[1][1]];
        }else{
          clickImage2 = imageRandom[1];
          clickImage2X = rectX[matrix[0][0]]; clickImage2Y = rectY[matrix[1][1]];
        }
      }
      if(mouseX > rectX[0] && mouseX < rectX[1]-margin && mouseY > rectY[2] && mouseY < rectY[3]-margin){
        
        image(cardImg[imageRandom[2]], rectX[matrix[0][0]], rectY[matrix[2][1]]);
        if(mouseCheck==1){
          clickImage1 = imageRandom[2]; 
          clickImage1X = rectX[matrix[0][0]]; clickImage1Y = rectY[matrix[2][1]];
        }else{
          clickImage2 = imageRandom[2];
          clickImage2X = rectX[matrix[0][0]]; clickImage2Y = rectY[matrix[2][1]];
        }
      }
      if(mouseX > rectX[0] && mouseX < rectX[1]-margin && mouseY > rectY[3] && mouseY < rectY[3]+cardH){
        
        image(cardImg[imageRandom[3]], rectX[matrix[0][0]], rectY[matrix[3][1]]);
        if(mouseCheck==1){
          clickImage1 = imageRandom[3]; 
          clickImage1X = rectX[matrix[0][0]]; clickImage1Y = rectY[matrix[3][1]];
        }else{
          clickImage2 = imageRandom[3];
          clickImage2X = rectX[matrix[0][0]]; clickImage2Y = rectY[matrix[3][1]];
        }
      }
      
      
      if(mouseX > rectX[1] && mouseX < rectX[2]-margin && mouseY > rectY[0] && mouseY < rectY[1]-margin){
        
        image(cardImg[imageRandom[4]], rectX[matrix[1][1]], rectY[matrix[0][1]]);
        if(mouseCheck==1){
          clickImage1 = imageRandom[4]; 
          clickImage1X = rectX[matrix[1][1]]; clickImage1Y = rectY[matrix[0][1]];
        }else{
          clickImage2 = imageRandom[4];
          clickImage2X = rectX[matrix[1][1]]; clickImage2Y = rectY[matrix[0][1]];
        }
      }
      if(mouseX > rectX[1] && mouseX < rectX[2]-margin && mouseY > rectY[1] && mouseY < rectY[2]-margin){
        
        image(cardImg[imageRandom[5]], rectX[matrix[1][1]], rectY[matrix[1][1]]);
        if(mouseCheck==1){
          clickImage1 = imageRandom[5]; 
          clickImage1X = rectX[matrix[1][1]]; clickImage1Y = rectY[matrix[1][1]];
        }else{
          clickImage2 = imageRandom[5];
          clickImage2X = rectX[matrix[1][1]]; clickImage2Y = rectY[matrix[1][1]];
        }
      }
      if(mouseX > rectX[1] && mouseX < rectX[2]-margin && mouseY > rectY[2] && mouseY < rectY[3]-margin){
        
        image(cardImg[imageRandom[6]], rectX[matrix[1][1]], rectY[matrix[2][1]]);
        if(mouseCheck==1){
          clickImage1 = imageRandom[6]; 
          clickImage1X = rectX[matrix[1][1]]; clickImage1Y = rectY[matrix[2][1]];
        }else{
          clickImage2 = imageRandom[6];
          clickImage2X = rectX[matrix[1][1]]; clickImage2Y = rectY[matrix[2][1]];
        }
      }
      if(mouseX > rectX[1] && mouseX < rectX[2]-margin && mouseY > rectY[3] && mouseY < rectY[3]+cardH){
        
        image(cardImg[imageRandom[7]], rectX[matrix[1][1]], rectY[matrix[3][1]]);
        if(mouseCheck==1){
          clickImage1 = imageRandom[7]; 
          clickImage1X = rectX[matrix[1][1]]; clickImage1Y = rectY[matrix[3][1]];
        }else{
          clickImage2 = imageRandom[7];
          clickImage2X = rectX[matrix[1][1]]; clickImage2Y = rectY[matrix[3][1]];
        }
      }
      
      if(mouseX > rectX[2] && mouseX < rectX[3]-margin && mouseY > rectY[0] && mouseY < rectY[1]-margin){
        
        image(cardImg[imageRandom[8]], rectX[matrix[2][1]], rectY[matrix[0][1]]);
        if(mouseCheck==1){
          clickImage1 = imageRandom[8]; 
          clickImage1X = rectX[matrix[2][1]]; clickImage1Y = rectY[matrix[0][1]];
        }else{
          clickImage2 = imageRandom[8];
          clickImage2X = rectX[matrix[2][1]]; clickImage2Y = rectY[matrix[0][1]];
        }
      }
      if(mouseX > rectX[2] && mouseX < rectX[3]-margin && mouseY > rectY[1] && mouseY < rectY[2]-margin){
        
        image(cardImg[imageRandom[9]], rectX[matrix[2][1]], rectY[matrix[1][1]]);
        if(mouseCheck==1){
          clickImage1 = imageRandom[9]; 
          clickImage1X = rectX[matrix[2][1]]; clickImage1Y = rectY[matrix[1][1]];
        }else{
          clickImage2 = imageRandom[9];
          clickImage2X = rectX[matrix[2][1]]; clickImage2Y = rectY[matrix[1][1]];
        }
      }
      if(mouseX > rectX[2] && mouseX < rectX[3]-margin && mouseY > rectY[2] && mouseY < rectY[3]-margin){
        
        image(cardImg[imageRandom[10]], rectX[matrix[2][1]], rectY[matrix[2][1]]);
        if(mouseCheck==1){
          clickImage1 = imageRandom[10]; 
          clickImage1X = rectX[matrix[2][1]]; clickImage1Y = rectY[matrix[2][1]];
        }else{
          clickImage2 = imageRandom[10];
          clickImage2X = rectX[matrix[2][1]]; clickImage2Y = rectY[matrix[2][1]];
        }
      }
      if(mouseX > rectX[2] && mouseX < rectX[3]-margin && mouseY > rectY[3] && mouseY < rectY[3]+cardH){
        
        image(cardImg[imageRandom[11]], rectX[matrix[2][1]], rectY[matrix[3][1]]);
        if(mouseCheck==1){
          clickImage1 = imageRandom[11]; 
          clickImage1X = rectX[matrix[2][1]]; clickImage1Y = rectY[matrix[3][1]];
        }else{
          clickImage2 = imageRandom[11];
          clickImage2X = rectX[matrix[2][1]]; clickImage2Y = rectY[matrix[3][1]];
        }
      }
      
      if(mouseX > rectX[3] && mouseX < rectX[3]+cardW && mouseY > rectY[0] && mouseY < rectY[1]-margin){
        
        image(cardImg[imageRandom[12]], rectX[matrix[3][1]], rectY[matrix[0][1]]);
        if(mouseCheck==1){
          clickImage1 = imageRandom[12]; 
          clickImage1X = rectX[matrix[3][1]]; clickImage1Y = rectY[matrix[0][1]];
        }else{
          clickImage2 = imageRandom[12];
          clickImage2X = rectX[matrix[3][1]]; clickImage2Y = rectY[matrix[0][1]];
        }
      }
      if(mouseX > rectX[3] && mouseX < rectX[3]+cardW && mouseY > rectY[1] && mouseY < rectY[2]-margin){
        
        image(cardImg[imageRandom[13]], rectX[matrix[3][1]], rectY[matrix[1][1]]);
        if(mouseCheck==1){
          clickImage1 = imageRandom[13];
          clickImage1X = rectX[matrix[3][1]]; clickImage1Y = rectY[matrix[1][1]];
        }else{
          clickImage2 = imageRandom[13];
          clickImage2X = rectX[matrix[3][1]]; clickImage2Y = rectY[matrix[1][1]];
        }
      }
      if(mouseX > rectX[3] && mouseX < rectX[3]+cardW && mouseY > rectY[2] && mouseY < rectY[3]-margin){
        
        image(cardImg[imageRandom[14]], rectX[matrix[3][1]], rectY[matrix[2][1]]);
        if(mouseCheck==1){
          clickImage1 = imageRandom[14]; 
          clickImage1X = rectX[matrix[3][1]]; clickImage1Y = rectY[matrix[2][1]];
        }else{
          clickImage2 = imageRandom[14];
          clickImage2X = rectX[matrix[3][1]]; clickImage2Y = rectY[matrix[2][1]];
        }
      }
      if(mouseX > rectX[3] && mouseX < rectX[3]+cardW && mouseY > rectY[3] && mouseY < rectY[3]+cardH){
        
        image(cardImg[imageRandom[15]], rectX[matrix[3][1]], rectY[matrix[3][1]]);
        if(mouseCheck==1){
          clickImage1 = imageRandom[15]; 
          clickImage1X = rectX[matrix[3][1]]; clickImage1Y = rectY[matrix[3][1]];
        }else{
          clickImage2 = imageRandom[15];
          clickImage2X = rectX[matrix[3][1]]; clickImage2Y = rectY[matrix[3][1]];
        }
      }
    }
}

hidden content

A beer can Vjing

can vjing_1can vjing_3can vjing_2

Arduino, Processing, LED x 1, Potentiometer x 2, Webcam / Song : Color of autumn (Nujabes)

The beer can  Vjing

A RGB led and silver paper are set in an empty beer can. The color of light and movement of a motor are controlled by potentiometers, and the inside of the can is showed on the screen in real time by a webcam. It’s basically visualization using light and its reflection as a source. I was curious of unexpected effects when magnifying changes that are happening in a small and invisible space.