Kimberlyn Cho and Sarah Kang – Final Project

finalproj

/*Kimberlyn Cho
ycho2@andrew.cmu.edu
Sarah Kang
sarahk1@andrew.cmu.edu
Section C
Final Project
*/

/*INSTRUCTIONS:
(SARAH KANG) OPENING PAGE

(KIMBERLYN CHO) SCENE 1: 
    -use MOUSE to choose ingredient and click in bowl to place ingredient
    -press ENTER to mix ingredients
    -use MOUSE to add salt and pepper as desired and ENTER to mix again
(KIMBERLYN CHO) SCENE 2:
    -use LEFT and RIGHT arrow keys to move frying pan
    -dumpling is fully fried once "FINISH" button pops up
(SARAH KANG) SCENE 3: 
    -use DOWN arrow key to plate/start
    -use keys 'y, u, m' to finish and eat
*/


//KIMBERLYN CHO GLOBAL VARIABLES\\
//ingredient image links
var ingredients = [
    "https://i.imgur.com/kbiRJNO.png?3",
    "https://i.imgur.com/BqKFhGa.png?3",
    "https://i.imgur.com/X37RSp0.png?2",
    "https://i.imgur.com/1hN8NJV.png?5",
    "https://i.imgur.com/zlwmpov.png?3"];
//current ingredient selection
var currIngredient;
//content of bowl
var texts = [];
//shifting frying pan positions
var xpos = 200;
var ypos = 150;
//dumpling location on frying pan
var dxpos = 200;
//measure frying time (number of frying pan shifts)
var frytime = 1;
//toggle to control when scene3 is drawn
var updatedraw = true;
//toggles to control scenes
var toggle = true;
var toggle2 = true;
//drag effect of dumpling on frying pan
var shift = false;
var startTime = -1000;
var startXPos;
var transitionLength = 1.0;
var direction = 200;

function preload() {
    //KIMBERLYN CHO IMAGES
    //loading images into variables
    mushroom = loadImage(ingredients[0]);
    greenonion = loadImage(ingredients[1]);
    steak = loadImage(ingredients[2]);
    salt = loadImage(ingredients[3]);
    pepper = loadImage(ingredients[4]);

    //SARAH KANG IMAGES
    var plate = "https://i.imgur.com/kvmDFlr.jpg";
    var chopsticks = "https://i.imgur.com/cWrGYFq.jpg";
    var dinnertime = "https://i.imgur.com/QCuDyQk.jpg";
    var dumps = "https://i.imgur.com/wIrlEFb.jpg";
    var hand1 = "https://i.imgur.com/MmOZHtp.jpg"
    var hand2 = "https://i.imgur.com/FBDI4yN.jpg"
    var hand3 = "https://i.imgur.com/bYtuDzt.jpg"
    var kid = "https://i.imgur.com/BiavReL.jpg"
    var finaldump = "https://i.imgur.com/0ZQYp9Y.jpg"
        Img = loadImage(plate);
        Img2 = loadImage(chopsticks);
        Img3 = loadImage(dinnertime);
        Img4 = loadImage(dumps);
        Img5 = loadImage(hand1);
        Img6 = loadImage(hand2);
        Img7 = loadImage(hand3);
        Img8 = loadImage(kid);
        Img9 = loadImage(finaldump);
}

function setup() {
    createCanvas(400, 300);
    background(0);
    scene0setup();
}

function draw() {
    scene1();
    //scene3
    if (updatedraw == false) {
        background(0);
        scene2();
        toggle2 == false;
    };
}

//START PAGE (SARAH KANG)
function scene0setup() {
    //plate
    image(Img, 0, 50);
    //title
    textSize(60);
    textFont('Arial');
    textAlign(CENTER);
    stroke(255);
    strokeWeight(3);
    fill(0);
    text("\"DUMPLING\"", 200, 150);
    //chopsticks
    image(Img2, 200, 0);
    //start button
    noFill();
    rect(320, 260, 60, 24);
    textSize(10);
    strokeWeight(0.4);
    text("START", 350, 276);
}

//SCENE 1: ADDING AND MIXING FILLING (KIMBERLYN CHO)

