Social impacts of NFT

The reading discusses NFT (Non-fungible tokens) and how it impacts digital artists and collectors. NFT adds authenticity to digital artwork like images, music, or videos, and it helps protect the artwork’s ownership to prevent people from stealing the artwork online through screenshots. The author embraces this new trend in the digital art market because it “economically legitimizes an emerging artform.”

Andrew Benson, Active Gestures 10. Sold for: $3,049

The reading mentions an artist called Andre Benson, who had been experimenting with digital video works for years but had not received any financial rewards. He had to work in a software company to support his career as an artist. However, after selling his work through NFT, he could sustain himself solely through art, which liberated him from doing tedious but necessary jobs.

Despite its benefit to artists and collectors, NFT has its setbacks. Like bitcoins, NFT relies on blockchain technology to add uniqueness to each artwork, which relies on a tremendous amount of computing power that is not environmentally friendly. Moreover, it does not legally prevent people from stealing artwork; it merely protects the metadata of the artwork rather than the work itself. Therefore, NFT is not the prime solution to add ownership to artwork.

LO9:A Focus on Women and Non-binary Practitioners in Computational Art

In this week’s Looking Outward, I picked Eva Schindling’s work called Liquid Sound Collision.

In this work project, Eva shows a simulation of sound wave’s collision with the property of water waves. She initials the simulation with a cylinder, and the on the two ends of the cylinder, she started to implement sound on the surface. These sound waves expands like actual waves, and as they collide in the middle, the whole shape of the cyliner start to twist and change. There are a lot of uncertainty in the shape of the cylinder, as the sound waves have various shapes. Eva refers these shapes as a tension resulted from confrontations of body and mind, chaos and order, and simplicity and complexity. She uses this simulation into sculptures and other art works.

I think this is a very useful and meaningful exploration in visualizing abstract ideas. We usually talk about conflict, confrontation, and tension between relationships, but it’s very hard to actually see these ideas. But this simulation makes people feel these confrontations.

Eva is a female artist that explores technology, computation, and design. She visualizes a lot of abstract ideas such as higher dimensions into something that we can feel and understand.

http://www.evsc.net/home/liquid-sound-collision

Space battle

The spaceship engages in fights with enemies by using energy machine guns and lasers. The most challenging part actually comes in making all the visuals work correctly.

Four characters/sounds:

  • Firing spaceship
  • Explosion
  • Charge laser
  • Shoot laser

Space battle

//Jason Jiang
//Section E

///Storyline: The spaceship engages fights with enemies through using energy machine gun and laser.

//setting up variables for stars
var star = [];
var N = 10; //number of starts
var dx = 10; //speed of star
var w = 600; //x location of enemy
var dShip = 10; //speed of enemy
var a = 0;//scale of laser beam
var imgX = 120;//x location of ship
var imgY = 100;//y location of ship
var angle = 0;//angle of ship
var laserCharged = false; //whether laser is charged
var laserFired = false; //whether laser is fired
var enemyDestroyed = false; //whether enemy is destroyed


//defining assets
var machineGun;
var explosion1;
var explosion2;
var explosion3;
var laserEnergy;
var laserBeam;
var flyEngine;
var machineGun;
var explosion;
var charge;
var laser;

//add assets
function preload(){
    spaceShip = loadImage("https://i.imgur.com/D1QDG4A.png");
    spaceShipFire = loadImage("https://i.imgur.com/h8bQMXa.png");
    enemy1 = loadImage("https://i.imgur.com/OE8l2tK.png");
    explosion1 = loadImage("https://i.imgur.com/c9tLLTo.png");
    explosion2 = loadImage("https://i.imgur.com/kLTBXIa.png");
    explosion3 = loadImage("https://i.imgur.com/0zhmrzn.png");
    laserEnergy = loadImage("https://i.imgur.com/bmn9wZX.png");
    laserBeam = loadImage("https://i.imgur.com/ABposfH.png");
    machineGun = loadSound("https://courses.ideate.cmu.edu/15-104/f2022/wp-content/uploads/2022/11/machineGun.mp3");
    explosion = loadSound("https://courses.ideate.cmu.edu/15-104/f2022/wp-content/uploads/2022/11/explosion.wav");
    charge = loadSound("https://courses.ideate.cmu.edu/15-104/f2022/wp-content/uploads/2022/11/charge.wav")
    laser = loadSound("https://courses.ideate.cmu.edu/15-104/f2022/wp-content/uploads/2022/11/laser.wav")
}

