Rosa Menkman, a Dutch artist, specializes in glitch art and resolution theory. She investigates visual compression and glitches to create an artwork by combining different sensory systems. Developing glitch art as a genre, the artist proposes a programming structure that takes the use of compression artifacts into dicrete cosine transform blocks. Such an approach successfullly builds a subtle relationship between an artifact and a process.
What attracts me the most is her creative insight into illustrating compressive art. The glitches mark a transformation of audios and sounds that are hard to describe or see into a visual language that can have colors, scopes, continuity and variance. Such clear yet bold compositions give us a more insightful knowledge of how different types of art can work through visualizing those elements. What’s more, it can be interesting to study such patterns to find out the aesthetics and the universal “golden ratios” behind all those different genres and expressions.
/*
Min Ji Kim Kim
Section A
mkimkim@andrew.cmu.edu
Project-11
*/
var luggage = [];
function setup() {
createCanvas(480,450);
frameRate(50);
// create an initial collection of luggage
for (var i = 0; i < 3; i++) {
var rx = random(width);
luggage[i] = makeLuggage(rx);
}
}
function draw() {
background(225, 225, 218);
baggageClaim(); //background details
updateLuggage(); //update luggage
removeLuggage(); //remove luggage
addLuggage(); //add luggage
}
function updateLuggage() {
// update the luggage's position and display them
for (var i = 0; i < luggage.length; i++) {
luggage[i].move();
luggage[i].display();
}
}
function removeLuggage() {
//remove luggage from array if it's out of sight
var luggageToKeep = [];
for (var i = 0; i < luggage.length; i++) {
if (luggage[i].x + luggage[i].breadth > 0) {
luggageToKeep.push(luggage[i]);
}
}
luggage = luggageToKeep; //remember the surviving luggage
}
function addLuggage() {
//with a very small probability, add a new luggage to the end
var newLuggageProb = 0.008;
if (random(0,1) < newLuggageProb) {
luggage.push(makeLuggage(width));
}
}
// method to update position of luggage every frame
function luggageMove() {
this.x += this.speed;
}
// draw the luggage
function luggageDisplay() {
//bag
noStroke();
fill(this.r, this.g, this.b);
rect(this.x, 360, this.breadth, this.h);
//bag handle
fill("#654321");
var top = 350 + this.h; //top of bag
rect(this.x + 20, top, this.breadth - 45, 5);
rect(this.x + 20, top, 5, 10);
rect(this.x + this.breadth - 25, top, 5, 10);
//bag tag
fill(245);
stroke(this.r, 50, 150);
strokeWeight(3);
rect(this.x + 30, top + 20, 15, 27);
line(this.x + 35, top, this.x + 35, top + 20);
}
// make a luggage bag object
function makeLuggage(beginX) {
var lgg = {x: beginX,
breadth: random(80, 120),
speed: -1.0,
h: -random(50, 100), //luggage height
//set color
r: random(10, 250),
g: random(10, 250),
b: random(10, 250),
move: luggageMove,
display: luggageDisplay}
return lgg;
}
function baggageClaim() { //create background details
noStroke();
//floor
fill(238, 239, 235);
rect(0, 200, width, height);
//windows
fill(236, 236, 230);
rect(0, 50, width, 120);
for(i = 0; i < 6; i++) {
stroke(255);
strokeWeight(4);
strokeCap(SQUARE);
line(i * 85 + 25, 50, i * 85 + 25, 170);
}
line(0, 110, width, 110);
line(0, 140, width, 140);
chair();
//carousel sign
fill(90);
rect(150, 45, 250, 60);
rect(200, 10, 3, 35);
rect(350, 10, 3, 35);
noStroke();
fill(29, 40, 80);
rect(155, 65, 70, 35);
fill(0);
rect(235, 65, 160, 35);
textSize(8);
fill(255);
text("Baggage Claim", 155, 60);
text("Arrival Time", 235, 60);
textSize(15);
text("Delta 2:50", 270, 88);
textSize(35);
text("K", 180, 95);
//conveyor belt
fill(135, 147, 141);
rect(0, 400, width, 20);
fill(67, 67, 67);
rect(0, 420, width, 5);
fill(168, 184, 179);
rect(0, 395, width, 5);
rect(0,305, width, 5);
fill(30);
rect(0, 310, width, 85);
for(j = 0; j < width; j++) { //belt lines
stroke(15);
strokeWeight(3);
line(j * 30, 310, j * 30, 395);
}
}
function chair() { //create a chair
for(x = 0; x < 4; x++) {
noStroke();
fill(196, 197, 190);
rect(80 + x * 22, 155, 20, 12);
rect(80 + x * 22, 168, 20, 2);
stroke(196, 197, 190);
strokeWeight(2);
strokeCap(SQUARE);
line(x * 22 + 90, 167, x * 22 + 90, 172);
line(x * 25 + 85, 172, x * 25 + 85, 180);
strokeWeight(1);
line(84, 172, 161, 172);
}
}
I think this week’s project was the one that I had the most fun making but also the most challenging. Coming up with the idea was easy. I love to travel and I like staring at the baggage claim conveyor belt because if I stare long enough, it makes me feel like I’m moving. I quickly drew a sketch of what I wanted my landscape to look like.
I then moved on to the starter code template and tried to understand what each part of the code was doing and how it was changing the image. This part was a little hard just because there were so many moving parts but I ultimately figured it out and then I tailored it one function at a time to match my sketch and create the final product. The colors and sizes of the bags are generated randomly.
//Steven Fei
//zfei@andrew.cmu.edu
//project 11
//section-A
var stars = [];
function setup() {
createCanvas(480, 480);
frameRate(8);
//set the initial display of the stars
for(var i = 0; i<8; i++){
var sx = random(width);
var sy = random(50, height/3);
stars[i] = makeStars(sx, sy);
}
}
function draw() {
background("black");
//create the terrain in the far back of the canvas
var terrain3 = terrain(30, 2, height/5, height * 3/4, 3);
//create the terrain in the middle of the canvas
var terrain2 = terrain(80, 2, height/3, height * 3/4, 2);
//create the terrain in the front of the canvas
var terrain1 = terrain("white", 2, height/2, height * 3/4, 1);
//create the blue lake at the bottom of the canvas
noStroke();
fill(0,33,41);
rect(0, height * 4/5, width, height);
//create trees
for (var x = 0; x < width; x+=5){
var orange = random(80,150);
stroke(240, orange, 80);//define the color of the tree to draw
strokeWeight(1.2);
push();
translate(x * random(5,10), height * 4/5);
drawTree(0, random(5,15), int(random(3,6)));//calling the function to draw the tree
pop();
}
//update star by showing the stars and the moving positions of the stars
updateStar();
//only keep the stars that are still on the canvas
removeStar();
//add new stars under a certain probability
addStars();
}
//showing the star positions
function updateStar(){
for (var i = 0; i<stars.length; i++){
stars[i].move();
stars[i].display();
}
}
//only keep the stars on the canvas
function removeStar(){
var starKeep = [];
for ( var i = 0; i < stars.length; i++){
if(stars[i].x > 0){
starKeep.push(stars[i]);
}
}
stars = starKeep;
}
//add more stars by chance
function addStars(){
var starProbability = 0.01;
if(random(0,1) < starProbability){
stars.push(makeStars(width,random(50,height/3)));
}
}
//defining the moving speed of the star
function starMove(){
this.x += this.speed;
}
//displaying the star by drawing the circle
function starDisplay(){
fill("white");
noStroke();
push();
translate(this.x, this.y);
circle(0,0,this.size);
pop();
}
//main function to make the star
function makeStars(birthX, birthY){
var str = { x: birthX,
y: birthY,
speed: -1.5,
size: random(5,15),
move: starMove,
display: starDisplay};
return str;
}
//making the terrain
var terrainSpeed = 0.0005;
var terrainDetail = 0.005;
function terrain(color,strokeweight,min,max,noiseseed){
var verticesX = [];//array to append values for x coordinates
var verticesY = [];//array to append values for y coordinates
noiseSeed(noiseseed);//decide the pseudo random number seed
stroke(color);//the color to choose to draw the terrain
strokeWeight(strokeweight);//the strokeweight to choose to draw
noFill();
beginShape();
for ( var x = 0; x < width; x++){
var t = (x * terrainDetail) + (millis() * terrainSpeed);
var y = map(noise(t), 0, 1, min, max);
vertex(x,y);//generating the terrain points
verticesX.push(x);
verticesY.push(y);
if(verticesX.length > width){
verticesX.shift();
verticesY.shift();
}
}
for ( var j = 0; j < verticesX.length; j++){
line(verticesX[j], verticesY[j], verticesX[j],height);//add vertical coloring to the terrain
}
endShape();
}
//function to draw trees by defining depth(number of branches), len(branch length), seed(upper limit of the branch counts)
function drawTree(depth, len, seed){
if(depth < seed){
rotate(radians(-10));
drawBranch(depth,len, seed);
rotate(radians(20));
drawBranch(depth,len, seed);
}
}
function drawBranch(depth, len, seed){
line(0,0,0,-len);
push();
translate(0,-len);
drawTree(depth + 1, len, seed);
pop();
}
For this project, I was intended to create a serene atmosphere by the lake. The mountains are majorly created in 3 layers with different shades to represent a sense of depth and distance. Symbolic maple trees were drawn in different saturations of orange and different sizes and branch counts to have a “realistic” impression of the diverse range of the trees. The circular stars are moving in the upper part of the canvas to strengthen the sense of moving. By setting different moving speed of those different objects, I was aiming to deepen a spatial feeling in the visual hierarchy. The maple trees were moving fastest because they are relatively in the very front of the canvas, while the mountains are constantly moving slower, and the stars are the slowest. The project gives me some chances to make different objects and functions and use different strategies to fulfill those elements through building a connection between the draw function and the other specific functions I make for the elements.
Allison Parish is an artist who is currently based in Brooklyn, New York, where she works at NYU as a professor in their Interactive Telecommunications Program (ITP). There, she teaches classes like Computational Approaches to Language. Most of her work seems to deal with poetry, and generative explorations of poetic space and poetic exploration. I couldn’t find for some reason any information on her undergraduate background, but I did find that she attended NYU’s ITP program in 2008.
A good example of her work is the twitter bot, The Ephemerides, which is a reflection of generative poetry exploring new frontiers, just as physical space probes explore the physical space around us –
This work was first made in 2015, though it has made posts up through 2019. I admire the aspect of this project that it exploration for the sake of exploration, and the simple contraction of the poems. Some of them are very beautiful. As a critical note however, I feel this project could have been pushed a little bit more, as the connection between the exploration of physical and metaphysical space and the simple diptych almost feels too surface level / maybe there could one been a more complex relationship going on between the images and the text.
Minicade, created by Chloe Varelidi, is essentially a mobile web-app built in JavaScript that allows you to play mini-games with your friends. I admire Varelidi’s work because it’s not only fun and interactive, but it also teaches one how to code their own mini-games, making learning fun. This could appeal to different age ranges, from young children learning how to code, to older people who want to make more complex games.
Chloe Varelidi received her Masters in Fine Arts at Parsons’ Design and Technology Program. She worked in game design studios and multiple organizations that mostly focus on incorporating play with human learning, such as Mozilla and littleBits where she created Minicade. She recently founded Humans Who Play, which is an organization that strives to use play to bring a positive impact on learning, especially in children. She currently resides in Washington D.C which is where Humans Who Play is also located at.
The Weather Thingy is an instrument that takes into account the weather to play various sounds in harmony. I found the serenity produced by this project fascinating. Different sensors bring the numerical input to be translated into the algorithm and produce sound. The ambience of the sound and the concept of weather go along very well together.
This project makes me wonder the very extreme cases and different possible variables. For instance, when it is hailing, what will happen? Or when the climate is very arid and hot? I think this project has a lot of potential and room to explore.
I made an interactive sound grid where the position of your mouse determines which of the soundtracks are being played the loudest. The ellipses also change colors and scales accordingly. There is unbalance due to innate volume difference in the sound files. The sound files are all 120bpm to match the beat, but due to the volume imbalance, it’s hard to be aware of individual sounds.
//Danny Cho
//changjuc@andrew.cmu.edu
//Section A
//Project 10
var px = [];
var py = [];
var div = 10;
var noiseOn = false;
var myLeftTop;
var myRightTop;
var myLeftBot;
var myRightBot;
function preload() {
myLeftTop = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/LeftTop-1.wav");
myRightTop = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/RightTop.wav");
myLeftBot = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/LeftBot.wav");
myRightBot = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/RightBot.wav");
// call loadImage() and loadSound() for all media files here
}
function soundSetup() { // setup for audio generation
// setting initial volume
myLeftTop.setVolume(0.1);
myLeftBot.setVolume(0.1);
myRightTop.setVolume(0.1);
myRightBot.setVolume(0.1);
}
function setup() {
createCanvas(400, 400); //create canvas
for (var i = 0; i < div; i++) {
px.push(i * (height / div)); //create array for creating grid
py.push(i * (height / div));
}
useSound();
}
function mousePressed() { //play when mouse is pressed
myLeftTop.play();
myLeftBot.play();
myRightTop.play();
myRightBot.play();
}
function draw() {
background(0);
stroke(255);
strokeWeight(0.5);
//creates the grid
for (var i = 0; i < px.length; i++) {
line(px[i], 0, px[i], height);
line(0, py[i], width, py[i]);
}
//draws circles on the grid
for (var i = 0; i < px.length - 1; i++) {
for(var j = 0; j < px.length - 1; j++) {
fill(100, 255/(i), 255/j);
//circles resond to the mouse position
if (dist(mouseX, mouseY, px[i+1], py[j+1]) < 20) {
ellipse(px[i+1], py[j+1], 50, 50);
}
else {
strokeWeight(0);
ellipse(px[i+1], py[j+1],
1300/dist(mouseX, mouseY, px[i+1], py[j+1]),
1300/dist(mouseX, mouseY, px[i+1], py[j+1]));
}
}
}
//the volume of each soundtrack depends on the distance of the mouse to the corners
myLeftTop.setVolume((dist(mouseX, mouseY, 0, 0))^2/2500);
myLeftBot.setVolume((dist(mouseX, mouseY, 0, height))^2/2500);
myRightTop.setVolume((dist(mouseX, mouseY, width, 0))^2/2500);
myRightBot.setVolume((dist(mouseX, mouseY, width, height))^2/2500);
}
//ilona altman
//project 10
//iea@andrew.cmu.edu
//var music; // this is some background music I made myself
var music1; // pieces of interview on narrative vs poetic filming
var music2; // excerpt from as I was moving ahead occasionally I saw breif glimpses of beauty
var music3; // advice to the young
var music4; //except from the begining of his film lost lost lost
var theImage; // this is the background image
function preload() {
//music = loadSound('music0.mp3'); // preloading sound
music1 = loadSound('https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/music1.mp3')
music2 = loadSound('https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/music2.mp3')
music3 = loadSound('https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/music3.mp3')
music4 = loadSound('https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/11/music4.mp3')
var myImageURL = "https://i.imgur.com/nyJdNSY.png"; //image
theImage = loadImage(myImageURL); //image
}
function soundSetup() { // setup for audio generation
}
function setup() {
createCanvas(600,600);
background(255,255,255);
noStroke();
frameRate(20);
theImage.loadPixels(); //loading the image pixels
useSound(); //sound
// music.play(); //sound
// music.loop(); //loop the sound
}
function draw() {
//going through all pixels of jonas mekas attriubution
background(255,255,255);
for (x = 0; x < width+10; x++) {
for (y = 0; y < height+10; y++) {
var pixelColorXY = theImage.get(x,y);
fill(pixelColorXY);
ellipse(x, y, random(0,2), random(0,2));
}
}
//creating red rain
for (x = 0; x < width+10; x=x+10+random(3,10)) {
for (y = 0; y < height+10; y=y+10+random(3,10)) {
fill(255,0,0);
ellipse(x, y, random(0,2), random(0,3));
ellipse(x-1,y-1,random(0,2), random(0,3));
ellipse(x+1,y+1,random(0,2), random(0,3));
}
}
}
function mousePressed() {
if (mouseX > width/2 & mouseY > height/2) { // left top
music1.play();
} else if (mouseX > width/2 & mouseY < height/2) { // left bottom
music2.play();
} else if (mouseX < width/2 & mouseY > height/2) { // right top
music3.play();
} else if (mouseX < width/2 & mouseY < height/2) {// right bottom
music4.play();
}
}
This work was inspired very much by Jonas Mekas, who is one of my favorite artists and filmmakers… He past away about a year ago but still holds such a warm presence. He speaks often about beauty and poetry. I wanted this piece to almost be like a little tribute to him and his work, with sounds pulled from various interviews with him and his films.
I think it is interesting how musicality seems to be intrinsically tied to emotion. Just as we anthropomorphize visual stimuli, it seems there is a tendency to process notes in a way that reveals the interior subjectivity of that producing the noise. This makes me think about how perhaps music was our first language, and a study I saw that spoke about how the musicality of peoples voices when saying things (in anger, or speaking to babies) is similar across all languages, and that this may be one of the first ways we understand the world’s communication with us… I admire that this work was able to, in such a simple set up, touch on these concepts of musicality, emotion and projecting emption on to technology.
I would suppose that the algorithm used to generate this work was made by breaking down a note analysis of a singer who sag this song, and than repeating these notes by a computer, which holds them for the specified amount of time noted by the original recording.
The artist’s sensibility for humor definitely showed through this work with the song choice. It is also clear they have a bend toward minimalism, and it is this minimalism which strengthened the conceptual exploration of this work.
When I was brainstorming about what to do for this project, it happened to be pouring outside with thunder and lightening (yesterday). Hence, I decided to create this cozy night starter pack on rainy days. Since I created my background image on Illustrator, I had to define each icon by using rect() function. This was just for myself to write the conditional functions. Overall, I am happy with my work.
/*
Hyejo Seo
Section A
hyejos@andrew.cmu.edu
Project 10 - Sonic Sketch
*/
var backgroundPic;
var rainSound;
var thunderSound;
var kettleSound;
var matchesSound;
function preload() {
// loading my background image
var backgroundURL = "https://i.imgur.com/pIas40A.jpg";
backgroundPic = loadImage(backgroundURL);
// loading the sound files
rainSound = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/10/rain.wav");
rainSound.setVolume(1);
thunderSound = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/10/thunder.wav");
thunderSound.setVolume(1);
kettleSound = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/10/kettle.wav");
kettleSound.setVolume(1);
matchesSound = loadSound("https://courses.ideate.cmu.edu/15-104/f2019/wp-content/uploads/2019/10/matches.wav");
matchesSound.setVolume(1);
}
function setup() {
createCanvas(500, 400);
backgroundPic.resize(500, 400); // resizing my background picture to fit the canvas
// useSound();
}
function draw() {
image(backgroundPic, 0, 0);
noFill();
stroke(255, 248, 240);
strokeWeight(2);
// Thunder cloud area
rect(3, 4, 223, 130);
// Rain cloud area
rect(285, 18, 215, 110);
// Candles area
rect(5, 240, 220, 155);
// Tea area
rect(310, 295, 137, 95);
}
function mousePressed() {
// thunder sound conditional statement
if(mouseX > 3 & mouseX < 226 && mouseY < height / 2){
if(thunderSound.isLooping()){
thunderSound.pause();
} else {
thunderSound.loop();
}
}
// rain sound conditional statement
if(mouseX > 285 & mouseX < 500 && mouseY < height / 2){
if(rainSound.isLooping()){
rainSound.pause();
} else {
rainSound.loop();
}
}
// candle sound conditional statement
if(mouseX > 5 & mouseX < 225 && mouseY > height / 2){
if(matchesSound.isLooping()){
matchesSound.pause();
} else {
matchesSound.loop();
}
}
// kettle sound conditional statement
if(mouseX > 310 & mouseX < 447 && mouseY > height / 2){
if(kettleSound.isLooping()){
kettleSound.pause();
} else {
kettleSound.loop();
}
}
}