//SCENE 1 BACKGROUND
function scene1setup() {
    //bowl
    background(0);
    noStroke();
    fill(240);
    ellipse(width / 2, height / 2, 200);
    fill(255);
    ellipse(width / 2, height / 2, 100);
    stroke(0);
    noFill();
    ellipse(width / 2, height / 2, 180);
    stroke(255);
    //next button
    rect(320, 260, 60, 24);
    textSize(10);
    strokeWeight(0.4);
    textAlign(CENTER);
    text("NEXT", 350, 276);
    //ingredient selection
    image(mushroom, 10, 10);
    image(greenonion, 10, 60);
    image(steak, 12, 130);
    image(salt, 340, 20);
    image(pepper, 337, 90);

    fill(255);
    textAlign(LEFT);
    textSize(10);
    text("1. click ingredient of choice, then place it in bowl with another click", 20, 280);
    text("2. to mix, press the ENTER key", 20, 290);
}   

//SCENE 1 INTERACTION
function scene1() {
    //updating ingredient selection based on where user clicks
    if (mouseIsPressed) {
        fill(0);
        if (mouseX > 10 & mouseX < 60 &&
            mouseY > 15 && mouseY < 55) {
            currIngredient = "\"mushroom\""
        };
        if (mouseX > 10 & mouseX < 60 &&
            mouseY > 65 && mouseY < 120) {
            currIngredient = "\"green onion\""
        };
        if (mouseX > 10 & mouseX < 60 &&
            mouseY > 130 && mouseY < 160) {
            currIngredient = "\"beef\""        
        };
        if (mouseX > 340 & mouseX < 370 &&
            mouseY > 20 && mouseY < 70) {
            currIngredient = "\"salt\""
        };
        if (mouseX > 340 & mouseX < 360 &&
            mouseY > 95 && mouseY < 140) {
            currIngredient = "\"pepper\""
        };
    };
}
//*see mousepressed fuction for code that updates and draws content of bowl
//*see keypressed function for code that mixes content of bowl

//SCENE 2: FRYING DUMPLING

//SCENE 2 BACKGROUND
function scene2() {
    //frying pan
    noStroke();
    fill(240);
    ellipse(xpos, ypos, 200);
    rectMode(CENTER);
    rect(xpos, 250, 25, 100);
    fill(255);
    ellipse(xpos, ypos, 150);
    fill(0);
    text("\"DUMPLING\"", dxpos, ypos);
    fill(255);
    textAlign(LEFT);
    textSize(12);
    text("press left and right arrow keys to fry until ready to plate!", 20, 20);

    //indication of when dumpling is done frying
    if  (frytime > 5) {
        stroke(255);
        noFill();
        strokeWeight(1);
        rectMode(CORNER);
        rect(320, 260, 60, 24);
        textSize(10);
        strokeWeight(0.4);
        textAlign(CENTER);
        text("PLATE", 350, 276);
        noLoop();
    } else {
        stroke(255);
        noFill();
        strokeWeight(1);
        rectMode(CORNER);
        rect(320, 260, 60, 24);
        textSize(10);
        strokeWeight(0.4);
        textAlign(CENTER);
        text("NEXT", 350, 276);
    };
    //updating position of dumpling on frying pan with a drag effect
    if (shift & startTime > 0) {
        var currentTime = millis()/1000 - startTime;
        var slide = map(currentTime, 0, transitionLength, 0, 1);
        dxpos = lerp(dxpos, direction, slide);
        if (currentTime > transitionLength) {
            shift = false;
        };
    };
}

//SCENE 2 INTERACTION
//**see keypressed function for code that shifts frying pan

function scene3setup() {
    background(0);
    //plate with silverware
    image(Img3, 0, 10);
    //instruction
    fill(255);
    textAlign(LEFT);
    textSize(12);
    text("press down arrow to plate, then type the letter that pops up", 15, 285);
}

function mousePressed() {
//INTERACTION PART OF SCENE 1 CONT.
    //constraining ingredients to bowl
    if (mouseX > 150 & mouseX < 250 &&
        mouseY > 100 && mouseY < 200) {
        //updating array to store content of bowl even if ingredients are added after mix
        texts.push(currIngredient);
        //adding selected ingredient into bowl
        text(currIngredient, mouseX, mouseY);
    };

//SCENE TRANSITIONS
    //start to scene 1
    if ((mouseX > 320 & mouseX < 380 && mouseY > 260 && mouseY < 280) && (toggle == true)) {
        scene1setup();
    };
    //scene 1 to scene 2
    if ((mouseX > 320 & mouseX < 380 && mouseY > 260 && mouseY < 280) && (toggle == false)) {
        updatedraw = false;
    };

    //scene 2 to scene 3
    if ((mouseX > 320 & mouseX < 380 && mouseY > 260 && mouseY < 280) && (frytime > 5)) {
        updatedraw = true;
        scene3setup()
    };

}