// setup for audio generation
function soundSetup() { 
    machineGun.setVolume(0.1);
    explosion.setVolume(0.1);
    charge.setVolume(0.2);
    laser.setVolume(0.1);
}

//Create galaxy background
function updateStar(){
    this.x -= dx;
}

function createStar(){
    strokeWeight(3);
    stroke(255);
    point(this.x, this.y);
}

function generateStar(sx, sy){
   for (var i=0; i<N; i++){
        var s = {
            x: sx, y: sy,
            stepFunction: updateStar,
            drawFunction: createStar
        }

    }
    return s;
} 

function setup() {
    createCanvas(400, 200);
    frameRate(10);
    imageMode(CENTER);
    for (var i=0; i<N; i++){
        var s = generateStar(random(width), random(height))
        star.push(s);
 }
     useSound();
}


function draw() {
    background(0);
    //setting up sequence for charging laser and firing laser
    if (a >= 1){
            if(laserCharged == false){
                laserCharged = true
                a = 0
                charge.stop()
                laser.play();
            }
            else if(laserCharged == true & laserFired == false){
                laserFired = true
                a = 0
                laser.pause();
            }
        }
    //resetting enemy position if destroyed  
    if (enemyDestroyed == true){
            w = 600;
        }

   //Update star
    for (var i=0; i<N; i++){
        var s = star[i]
        s.stepFunction();
        s.drawFunction();
        //Remove star that is out of bounds
        if (s.x < 0) {
            var s = generateStar(random(width+5, width+500), random(height))
            star.splice(i, 1, s);
        }
   
    }
    
    //flying spaceship
    if (frameCount >= 0 & frameCount < 30) { 
        flyinSpace(imgX, imgY, 0); 
    }
    
    //killing enemy
    if (frameCount >= 30 & frameCount < 60) { 
        
        //play ship firing sound
        if (w == 600){
            machineGun.loop();  
        }
        
            //ship firing
            shipFiring(w);
            //enemy Ship approaching
            enemyShip(w, height/2);
            w -= dShip; 
       
    
        }
    
    if (frameCount >= 60 & frameCount < 70) { 
        //stop firing
        flyinSpace(imgX, imgY, 0);
        //play explosion sound when the enemy is close
        if(frameCount == 60){
            machineGun.stop();
            explosion.play()
        }
            explode(w, height/2, 60);
        }
    
    if (frameCount >= 70 & frameCount < 110) { 
        //setting up next enemy
        enemyDestroyed = false;
        if(frameCount == 70){
            charge.loop();
        }

        //dodge laser 
        if(dist(imgX, imgY, 120, 160)>0 & laserCharged == true){
        flyinSpace(imgX, imgY, 0);
        imgY += dShip;  
        }
        else{
            flyinSpace(imgX, imgY, 0);
        }

        //enemy Ship
            enemyShip(w, height/2);
            w -= 0.5*dShip;
        
        //charge laser
        if (laserCharged == false){
            laserCharge(w, height/2, a);
            a+=0.05;
        }
        //fire laser
        else if(laserCharged == true & laserFired == false){
            
            laserCharge(w, height/2, 1);
            laserFire(w, height/2, -a);
            a+=0.05;
        }
    
   
}
        
        if (frameCount >= 110 & frameCount < 140) {
            //preparing for next shot
            if (frameCount == 110){
              laserCharged = false;
              laserFired = false; 
              charge.loop();
            }

            //enemy Ship
            enemyShip(w, height/2);
            w -= 0.5*dShip;
            
            //ship fire laser
            //rotate ship
            if (angle>=-18){
                flyinSpace(imgX, imgY, angle);
                angle-=3;
            }
            //fire laser after rotation
            else{
                //charge laser
                flyinSpace(imgX, imgY, angle)
                if (laserCharged == false){
                    laserCharge(imgX, imgY, a);
                    a+=0.1;
                }
                //fire laser
                else if(laserCharged == true & laserFired == false){
                    
                    laserCharge(imgX, imgY, 1);
                    laserFire(imgX, imgY, a, angle);
                a+=0.1;
            }
             
        }
    }
        
        if (frameCount >= 140 & frameCount < 150) { 
        flyinSpace(imgX, imgY, angle);
        //play explosion sound when the enemy is close
            if(frameCount == 140){
                explosion.play();
            }
            explode(w, height/2, 140);
        }

        if (frameCount >= 150){
            background(0);
            noLoop();
        }
}

