Urban Lights Contacts is an interactive installation the senses varying degrees of electrostatic contact according to how close people’s bodies are. The only way to activate this work is to make multiple people contact each other’s skin. For example, a person put his or her hands onto the interactive shiny sphere, but him or her alone won’t create any sound. He or she must make another come and touch his or her hand to make the installation activate. This installation encourages people to touch and come close together to create a new sound at the moment. The sensory of the work is tactile, creates light, and also emits sound. It encourages interactive stagings of the public’s bodies, which basically makes the people turn into a “human instrument.” I am admired by this installation because it brings together the public for a unique art and technology experience. Also, I find it interesting that this work creates unpredictable relationships between the public who interacts with the installation.
Category: SectionD
Stefanie Suk – Project 10 – Sonic Sketch
//Stefanie Suk
//15-104 D
//ssuk@andrew.cmu.edu
//Project-10-Sonic Sketch
var buttonA;
var buttonB;
var buttonC;
var buttonD;
function preload() {
buttonA = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/snaredrum-1.wav");
buttonA.setVolume(1);
buttonB = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/drumstick-1.wav");
buttonB.setVolume(1);
buttonC = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/hitdrum.wav");
buttonC.setVolume(1);
buttonD = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/lowdrum.wav");
buttonD.setVolume(1); //loading sound
}
function setup() {
createCanvas (600, 600);
useSound();
}
function draw() {
background(232, 192, 244);
noStroke();
fill(90);
rect(85, 115, 400, 400);
fill("black");
rect(100, 100, 400, 400); //base of the beat maker
fill(100);
circle (158, 150, 50, 50);
fill(100);
circle (248, 150, 50, 50);
fill(100);
circle (338, 150, 50, 50);
fill(100);
circle (428, 150, 50, 50); //upper circular button of beat maker
fill("white");
rect(120, 200, 80, 80);
fill("yellow");
rect(120, 290, 80, 80);
fill("yellow");
rect(120, 380, 80, 80);
fill("red");
rect(210, 200, 80, 80);
fill("white");
rect(210, 290, 80, 80);
fill("white");
rect(210, 380, 80, 80);
fill("blue");
rect(300, 200, 80, 80);
fill("blue");
rect(300, 290, 80, 80);
fill("blue");
rect(300, 380, 80, 80);
fill(33, 232, 6);
rect(390, 200, 80, 80);
fill(33, 232, 6);
rect(390, 290, 80, 80);
fill("white");
rect(390, 380, 80, 80); //square buttons of the beat maker
}
function mousePressed(){
if(mouseX < 250 & mouseY < 250){
buttonA.play();
}
if(mouseX < 250 & mouseY > 250){
buttonC.play();
}
if(mouseX > 250 & mouseY < 250){
buttonB.play();
}
if(mouseX > 250 & mouseY > 250){
buttonD.play(); //creating sound when click on button
}
}
I wanted to create a beat making machine because I enjoy listening to music with interesting beat. I made the beat making machine create drum sounds when clicked.
Mari Kubota- Project 11- Landscape
/* Mari Kubota
49-104 Section 1
mkubota@andrew.cmu.edu
Project 11
*/
var lamps = [];
var stars = [];
var buildings = [];
function setup() {
createCanvas(480, 280);
// create an initial collection of objects
for (var i = 0; i < 10; i++){
var rx = random(width);
lamps[i] = makeLamp(rx);
stars[i] = makeStar(rx);
buildings[i] = makeBuilding(rx);
}
frameRate(10);
}
function draw() {
//creates gradient sky
c1 = color(0, 28, 84);
c2 = color(222, 241, 255);
setGradient(c1, c2);
//creates roads
noStroke();
fill(100);
rect(0, height*.75, width, height/4);
fill(200);
stroke(50);
rect(0,height*.9, width, height/9);
//calls functions with objects
updateAndDisplayStars();
removeStarsThatHaveSlippedOutOfView();
addNewStarsWithSomeRandomProbability();
updateAndDisplayBuildings();
removeBuildingsThatHaveSlippedOutOfView();
addNewBuildingsWithSomeRandomProbability();
updateAndDisplayLamps();
removeLampsThatHaveSlippedOutOfView();
addNewLampsWithSomeRandomProbability();
}
function updateAndDisplayLamps(){
// Update the building's positions, and display them.
for (var i = 0; i < lamps.length; i++){
lamps[i].move();
lamps[i].display();
}
}
function updateAndDisplayStars(){
// Update the building's positions, and display them.
for (var i = 0; i < stars.length; i++){
stars[i].move();
stars[i].display();
}
}
function updateAndDisplayBuildings(){
// Update the building's positions, and display them.
for (var i = 0; i < buildings.length; i++){
buildings[i].move();
buildings[i].display();
}
}
//////////////////////////////////////////////////////
function removeLampsThatHaveSlippedOutOfView(){
// takes away lamps once they leave the frame
var lampsToKeep = [];
for (var i = 0; i < lamps.length; i++){
if (lamps[i].x + lamps[i].breadth > 0) {
lampsToKeep.push(lamps[i]);
}
}
lamps = lampsToKeep; // remember the surviving buildings
}
////////////////////////////////////////////////////////
function removeStarsThatHaveSlippedOutOfView(){
//removes stars from array stars and puts them in new array
//once they've moved off the edge of frame
var starsToKeep = [];
for (var i = 0; i < stars.length; i++){
if (stars[i].x + stars[i].breadth > 0) {
starsToKeep.push(stars[i]);
}
}
stars = starsToKeep; // remember the surviving stars
}
function removeBuildingsThatHaveSlippedOutOfView(){
var buildingsToKeep = [];
for (var i = 0; i < buildings.length; i++){
if (buildings[i].x + buildings[i].breadth > 0) {
buildingsToKeep.push(buildings[i]);
}
}
buildings = buildingsToKeep; // remember the surviving buildings
}
////////////////////////////////////////////////////////////////////////
function addNewLampsWithSomeRandomProbability() {
// With a very tiny probability, add a new building to the end.
var newLampLikelihood = 0.03;
if (random(0,1) < newLampLikelihood) {
lamps.push(makeLamp(width));
}
}
function addNewStarsWithSomeRandomProbability() {
// With a very tiny probability, add a new building to the end.
var newStarLikelihood = 0.02;
if (random(0,1) < newStarLikelihood) {
stars.push(makeStar(width));
}
}
function addNewBuildingsWithSomeRandomProbability() {
// With a very tiny probability, add a new building to the end.
var newBuildingLikelihood = 0.007;
if (random(0,1) < newBuildingLikelihood) {
buildings.push(makeBuilding(width));
}
}
///////////////////////////////////////////////////////////////////////////
// method to update position of building every frame
function lampMove() {
this.x += this.speed;
}
function starMove() {
this.x += this.speed;
}
function buildingMove() {
this.x += this.speed;
}
//////////////////////////////////////////////////////////////////////////////
// draws lamps
function lampDisplay() {
fill(255,255,0,45);
noStroke();
ellipse(this.x, height -25 - this.h,this.r,this.r); //halo of light from lamp
fill(102,166,218);
rect(this.x-1.5, height - 25-this.h, this.breadth, this.h); //lamp post
fill(255);
ellipse(this.x, height -25 - this.h, this.r2, this.r2); //lightbulb
stroke(255);
strokeWeight(0.5);
noFill();
quad(this.x - 1.5, height - 20 - this.h,
this.x - 5, height - 35 - this.h,
this.x + 5, height - 35 - this.h,
this.x + this.breadth - 1.5, height - 20 - this.h); //draws the lamp box
}
function starDisplay(){
//halo of light around star
noStroke();
fill(255, 255, 0, 30);
ellipse(this.x + this.breadth/2, this.h, this.breadth * 5, this.breadth * 5);
stroke(255,255,0);
strokeWeight(0.5);
noFill();
//draws diamonds that make up star
quad(this.x, this.h,
this.x + this.breadth / 2,this.h - this.tall / 2,
this.x + this.breadth, this.h,
this.x + this.breadth / 2,this.h + this.tall / 2);
}
function buildingDisplay() {
var floorHeight = 20;
var bHeight = height;
noStroke();
fill(0);
push();
translate(this.x, height - 40);
rect(0, -bHeight, this.breadth, bHeight);
for (var i = 0; i < this.nFloors; i+=2) {
fill("yellow");
rect(5, -15 - (i * floorHeight), this.breadth - 10, 15);
}
pop();
}
//////////////////////////////////////////////////////////////////////////
function makeLamp(posX) {
var lamp = {x: posX,
breadth: 3,
speed: -2.5,
h: random(40,60),
r: random(20,35),
r2: 4,
move: lampMove,
display: lampDisplay}
return lamp;
}
function makeStar(posX) {
var star = {x: posX,
breadth: 3,
speed: -0.5,
tall: random(5,10),
h: random(20, 100),
move: starMove,
display: starDisplay}
return star;
}
function makeBuilding(birthLocationX) {
var bldg = {x: birthLocationX,
breadth: 60,
speed: -1.0,
nFloors: round(random(10,20)),
move: buildingMove,
display: buildingDisplay}
return bldg;
}
//////////////////////////////////////////////////////////////////////////////
//gradient sky function
function setGradient(c1, c2) {
noFill();
for (var y = 0; y < height; y++) {
var inter = map(y, 0, height, 0, 1);
var c = lerpColor(c1, c2, inter);
stroke(c);
line(0, y, width, y);
}
}
For this project, I created a landscape of a city during the night time. The three objects in the landscape are the buildings, lamps, and stars. All of the objects appear randomly in random quantities. The only consistency is the height at which the buildings and lamps appear. The lamps’s colors are randomized and made transparent in order to create a halo effect. The objects all move across the canvas at different speeds in order to create a sense of depth. The stars move slowest, followed by the buildings, and the lamp posts move the fastest.
Jacky Tian’s LookingOutwards-11
Feminism in Degital Design
The Game: The Game is a video game design by Angela Washko. The game presents contents relating politics, tactic practices of male pick-up artist, seduction community and feminism advocating aspects. Like a dating simulator, players can experience coaching lessons of seduction from pick-up artists. The game provides players opportunities to explore the structure of social behaviors as well as revealing the danger and complexity of this path.
Angela Washko, an artist, writer and facilitator, is devoted in creating new topics of feminism in the spaces. Living and working in Pittsburgh, Angela Washko is currently an assistant professor of College of Art at carnegie Mellon University.
Game download link: https://thegamethegame.org/download/
Cathy-Looking Outwards-11
Jenny Sabin is an American architect, designer, artist and professor in Cornell AAP. She is exceptionally interested in designing structures based on biology and mathematics. She focuses on design and cutting-edge technologies and emphasizes on computational design, data, visualization and digital fabrication.
I am particularly inspired by her studio’s new project “ADA,” done in 2018 – 2019. The project is named after Ada Lovelace, a polymath, mathematician and first computer programmer. The project produces a human-driven cyber physical architectural pavilion. It uses lightweight knitted structure that was generated by responsive data-driven tubular and cellular modules. The high-performing pavilion offers unique spaces to wonder and experience with its filtered light and dynamic shadows.
Cathy Dong – Project 11 – Landscape
/* Cathy Dong
Section D
yinhuid@andrew.cmu.edu
Project 11 - Landscape
*/
// mountain slope and move speed variables
var tDetail1 = 0.002;
var tSpeed1 = 0.0001;
var tDetail2 = 0.005;
var tSpeed2 = 0.0003;
var tDetail3 = 0.01;
var tSpeed3 = 0.0008;
// mountain colors
var terrC1 = "#597081";
var terrC2 = "#7EA0B7";
var terrC3 = "#D6EEFF";
//mountain heights range
var h1Min = 0;
var h1Max = 300;
var h2Min = 150;
var h2Max = 400;
var h3Min = 250;
var h3Max = 480;
// star variables
var sList = [];
var sNum = 20; // number of stars
var sLeft = -20; // reset start to canvas right
var sSpeed = -0.5;
// car variables
var cList = [];
var cHeight = 20; // car height
var cWidth = 50; // car width
var cNum = 5; //number of cars
var cLeft = -20 - cWidth; // reset car to start
var cSpeed = -1.5; // car speed
var wSize = 10; // car wheel size
function setup() {
createCanvas(480, 480);
// star start at random px and py
for (var j = 0; j < sNum; j++) {
var px = random(width);
var py = random(height / 3);
sList[j] = starMake(px, py);
}
// car cx and cy
var ground = height - height / 15;
for (var k = 0; k < cNum; k++) {
var cx = random(width);
var cy = ground - wSize / 2 - cHeight;
cList[k] = carMake(cx, cy);
}
}
function draw() {
// sky color
background("#2B2D42");
// render stars
starRender();
// render mountains
terrainDraw(tDetail1, tSpeed1, terrC1, h1Min, h1Max);
terrainDraw(tDetail2, tSpeed2, terrC2, h2Min, h2Max);
terrainDraw(tDetail3, tSpeed3, terrC3, h3Min, h3Max);
// draw ground
fill("#8D99AE");
rect(0, height - height / 15, width, height / 15);
// render car
carRender();
}
// mountain draw function
function terrainDraw(terrainDetail, terrainSpeed, terrC, terrMin, terrMax) {
noStroke();
// fill with layer color
fill(terrC);
// start drawing the shape
beginShape();
vertex(0, height);
// generate terrian
for (var i = 0; i < width; i++) {
var t = (i * terrainDetail) + (millis() * terrainSpeed);
var y = map(noise(t), 0, 1, terrMin, terrMax);
vertex(i, y);
}
vertex(width, height);
endShape();
}
// star object
function starMake(px, py) {
var star = {x: px, y:py, speed: sSpeed,
update: starUpdate,
draw: starDraw}
return star;
}
// update star px and py
function starUpdate() {
this.x += this.speed;
if (this.x <= sLeft) {
this.x += width - sLeft;
}
}
// draw star at this.x and this.y location
function starDraw() {
noStroke();
fill("yellow");
var size = random(1, 5); // make it shine
push();
translate(this.x, this.y);
circle(0, 0, size);
pop();
}
// render the star based on previous info
function starRender() {
for (var i = 0; i < sList.length; i++) {
sList[i].update();
sList[i].draw();
}
}
// car info
// a is car x position; b is car y position
function carMake(cx, cy) {
var car = {a: cx, b: cy, speed: cSpeed, c: color(random(100), random(0), random(255)),
update: carUpdate,
draw: carDraw}
return car;
}
// update car position
function carUpdate() {
this. a += this.speed;
if(this.a <= cLeft) {
this.a += width - cLeft;
}
}
// draw initial car
function carDraw() {
// wheel location
var wX1 = cWidth / 4;
var wX2 = cWidth - wX1;
noStroke();
push();
translate(this.a, this.b);
// draw car
fill(this.c);
rect(0, 0, cWidth, cHeight);
// draw car wheels
fill(0);
circle(wX1, cHeight, wSize);
circle(wX2, cHeight, wSize);
pop();
}
// render car to this.a and this.b
function carRender() {
for (var m = 0; m < cList.length; m++) {
cList[m].update();
cList[m].draw();
}
}
The idea is to create a night scene on a highway. In the scene, stars and mountains move relative to the cars in a various speed based on depth relationship.
Kristine Kim – Project 10-Sonic -Sketch
!!!!!UPDATE!!!!!
GOT IT TO WORK ON WORDPRESS
// Kristine Kim
// Section D
// younsook@andrew.cmu.edu
// Project -10-Interactive Sonic Sketch
var vacuumnoise;
var fridgenoise;
var dogbarking;
var outsidenoise;
var keynoise;
//global variables for images
var vacuumpic;
var dogpic;
var keypic;
function preload() {
//load pictures
var vacuumpicURL = "https://i.imgur.com/qbo0LSB.png[/img]"
vacuumpic = loadImage(vacuumpicURL);
var dogpicURL = "https://i.imgur.com/j41YK4G.png[/img]"
dogpic = loadImage(dogpicURL);
var keypicURL = "https://i.imgur.com/ozegqNz.png[/img]"
keypic = loadImage(keypicURL);
//load sounds
vacuumnoise = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/vacuum.wav")
fridgenoise =loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/fridge.wav")
dogbarking = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/dogbarking.wav")
outsidenoise = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/birdsoutside.wav")
keynoise = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/keys.wav")
// //vacuuming noise
// vacuumnoise = loadSound("vacuum.wav");
// //sound of fridge opening and closing
// fridgenoise =loadSound("fridge.wav");
// //sound of dog barking
// dogbarking = loadSound("dogbarking.wav");
// //sound of birds chirping outside
// outsidenoise = loadSound("birdsoutside.wav");
// //sound of key dropping on a table
// keynoise = loadSound("keys.wav");
}
function setup() {
createCanvas(500, 400);
useSound()
}
function soundSetup(){
//controlling the volume
vacuumnoise.setVolume(1);
fridgenoise.setVolume(1);
dogbarking.setVolume(1);
outsidenoise.setVolume(1);
keynoise.setVolume(1);
}
function draw() {
background(255, 247, 135);
//dark brown outline around everything
stroke(102, 77, 27);
strokeWeight(5);
//drawing the floor
fill(199, 154, 58);
rect(-5,280, 510,400);
//drawing the fridge
fill(245);
rect(40,100, 100, 200);
//fridge shadow
fill(176, 174, 169);
rect(40, 170, 100, 10);
// handle
fill(0);
rect(125,120,5,40);
rect(125,190,5,80);
//drawing the windows
fill(184, 241, 252);
rect(170,30,130,100);
rect(350,30,130,100);
line(235,30,235,130);
line(170,80,300,80);
line(415,30,415,130);
line(350,80,480,80);
//table legs
noStroke();
fill(102, 77, 27);
rect(210,240, 12, 70);
rect(380,240, 12, 70);
fill(71, 54, 20);
rect(290,190, 12, 100);
rect(450,190, 12, 100);
//drwing the table
fill(102, 77, 27);
beginShape();
vertex(280,190);
vertex(480,190);
vertex(280,190);
vertex(200,240);
vertex(400,240);
vertex(480,190);
endShape();
//drawing the vaccum image
image(vacuumpic, 250, 110, 350,250);
//drawing the dog image
image(dogpic,5,200,300,200);
//drawing the keys image
image(keypic,260,195,40,40);
}
function mousePressed(){
//If pressed on keys, play sound and if pressed somewher else, pause the sound
if (mouseX > 260 & mouseX < 300 && mouseY > 195 && mouseY < 235){
keynoise.play();
} else {
keynoise.pause();
}
//If pressed on dog, play sound and if pressed somewher else, pause the sound
if (mouseX > 80 & mouseX < 280 && mouseY > 240 && mouseY < 320){
dogbarking.play();
} else {
dogbarking.pause();
}
//If pressed on vacuum, play sound and if pressed somewher else, pause the sound
if (mouseX > 300 & mouseX < 480 && mouseY > 100 && mouseY < 300){
vacuumnoise.play();
} else {
vacuumnoise.pause();
}
//If pressed on fridge, play sound and if pressed somewher else, pause the sound
if (mouseX > 40 & mouseX < 140 && mouseY > 100 && mouseY < 300){
fridgenoise.play();
} else {
fridgenoise.pause();
}
//If pressed on right window, play sound and if pressed somewher else, pause the sound
if (mouseX > 170 & mouseX < 300 && mouseY > 30 && mouseY < 130){
outsidenoise.play();
} else {
outsidenoise.pause();
}
}
I wanted to create an environment and a setting for this project so I decided to create a kitchen/ living room. I was reminded of my childhood when I was working on this project because I used to play a lot of games where I was allowed to decorate my room or my house so I had a lot of fun with this one. The only problem that I had was that the sounds were not playing on WordPress but it works perfectly fine on a local server. I’m still having this problem, but I couldn’t figure it out. I have attached a zip file of my sounds so that it can be played on the local server.
Sammie Kim – Project 11 – Landscape
//Sammie Kim
//Section D
//sammiek@andrew.cmu.edu
//Project 11
var xPos = 100;
var yPos = 50;
var size = 70;
var backgroundPic;
var clouds = [];
function preload() {
//background gradient photo
var backgroundURL = "https://i.imgur.com/EMQBV3U.jpg"
backgroundPic = loadImage(backgroundURL);
}
function setup() {
createCanvas(480, 480);
frameRate(10);
//initial clouds first appears anywhere across the canvas
for (var i = 0; i < 1; i++) {
var startX = random(0, width/3);
clouds[i] = createClouds(startX);
}
}
function draw() {
background(0);
image(backgroundPic, 0, 0);
noStroke();
//call the functions below
sun();
mountain();
darkOcean();
ocean();
//show clouds
addNewClouds();
updateClouds();
removeClouds();
}
function sun() {
fill('#f29849');
circle(xPos, yPos, size);
xPos = xPos + 0.5;
if (xPos > width + size/2){
xPos = 0;
}
}
function updateClouds() {
//constantly calling the clouds
for (var x = 0; x < clouds.length; x++){
clouds[x].move();
clouds[x].draw();
}
}
function removeClouds() {
//create an array for keeping clouds on screen
//if x location is greater than 0, then push x values into the cloud array
var cloudsOnScreen = [];
for (var i = 0; i < clouds.length; i++) {
if (clouds[i].x > 0) {
cloudsOnScreen.push(clouds[i]);
}
}
clouds = cloudsOnScreen;
}
function addNewClouds() {
var probability = 0.004;
//a new cloud is drawn at the width when it is greater than a certain probability
if (random(0, 1) < probability) {
clouds.push(createClouds(width));
}
}
function moveClouds() {
//making clouds move to the left
this.x -= this.speed;
}
function makeClouds() {
//drawing the cloud with ellipses overlapping one another
noStroke();
fill('#7297a6');
ellipse(this.x - 10, this.y, this.width, this.height);
ellipse(this.x + 30, this.y, this.width, this.height);
ellipse(this.x, this.y + 5, this.width, this.height);
ellipse(this.x - 30, this.y + 5, this.width, this.height);
}
function createClouds(cloudX) {
//creating object for cloud's characteristics
var cloud = {x: cloudX,
y: random(25, 75),
width: 50,
height: 50,
speed: 0.7,
move: moveClouds,
draw: makeClouds}
return cloud;
}
function ocean() {
var oceanSpeed = 0.0003; //speed of terrain
var oceanDetail = 0.001; //smoothness
fill('#50abbf');
beginShape();
for (var x = 0; x < width; x++) {
var t = (x * oceanDetail) + (millis() * oceanSpeed);
var y = map(noise(t), 0, 1, height/2, height);
vertex(x, y);
}
vertex(width, height);
vertex(0, height);
endShape();
}
function mountain() {
var oceanSpeed = 0.0004; //speed of terrain
var oceanDetail = 0.007; //smoothness
fill('#6C671F');
beginShape();
for (var x = 0; x < width; x++) {
var t = (x * oceanDetail) + (millis() * oceanSpeed);
var y = map(noise(t), 0, 1, 0, height);
vertex(x, y);
}
vertex(width, height);
vertex(0, height);
endShape();
}
function darkOcean() {
var oceanSpeed = 0.0004; //speed of terrain
var oceanDetail = 0.001; //smoothness
fill('#254f6a');
beginShape();
for (var x = 0; x < width; x++) {
var t = (x * oceanDetail) + (millis() * oceanSpeed);
var y = map(noise(t), 0, 1, height/3, height);
vertex(x, y);
}
vertex(width, height);
vertex(0, height);
endShape();
}
This project was challenging as I had to keep in mind about the different objects that are shown on canvas and making them move. Imagining a space with ocean and mountain, I wanted to bring out a happy, peaceful mood through the overall warm colors. Overlapping the ocean terrains, I attempted to make an image of waves flowing past. The biggest challenge for me was creating the clouds to appear in the sky using objects. It was difficult having to think about multiple factors and constraints all at once, so I did it in a step by step manner—creating the cloud shape first with function, then calling it inside the object, and finally using other functions to add more properties.
Kristine Kim-Looking Outwards-11
Caroline Sinders is a machine learning designer/ user researcher, artist, and digital anthropologist who finds a lot of interest in language, culture and images. She creates many projects related to artificial intelligence, natural language processing, abuse, online harassment, and politics in digital, conversational spaces. All of her works are very intriguing and successful but the one that caught immediately caught my attention was her mixed media piece Black Box.
Black Box is a mixed media 3D project vocalizes the current conversation around police, violence, and race. Caroline and her team took the idea of camera phones as citizen journalism and flipped it. The media story within the box they created can only be captured and see with the phone, just like after a plane disaster, we look to the black box for truth. This project is installed in a room and upon entering the room, you hear and see a visualization of John Coltrane’s Alabama. However, an XBOX Kinect triggers the actual camera phone audio from police incidents as you place your phone into the box, creating new and confrontational context to this well known protest song. What I especially love about this project is the fact that the artists challenged where and how these stories and informations are experienced. They pushed the boundaries of asking themselves how might people engage with content and each other in new and different ways. Of course the whole production of building the box and using technology to execute this idea properly is also very intriguing, but their extra set of details of how and where they displayed their project is very impressive. I really enjoy this project and wish to experience in real life.
Project 11 Ellan Suder
I wanted to make a landscape that gave the illusion of depth, so objects would be moving past at different speeds depending on ‘how far back’ they are. I started by creating the mountains using the noise function. They were initially straight lines (x values i
and i
), but I used i*0.8
and i
instead because the offset created an interesting effect. Then I made a balloon that randomly picked an image from an array. This balloon also randomly generated things like speed and height.
After ironing things out a bit, I used the sample code as a framework for making several balloons in an array. I also made the speed/size more deliberate. Now, the closer the balloon is to the top (the smaller the y-value), the slower it moves, giving the illusion that it is farther away.
/*
Ellan Suder
15104 1 D
esuder@andrew.cmu.edu
Project-11
*/
var balloons = [];
var balloonLinks = [];
var t1 = 0;
var t2= 0;
var t3 = 0;
function preload() {
balloonLinks = [
"https://i.imgur.com/rmLvmIq.png",
"https://i.imgur.com/03Cr2Sx.png",
"https://i.imgur.com/peP166r.png"];
}
function setup() {
createCanvas(480, 480);
frameRate(30);
// create an initial collection of balloons
for (var i = 0; i < 10; i++){
var rx = random(-180, width);
var ry = random(40,height-200);
var rs = 70*(0.005*ry); //make balloons higher up smaller
var spd = ry/70; //make balloons higher up move slower
randomBalloon = floor(random(balloonLinks.length));
balloon = loadImage(balloonLinks[randomBalloon]);
balloons[i] = makeBalloon(balloon, rx, ry, rs, spd);
}
frameRate(10);
}
function draw() {
background(200);
updateAndDisplayBalloons();
removeBalloonsThatHaveSlippedOutOfView();
addNewBalloonsWithSomeRandomProbability();
//the larger t is
//the faster it moves
t1 += 0.01;
t2 += 0.04;
t3 += 0.1;
for(var i=0; i < width*1.3; i++)
{
//the larger the number you divide i by
//the 'faster' the terrain will move
n1 = noise(i/100-t1);
n2 = noise(i/100-t2);
n3 = noise(i/100-t3);
stroke(0,20);
line(i*0.8, height*n1, //top of the line (bumpy randomized part)
i, height); //bottom of line is bottom of canvas
stroke(0,70);
line(i*0.8, height*n2,
i, height);
stroke(0,200);
line(i*0.8, height*n3,
i, height);
}
}
function updateAndDisplayBalloons(){
// Update the balloon's positions, and display them.
for (var i = 0; i < balloons.length; i++){
balloons[i].move();
balloons[i].display();
}
}
function removeBalloonsThatHaveSlippedOutOfView(){
// If a balloon has dropped off the left edge,
// remove it from the array.
var balloonsToKeep = [];
for (var i = 0; i < balloons.length; i++){
if (balloons[i].x + balloons[i].size > 0) {
balloonsToKeep.push(balloons[i]);
}
}
balloons = balloonsToKeep; // remember the surviving balloons
}
function addNewBalloonsWithSomeRandomProbability() {
var newBalloonLikelihood = 0.03;
if (random(0,1) < newBalloonLikelihood) {
rx = random(-60, -50);
ry = random(40,height-200);
rs = 70*(0.005*ry);
spd = ry/70; //make balloons higher up move slower
randomBalloon = floor(random(balloonLinks.length));
balloon = loadImage(balloonLinks[randomBalloon]);
balloons.push(makeBalloon(balloon, rx, ry, rs, spd));
}
}
// method to update position of balloon every frame
function balloonMove() {
this.x += this.speed;
}
// draw the balloon
function balloonDisplay() {
image(this.img,this.x,this.y,this.size,this.size);
}
function makeBalloon(balloon, balloonX, balloonY, balloonSize, balloonSpeed) {
var blln = {img: balloon,
x: balloonX,
y: balloonY,
size: balloonSize,
speed: balloonSpeed,
move: balloonMove,
display: balloonDisplay}
return blln;
}