function keyPressed() {
//INTERACTION PART OF SCENE 1 CONT.
    //mixing content of bowl
    if (keyCode === ENTER) {
        //clearing bowl
        scene1setup();
        //redrawing contents of bowl with randomization to mimic mixing
        for (var i = 0; i < texts.length; i++) {
            fill(0);
            text(texts[i], floor(random(150, 250)), floor(random(100, 200)));
        };
        toggle = false;
    };

//INTERACTION PART OF SCENE 2
    //shifting pan and dumpling position
    if (keyCode == LEFT_ARROW) {
        //updating frying pan location
        xpos = 150;
        //initiating drag effect on dumpling
        shift = true;
        direction = 150;
        startTime = millis()/1000;
        startXPos = xpos;
        frytime +=1;
        toggle2 = false;
    };
    if (keyCode == RIGHT_ARROW) {
        //updating frying pan location
        xpos = 250;
        //initiating drag effect on dumpling
        direction = 250;
        shift = true;
        startTime = millis()/1000;
        startXPos = xpos;
    };

//INTERACTION PART OF SCENE 3
    //keypress to start
    if (keyCode == DOWN_ARROW) {
            image(Img4, 145, 115); //dumpling
            stroke(255);
            textSize(20);
            text("\"Y\"", 300, 40);
    }
    //sequence of typing
    if (keyCode == 'y') {
    }
    if (keyCode == 'u') {
    }
    if (keyCode == 'm') {        
    }
}
function keyTyped() {
    if (key === 'y') {
        stroke(255);
        textSize(20);
        text("\"U\"", 300, 250);
    }
    if (key === 'u') {
        stroke(255);
        textSize(20);
        text("\"M\"", 75, 250);
    }    
    if (key === 'm') {
        //kid thumbs up
        image(Img8, 10, 10);
        //plate of dumplings
        image(Img9, 125, 100);
        noStroke();
        fill(0);
        rect(0, 270, 400, 30);
        fill(255, 194, 194);
        textAlign(CENTER);
        textSize(20);
        text("time to eat!", 200, 285);
    }  
}

For our final project, we were inspired by the classic Nintendo game, Cooking Mama and wanted to recreate an unconventional, more conceptual version of the cooking experience. We were also inspired by the abstract approach in representing visuals often seen in high fashion, such as Off-White; the dumpling being cooked is represented by the literal word “dumpling”. We struggled a lot with putting our scenes together and working out the transitions, but after some compromise and editing, we were able to put together a fun game.

Sarah Kang – Looking Outwards -12

a visual from Nour, Terrifying Jellyfish’ most well-known game

Nour is an interactive visual game focused on playing with food and its aesthetics. Controls can range from keyboard to external plug-in controllers that send note signals. Nour was created by TJ Hughes, a video game designer and digital artist, and also founder of Terrifying Jellyfish, an independent game company that focuses on releasing content with “color, playfulness, and aesthetics”.

Cooking Mama, the famous Nintendo DS game first released in 2006.

The second project is the famous Nintendo DS game, Cooking Mama, which is a food cooking simulation game that takes the player through the various steps of cooking a recipe. Cooking Mama was developed by Cooking Mama Limited, formerly Office Create, a game developing company.

the player engages directly with the cooking process offered by the simulation.

Cooking Mama was a childhood favorite game for me; something about being able to cook all these recipes on a touch screen was so satisfying and addicting. The differences between Cooking Mama and Nour lies in the aesthetics focus of the games; while Cooking Mama is more focused on actually simulating the cooking process, Nour has no goals or objectives in the game. Nour is an experimental food art game that focuses on the visuals and unconventional ways of playing with food.

Our goal for our final project is to take inspiration from both these projects to create a visually appealing, interactive cooking experience.

Sarah Kang – Project Proposal