//adding spaceship
function flyinSpace(x, y, a){
        push()
        translate(x, y);
        rotate(radians(a));
        image(spaceShip, 0, 0);
        pop()
        
}

function shipFiring(w){
        //ship firing
        if(w%20 == 0){
            image(spaceShipFire, 120, height/2);
        }
        else{
            image(spaceShip, 120, height/2);
        }
    }

function enemyShip(w, h){ 
        //enemy ship flying
            image(enemy1, w, h);
        }

function explode(w, h, f){
        //create explosion when the enemy is close
                image(explosion1, w, h);
                if(frameCount-f >= 3){
                    image(explosion2, w, h);
                }
                if(frameCount-f >= 6){
                    image(explosion3, w, h);
                    enemyDestroyed = true;
                }
        
        }

//adding laser charge
function laserCharge(x, y, a){
        push()
        translate(x, y);
        scale(a);
        image(laserEnergy, 0, 0);
        pop()

}

//adding laser beam
function laserFire(x, y, a, angle){
        push()
        translate(x, y);
        rotate(radians(angle));
        scale(-a, 1);
        image(laserBeam, -211, -0.5);
        pop()

}


Project 09: Portrait

sketch

//Name: Hari Vardhan Sampath
//Section: E
//eMail address: harivars@andrew.cmu.edu
//Project-09

// global variable to store the preloaded image
var img;

function preload() {
    img = loadImage('https://i.imgur.com/8WPELuP.jpg');
}

/* 
Reference from lecture-20's random bouncing particles.
The bouncing particles will draw the image by accessing
the pixel colors it traverses.
Additionally, the mouseY position will control the alpha
of the pixel color and the mouse click will reset the background
to different grey color, also using the mouseY position
for the user to play with the abstract representation.
*/

// number of particles
var np = 100;  

function particleStep() {
    this.age++;
    this.x += this.dx;
    this.y += this.dy;
    if (this.x > width) { // bounce off right wall
        this.x = width - (this.x - width);
        this.dx = -this.dx;
    } else if (this.x < 0) { // bounce off left wall
        this.x = -this.x;
        this.dx = -this.dx;       
    }
    if (this.y > height) { // bounce off bottom
        this.y = height - (this.y - height);
        this.dy = -this.dy;
    } else if (this.y < 0) { // bounce off top
        this.y = -this.y;
        this.dy = -this.dy;
    }
}


function particleDraw() {
    this.clr = img.get(this.x, this.y);
    stroke(this.clr[0], this.clr[1], this.clr[2], mouseY);
    point(this.x, this.y);
}


function makeParticle(px, py, pdx, pdy) {
    p = {x: px, y: py,
         dx: pdx, dy: pdy,
         age: 0,
         stepFunction: particleStep,
         drawFunction: particleDraw
        }
    return p;
}


var particles = [];


function setup() {
    createCanvas(img.width, img.height);
    background(mouseY);
    for (var i = 0; i < np; i++) {
        var p = makeParticle(600, 600,
                             random(-10, 10), 
                             random(-10, 10));
        particles.push(p);
    }
    frameRate(15);
}


function draw() {
    strokeWeight(random(5));
    for (var i = 0; i < np; i++) { 
        var p = particles[i];
        p.stepFunction();
        p.drawFunction();
    }
}

// mouse press will refresh the background to re-draw
function mousePressed() {
  background(mouseY);
}

LO 09: Superfeel at Cinekid Festival 2014 ,  Molmol Kuo

SuperFeel from Molmol on Vimeo.