For this final project, I will be collaborating with Kimberlyn Cho to create an interactive dumpling making game. We were inspired by the game, cooking mama, and wanted to recreate something similar in the form of an interactive storyboard going through the steps of making dumplings. So far, we have tentatively six boards planned out with interactive actions involving keys, mouse press and mouse drag and some ideas for how we’d want to illustrate the scenes, either with imported images or some coded graphics. We also plan to add more interaction through speed, drag, and meter gauges to engage the user and make a fun experience.

Sarah Kang-Looking Outwards-11

Liminoid Garden, by Filipa Valente and Heidi Duckler Dance Theatre, 2014

Filipa Valente is both a practicing architect and experiential designer with experience in major firms and studios. After completing her architectural studies at the Bartlett School of Architecture in London, she went on to obtain her Masters in Media Art and Architecture at SciArc in Los Angeles.

Valente’s project “Liminoid Garden”, in collaboration with the Heidi Duckler Dance Theatre, was an interactive machine assemblage between the city, its users, and the environment. I was particularly drawn to this project because of how the installation was able to respond to real-time environmental data from the city, engaging the audience by promoting awareness. Another cool factor is the interaction between the dancers and the installation and the resulting data visualizations.

Liminoid Garden* @ SKYLINE 2014 Festival DTLA from Filipa Valente on Vimeo.

Sarah Kang-Project 11 – Landscape

landscape

//sarah kang
//section c
//sarahk1@andrew.cmu.edu
//project-11-landscape

var m1Speed = .001
var m1Detail = .005
var m2Speed = .002
var m2Detail = .01
var m3Detail = .005

var firework = [];
var firework2 = [];

function setup() {
  createCanvas(480, 480);
    //initial set of pink fireworks
    for (i = 0; i < 12; i++) {
        var fireworkX = random(width);
        var fireworkY = random(0, 240);
        firework[i] = makeFirework(fireworkX, fireworkY);
    }

        //initial set of orange fireworks
    for (i = 0; i < 8; i++) {
        var firework2X = random(width);
        var firework2Y = random(0, 240);
        firework2[i] = makeFirework2(firework2X, firework2Y);
    }

    frameRate(20);
}


function draw() {
 background(0);

 fireworks();
 fireworks2();

 m1();
 m2();

 noStroke();
 fill(94, 94, 115);
 rect(0, 400, 480, 80);

 m3();

}

function m1() {
  //back mountain range 
  stroke(20, 21, 54);
  beginShape();
  for(var x = 0; x < width; x++) {
    var t = (x * m1Detail) + (millis() * m1Speed);
    var y = map(noise(t), 0, 1, 200, 340);
    line(x, y, x, 400);
  }
  endShape();
}

function m2() {
  //front mountain range
  stroke(28, 29, 82);
  beginShape();
  for(var x = 0; x < width; x++) {
    var t = (x * m2Detail) + (millis() * m2Speed);
    var y = map(noise(t), 0, 1, 240, 380);
    line(x, y, x, 400);
  }
  endShape();
}

function m3() {
  //mountain range shadow
  stroke(34, 34, 43);
  beginShape();
  for(var x = 0; x < width; x++) {
    var t = (x * m3Detail) + (millis() * m2Speed);
    var y = map(noise(t), 0, 1, 400, 480);
    line(x, y, x, 400);
  }
  endShape();
}

function drawFirework() {
    noStroke();
    fill(255, 230, 238);
    push();
    translate(this.x2, this.y2);

    for (let i = 0; i < 12; i ++) {
    ellipse(0, 20, 3, 25);
    rotate(PI / 5);
    }

    pop();
}

function makeFirework(xlocation, ylocation) {
  var makeFire = {x2: xlocation, 
                y2: ylocation, 
                fireworkX: random(0, width), 
                fireworkY: random(0, 240),
                speed: -2.0,
                move: moveFirework,
                draw: drawFirework}
  return makeFire;
}

function moveFirework() {
    this.x2 += this.speed;
    if (this.x2 <= -20) {
        this.x2 += 500;
    }
}

function fireworks() {
    //pink fireworks
    for(i = 0; i < firework.length; i++) {
        firework[i].move();
        firework[i].draw();
    }
}

function drawFirework2() {
    noStroke();
    fill(255, 176, 97);
    push();
    translate(this.x2, this.y2);

    for (let i = 0; i < 12; i ++) {
    ellipse(0, 30, 3, 40);
    rotate(PI / 5);
    }

    pop();
}