Molmol Kuo is a Taiwanese artist and educator based in Brooklyn, NY and a partner at YesYesNo LLC. Her background in documentary and experimental film, reflects in many of her interactive technology works which has strong sense of narrative potential. Her strength lies in electronic research and development, rather than the software. She uses rapid prototyping as a tool for storytelling. Molmol works with the mentor program at the Tisch School of the Arts for recent New York University graduates who are international students and in their early careers as artists. Apart from all of this, she volunteers for the Sanctuary for Families in New York to advocate for victims of violence and sex trafficking, and she works with survivors of gender-based violence to rebuild their lives beyond trauma.

SuperFeel is a project that utilizes interactive installation and wearable sensor technology. This project takes small forces from the hands of participants and scales them up, creating a stage where air, wind, fog, vibration can affect a crowd. The wearable device responds to the user’s muscle and body gestures to make the installation playable. At the same time installation also consists of flying objects to represent the forces generated in response to the sensory inputs and make the user suggestively feel the superpower.  

LookingOutwards-09

I researched Toni Dove’s Archeology of a Mother Tongue. This piece is a virtual reality murder mystery film and was created at The Banff Centre for the Arts in Canada. Dove collaborated with Michael Mackenzie for this immersive interactive narrative. Dove worked to create a piece using interactive computer graphics, laser disk video, and slides with interactive sound. I find this project interesting because of how detailed it is. The entire experience takes about forty minutes to experience, which means there was a lot of computing involved in this. In addition, there are many different parts that allow the viewer to experience the story in different perspectives. For example, you can look through a small plastic camera and see the perspective of one of the main characters, the coroner. She is having a dream of her life as a child. This piece is also interesting because it focuses on the stories of women, and centers the story around female characters, contrary to most murder mystery stories. 

Toni Dove, 1993

https://tonidove.com/archeology/text/

Image from “dream”

Project 9 – Computational Portrait

This portrait is based on the idea of the probabilistic road map as described in ‘Probabilistic Roadmap Path Planning’ by H. Choset et al. where the figure in the portrait is graph G and the red background are obstacles/collisions.

Controls

  • RIGHT ARROW = advance drawing one step
  • ENTER = start & stop drawing
  • ‘r’ = refresh
sketch
//Name: Tsz Wing Clover Chau
//andrewid: ctchau
//Section E
//Project 9


var chosenPixels;
var step;

var bgPx = [];
var rStep;

var range = 30;
var baseImage;


function preload(){
    baseImage = loadImage("https://i.imgur.com/PaF0PFq.png");
}

function setup(){
    createCanvas(480, 480);
    background(255);
    frameRate(30);
    baseImage.loadPixels();

    //init array
    chosenPixels = [];
    bgPx = [];
    step = false;
    rStep =  random(0, 30);

    for (var i = 0; i < rStep; i++){
        pt = makePoint(int(random(0, 480)), int(random(0, 480)));
        if (isRed(pt)) {
            bgPx.push(pt);
        } else {
            chosenPixels.push(pt);
        }
    }
}


function draw() {
    drawBg();
    if (keyIsDown(RIGHT_ARROW) || step){   // press right arrow to invidually step
        addPx();
    }
    drawFace();
}


//HELPER FUNCTIONS
function makePoint(px, py){
    var pt = {x: px, y: py};
    pt.c = baseImage.get(px, py);
    pt.neighbors;
    return pt;
}

function addPx(){
    rStep =  random(0, 100);
    var newPx = 0;
    while (newPx < rStep){
        pt = makePoint(int(random(0, 480)), int(random(0, 480)));

        //add to bg array + pick new if red
        while (isRed(pt)){
            if (int(random(0, 8)) == 1){
                bgPx.push(pt);
            }
            pt = makePoint(int(random(0, 480)), int(random(0, 480)));
        }

        var min_dist = range;
        for (var j = 0; j < chosenPixels.length; j++){
            var checkPx = chosenPixels[j];
            var d = dist(checkPx.x, checkPx.y, pt.x, pt.y);
            
            if ((dist(checkPx.x, checkPx.y, pt.x, pt.y) < range) & (d < min_dist)){
                min_dist = d;
                stroke(pt.c);
                strokeWeight(0.5);
                line(checkPx.x, checkPx.y, pt.x, pt.y);
                chosenPixels.push(pt);
                newPx ++;
                break;
            }
        }
    }
}