function makeFirework2(xlocation, ylocation) {
    var makeFire2 = {x2: xlocation, 
                y2: ylocation, 
                firework2X: random(0, width), 
                firework2Y: random(0, 240),
                speed: -2.0, 
                move: moveFirework2,
                draw: drawFirework2}
    return makeFire2;
}

function moveFirework2() {
    this.x2 += this.speed;
    if (this.x2 <= -20) {
        this.x2 += 500;
    }
}

function fireworks2() {
    //orange fireworks
    for(i = 0; i < firework2.length; i++) {
        firework2[i].move();
        firework2[i].draw();
    }
}

For this project, I wanted to make a nighttime landscape and incorporate a colorful fireworks show.

Sarah Kang – Looking Outwards – 10

A new algorithm produces the “portamento” effect, from news.mit.edu

Trevor Henderson is an MIT student in computer science who has invented a new algorithm that produces a “portamento” effect – the effect of gliding a note at one pitch into a note of a lower or higher pitch – between any two audio clips. His new algorithm is based on a geometry-based framework that facilitates the most productive paths to move data points between more than one origin and destination configurations. Henderson applies this optimal transport to interpolating audio signals, which blends the signals or sounds into each other.

This project really intrigued me because I had never really focused on the transformations of sounds and it was amazing how the two different sound categories morphed into each other. I feel like this would open up a lot of opportunities for computational music in the future.

Sarah Kang – Project 10 – sonic sketch

sonic

//sarah kang
//section c
//sarahk1@andrew.cmu.edu
//project-10-sonic-sketch

function preload() {

    mySnd1 = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/drum.wav")
    mySnd1.setVolume(0.5);
    mySnd2 = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/sweep.wav")
    mySnd2.setVolume(0.5);
    mySnd3 = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/sound1.wav")
    mySnd3.setVolume(0.5);
    mySnd4 = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/sound2.wav")
    mySnd4.setVolume(0.5);
    mySnd5 = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/sound3.wav")
    mySnd5.setVolume(1);
    mySnd6 = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/sound4.wav")
    mySnd6.setVolume(0.5);
    mySnd7 = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/sound5.wav")
    mySnd7.setVolume(0.5);
    mySnd8 = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/sound6.wav")
    mySnd8.setVolume(0.5);
    mySnd9 = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/sound7.wav")
    mySnd9.setVolume(0.5);
}


function setup() {
    createCanvas(400, 400);

    useSound();
}


function soundSetup() { // setup for audio generation
}


function draw() {
    background(200, 220, 250);

    //white square rims
    for (var y = 10; y < height + 20; y += 130) {
        for (var x = 10; x < width + 20; x += 130) {
            fill(255);
            noStroke();
            rect(x, y, 120, 120);
        }
    }

    fill(255, 237, 219);
    rect(20, 20, 100, 100); //top left square

    fill(255, 251, 181);
    rect(150, 20, 100, 100); //top middle square

    fill(213, 238, 242);
    rect(280, 20, 100, 100); //top right square

    fill(230, 252, 241);
    rect(20, 150, 100, 100); //middle left square

    fill(243, 230, 252);
    rect(150, 150, 100, 100); //center square

    fill(252, 230, 234);
    rect(280, 150, 100, 100); //middle right square

    fill(232, 237, 255);
    rect(20, 280, 100, 100); //bottom left square

    fill(222, 248, 252);
    rect(150, 280, 100, 100); //bottom middle square

    fill(241, 252, 230);
    rect(280, 280, 100, 100); //bottom right square
}

function mousePressed() {

    if(mouseX > 20 & mouseX < 120 && mouseY > 20 && mouseY < 120){
       mySnd1.play(); //top left square sound
   }
    if(mouseX > 150 & mouseX < 250 && mouseY > 20 && mouseY < 120){
       mySnd2.play(); //top middle square sound
   }
    if(mouseX > 280 & mouseX < 380 && mouseY > 20 && mouseY < 120){
       mySnd3.play(); //top right square sound
   }
    if(mouseX > 20 & mouseX < 120 && mouseY > 150 && mouseY < 250){
       mySnd4.play(); //middle left square sound
   }
    if(mouseX > 150 & mouseX < 250 && mouseY > 150 && mouseY < 250){
       mySnd5.play(); //center square sound
   }
    if(mouseX > 280 & mouseX < 380 && mouseY > 150 && mouseY < 250){
       mySnd6.play(); //middle right square sound
   }
    if(mouseX > 20 & mouseX < 120 && mouseY > 280 && mouseY < 380){
       mySnd7.play(); //bottom left square sound
   }
    if(mouseX > 150 & mouseX < 250 && mouseY > 280 && mouseY < 380){
       mySnd8.play(); //bottom middle square sound
   }
    if(mouseX > 280 & mouseX < 380 && mouseY > 280 && mouseY < 380){
       mySnd9.play(); //bottom left square sound
   }
}