function isRed(pt){
    if (pt.c[0] > 50 & pt.c[1] < 30){
        return true;
    }
    return false;
}

function keyPressed(){
    if (keyCode == ENTER){  //ENTER to autocomplete
        step = !step;
    } else if (key == 'r'){  //press 'r' to reset!
        setup();
    }
}



function drawBg(){
    for (var i = 0; i < bgPx.length; i++){
        px = bgPx[i];
        px.c[3]= 80;
        stroke(px.c);
        strokeWeight(0.3);
        if (int(random(0,2)) == 1){
            line(px.x, 0, px.x, height);
        } else {
            line(0, px.y, width, px.y);
        }
    }
}

function drawFace(){
    for (var i = 0; i < chosenPixels.length; i++){
        var curPx = chosenPixels[i];
        stroke(curPx.c);
        strokeWeight(5);
        point(curPx.x, curPx.y);
    }
}

Logic/Pseudocode:

  • Configuration q = series of randomly generated non-background pixels (ie. not red).
  • Q = new randomly generated non-background pixels
    • if distance from q -> Q < acceptable range, append to q
  • N = rStep (ie. no. of new non-background pixels added to q)
Probabilistic Roadmap Path Planning by H. Choset et Al
Probabilistic Roadmap Path Planning by H. Choset et Al

References:
http://www.cs.columbia.edu/~allen/F15/NOTES/Probabilisticpath.pdf

Looking Outwards 09: A Focus on Women and Non-binary Practitioners in Computational Art 

Title: REAL/RAW/FAST Identity System
Artist: adidas x FIELD.IO
(Commissioned by: adidas Global Brand Design, Generative System Design: FIELD.IO, Motion & Identity Design: DIA, Media Asset Production: Stink, Creative Lead: Fleur Isbell, Xander Marritt, Lead Developer: Bruno Imbrizi Developer: Seph Li, Riccardo Cambiassi, Samuel Honigstein, Documentation: Kosuke, Chris Dumon, Executive Creative Direction: Marcus Wendt, Creative Director: Mile Hughes, Motion Design: Julien Bauzin, Producer: Alice Shaughnessy, Motion Design: Xavier Boivin, Strategy + Consulting: Vera-Maria Glahn)

The project I’ve chosen to discuss is the REAL/RAW/FAST Identity System designed by FIELD.IO (in collaboration with DIA) for sportwear brand adidas. According to the project description, the REAL/RAW/FAST Identity System is the “new face of adidas flagship stores: A Generative Identity System for Retail Screens – bespoke, dynamic, scalable.” Essentially, the system pulls from a pool of kinetic typefaces, procedural animations and local elements that move and change compositions on a series of screens in real time, to create a visual storefront with a bold and unique brand identity. One thing I admire is how it can be adapted from “a plug-and-play rollout to a bespoke flagship version, the Generative System provides solutions for any scale and use case”. The encoded flexibility of the system allows it to be adapted to different campaigns, regardless of content, and to different storefronts, regardless of scale/ screen arrangement. By designing a system, the same elements within a single campaign can be reconfigured and remixed to remain fresh and engaging to the consumer’s eyes. Not only is this project aesthetically simple and clean, the compositions generated and the transitions between such compositions feel seamless, effortless and very satisfying. For me, it is the perfect example of how systems design can integrate digital art into marketing without feeling awkward or clumsy like most digital art campaigns tend to, but also how basic coding and illustration skills can be leveraged to serve a large scale, lucrative project.