I was inspired by the launchpad that Beca uses in the movie Pitch Perfect and wanted to use this format to experiment with the combination of different sounds.

Sarah Kang-Project-09-Computational Portrait

portrait

//sarah kang
//section c
//sarahk1@andrew.cmu.edu
//project-09-computational-portraits

var underlyingImage;

function preload() {
    var myImg = "https://i.imgur.com/kLHusSC.jpg";
    currImage = loadImage(myImg);
}

function setup() {
    createCanvas(244, 480);
    background(0);
    currImage.loadPixels();
    frameRate(100);
}

function draw() {
    var px = random(width);
    var py = random(height);
    var imgW = random(2, 20);
    var imgH = random(2, 20);
    var txtsize = random(1, 10);

    var ix = constrain(floor(px), 0, width-1);
    var iy = constrain(floor(py), 0, height-1);
    var theColorAtLocationXY = currImage.get(ix, iy);

    noStroke();
    fill(theColorAtLocationXY);
    ellipse(px, py, imgW, imgH);

    fill(theColorAtLocationXY);
    textSize(txtsize);
    textFont('Arial');
    text("chicken parm", mouseX, mouseY);

    /*var theColorAtTheMouse = currImage.get(mouseX, mouseY);
    stroke(theColorAtTheMouse);
    line(pmouseX, pmouseY, mouseX, mouseY);*/
}

This was the most recent portrait picture I had on my phone, from when I visited my best friend from home last weekend. I thought the random ellipses made nice compositions and texture with the color areas and palettes in this picture. “chicken parm” is also what we had for breakfast in this picture.

After a few minutes
my best friendd

Sarah Kang-Looking Outwards-09

Baby Groot, Guardians of the Galaxy Vol. 2, Framestore, 2017

For this week’s post, I found Youie Cho’s looking outwards post in week 5 to be particularly interesting because it had Baby Groot, my favorite Guardians of the Galaxy character. The artwork in focus is the computer graphics work of Framestore, a collective of film, advertising, and content artists. Like Youie, I’m also inspired and impressed by the attention to detail and careful development in putting Baby Groot’s animated character into the context of the movie, down to the details of its walking patterns and speed. I especially love how Framestore extensively researched the characteristics of babies and children when imagining Baby Groot’s character. Being aware of the these “behind-the-scenes” processes in Baby Groot’s character development enables viewers to make a more humanistic connection to the character in the movie and makes Baby Groot even more lovable.

Youie Cho’s original Looking Outwards Post

Sarah Kang- Looking Outwards-08

Darius Kazemi is a computer programmer and artist specializing in “weird internet art”. After graduating from Worcester Polytechnic Institute, he was temporarily a video game designer before co-founding a technology collective called Feel Train with Courtney Stanton. In this collective, Kazemi collaborates with other artists to create programmatic bots, such as the “StayWokeBot” and a twitter bot project called “Relive 44” which started reposting every tweet that former President Barack Obama has posted on the platform, in May of 2017.

In his festival lecture, Darius refers to his most known project, which is his Amazon shopper bot. Every month, he gives his bot a $50 amazon gift card and waits for his random packages to arrive at his doorstep. His program uses customized API values with the collaboration of Amazon and the US Postal Shipping system to create a personal shopper that buys him random books and CD’s. Essentially, his program has an output in the form of his random monthly packages. He goes on to explain how he explores the parameters of his API guidelines using Google StreetView and the resulting images.

What I admire about Darius Kazemi’s work is that he explores rudimentary and everyday elements that go unnoticed, and turns it into an opportunity for a new perspective or interest. His Amazon shopper bot would provide the opportunity to the receiver to read or listen to something they never even knew existed or something they would never purchase themselves.

Eyeo 2014 – Darius Kazemi from Eyeo Festival on Vimeo.