Of the members of the team that worked on the REAL/RAW/FAST Identity System, the creator I’ve decided to focus on is Vera-Maria Glahn. She is the managing director for FIELD.io, a digital art studio based in London, UK.
She completed her undergraduate education in Arbitur, Arts, German, English and Philosophy at the Gymnasium Theodorianum in 2003, going on to receive a Masters in Art in Visual Communication with Distinction from the Kinsthochschule Kassel (School of Arts & Design in Kassel) in 2009. She started her career in the media arts industry in 2003 as a producer and curator, notably for the Kassel Documentary Film & Video Festival in Germany and the V2_Institute for the Unstable Media in Rotterdam, Netherlands. She co-founded FIELD.io with Creative Director Marcus Wendt in 2009 following her postgraduate studies and currently manages and produces independent and commissioned digital art for various brand and cultural institutions around the world. I’ve chosen to focus on Vera-Maria because as a co-founder of FIELD.io, her ethics and approach to computational art is reflected in the brand’s direction, allowing me to discuss the brand’s values as a whole. Some of the brand’s core tenants include:

  • Imagination (new forms of brand experience, storytelling, creative expression)
  • Innovation (developing new forms of interaction, products and services)
  • Technology (deep engagement + understanding for technically rich content)
  • Relationships (establishing deep + long term connections with brands + people)
    In particular, I really like how the brand (and likely due to Vera-Maria’s founding vision) have positioned themselves as pioneers of digital art and design strategies for major brands, and how everything – from their website UI to their projects to their team portraits on the website – serve to reinforce this vision.

Links:
https://field.systems/work/real-raw-fast-identity-system
https://2016.motionawards.com/judge/vera-maria-glahn/
https://www.linkedin.com/in/veraglahn/?originalSubdomain=de
https://expandedanimation.com/speaker/vera-maria-glahn/

Looking Outwards 09

Vera-Maria Glahn

Vera-Maria Glahn, manager of FIELD, a studio focused on the development of art and technology represented in innovative formats. The project IBM is especially interesting to me because it is a graphical system that helps one visualize music with dynamic and expressive shapes. Different graphical elements represent different instruments, some including melody, drums, bass, etc. 

These shapes are both shaped and behave in a way that is representative of the music and how the instruments interact. This project is almost like a visual music piece or a personification of the instruments. The forms of these instruments were derived through many iterations, including technical mappings to free and organic forms. I think this type of project is extremely captivating because of this process. Through the creative process, the team learned not only how to create expressive art, but also engineered their own unique set of tools and a whole new set of opportunities for creativity. 

https://field.io/work/ibm-think-2020

Computational self-portrait

This is my self-portrait. I try to use parabola lines instead of points to draw my image. The shape of lines is varied by adding an acceleration variable to change dx and dy. The portrait is looped and redrawn every 500 lines.

//Jason Jiang
//Section E
//Setting up variables
var np = 0;
var particleSetup = [];
var myProtrait
function preload(){
    myProtrait = loadImage("https://i.imgur.com/huB83xd.jpg");
}

//Updating properties of particles each step
function particleStep(){
    //Getting pixel color of the location of each particle on the image
    this.c = myProtrait.get(this.x, this.y);
    
    //Adding acceleration to create parabola curve
    this.dx += this.ax;
    this.dy += this.ay;
    
    //Updating x,y locations of particles
    this.x += this.dx;
    this.y += this.dy;
    
    //Updating x,y locations of particles in next step
    this.x1 = this.x + this.dx;
    this.y1 = this.y + this.dy;
    
}

//Drawing lines between two particles
function particleDraw(){
    stroke(this.c);
    strokeWeight(this.s);
    line(this.x, this.y, this.x1, this.y1);
    
}

//Creating particles
function particle(px, py, pdx, pdy, pax, pay, pc, px1, py1, ps){
    var p = {
        x: px, 
        y: py, 
        dx: pdx, 
        dy: pdy, 
        ax: pax, 
        ay: pay, 
        c: pc, 
        x1: px1, 
        y1: py1, 
        s: ps,
        stepfunction: particleStep, 
        drawfunction: particleDraw
        }
    return p; 
}

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


function draw(){
    //Constraining number of particles
    if (np < 500){
        //Creating objects and adding them into array
        c = color(random(255), random(255), random(255))
        var p = particle(random(width), random(height), random(5), random(10), random(0.5, -0.5), random(0.5, -0.5), c, 0, 0, random(1,8));
        particleSetup.push(p);
        np+=1
    }

    //Resetting canvas if num of particles exceeds 500
    if (np == 500){
        background(255);
        np = 0;
        particleSetup = [];
    }

    //Running particles
    for(i = 0; i < np; i++){
        var p = particleSetup[i];
        p.stepfunction();
        p.drawfunction();
    }
   
    }