// Abstract keys.  Number keys set what color the background is and goes to if 
// fade is set.  6-0 will clear the image as well.  Fade can be activated with 
// q and deactivated with p.  All other alphabet keys draw different abstract 
// figures based on the current frame and the previous frame in which a key was 
// pressed or released.  
int prevPressFrame, curPressFrame, frameReleased, bgColor, squareCount, dropOff;
float decay;
void setup(){
  size(400,400);
  bgColor = 255;
  background(bgColor);
  smooth();
  squareCount = 0;
  dropOff = 32;
}

void draw(){
  
}

void keyPressed(){
  prevPressFrame = curPressFrame;
  curPressFrame = frameCount;
  decay = 400.0/(curPressFrame - prevPressFrame);
  noFill();
  stroke(255);
  ellipse(200,200, decay, decay);
  stroke(0);
  ellipse(200,200, abs(decay-400), abs(decay-400));
  fill(bgColor, dropOff);
  rect(-1,-1,401,401);
  char mykey = key;
  
  switch(mykey){
    case '1':
      bgColor = 0;
      break;
    case '2':
      bgColor = 64;
      break;
    case '3':
      bgColor = 128;
      break;
    case '4':
      bgColor = 192;
      break;
    case '5':
      bgColor = 255;
      break;
    case '6':
      bgColor = 0;
      background(bgColor);
      break;
    case '7':
      bgColor = 64;
      background(bgColor);
      break;
    case '8':
      bgColor = 128;
      background(bgColor);
      break;
    case '9':
      bgColor = 192;
      background(bgColor);
      break;
    case '0':
      bgColor = 255;
      background(bgColor);
      break;
    case 'a':
      fill(255);
      stroke(0);
      ellipse((curPressFrame%400), (curPressFrame%400), 40, 40);
      break;
    case 'b':
      fill(255);
      stroke(0);
      ellipse((curPressFrame%400), 400-(curPressFrame%400), 40, 40);
      break;
    case 'c':
      fill(255);
      stroke(0);
      ellipse(400-(curPressFrame%400), (curPressFrame%400), 40, 40);
      break;
    case 'd':
      fill(255);
      stroke(0);
      ellipse(400-(curPressFrame%400), 400-(curPressFrame%400), 40, 40);
      break;
    case 'e':
      fill(0);
      stroke(255);
      ellipse((curPressFrame%400), 200, 50, 50);
      break;
    case 'f':
      fill(0);
      stroke(255);
      ellipse(200, (curPressFrame%400), 50, 50);
      break;
    case 'g':
      fill(prevPressFrame%255);
      stroke(255-prevPressFrame%255);
      ellipse(random(400), curPressFrame%400, decay, decay);
      break;
    case 'h':
      fill(255-prevPressFrame%255);
      stroke(prevPressFrame%255);
      ellipse(random(400), 400-frameReleased%400, decay, decay);
      break;
    case 'i':
      for(int i = 0; i < (curPressFrame-prevPressFrame); i +=2){
        stroke(i*(255/(curPressFrame-prevPressFrame)));
        line(200, 200, (prevPressFrame + i)%400, 0);
      }
      break;
    case 'j':
      for(int i = 0; i < (curPressFrame-prevPressFrame); i +=2){
        stroke(i*(255/(curPressFrame-prevPressFrame)));
        line(200, 200, 0, 400-(prevPressFrame + i)%400);
      }
      break;
    case 'k':
      for(int i = 0; i < (curPressFrame-prevPressFrame); i +=2){
        stroke(i*(255/(curPressFrame-prevPressFrame)));
        line(200, 200, 400-(prevPressFrame + i)%400, 400);
      }
      break;
    case 'l':
      for(int i = 0; i < (curPressFrame-prevPressFrame); i +=2){
        stroke(i*(255/(curPressFrame-prevPressFrame)));
        line(200, 200, 400, (prevPressFrame + i)%400);
      }
      break;
    case 'm':
      noStroke();
      fill(frameReleased%255);
      rect(squareCount%4*100, (squareCount/4)%4*100, 100, 100);
      squareCount ++;
      break;
    case 'n' :
      noStroke();
      fill(curPressFrame%255);
      rect((int)random(4)*100, (int)random(4)*100, 100, 100);
      break;
    case 'o':
      noStroke();
      fill(random(255));
      rect((int)random(2)*200, (int)random(2)*200, 200, 200);
      break;
    case 'p':
      dropOff = 0;
      break;
    case 'q':
      dropOff = 32;
      break;
    case 'r':
      for(int i = 0; i < curPressFrame - frameReleased; i += 3){
        stroke(random(255));
        line((curPressFrame+i)%400, 0, 0, (curPressFrame+i)%400);
      }
      break;
    case 's':
      for(int i = 0; i < curPressFrame - frameReleased; i += 3){
        stroke(random(255));
        line(400-((curPressFrame+i)%400), 400, 400, 400-((curPressFrame+i)%400));
      }
      break;
    case 't':
      for(int i = 0; i < curPressFrame - frameReleased; i += 3){
        stroke(random(255));
        line(0, (curPressFrame+i)%400, 400-(curPressFrame+i)%400, 400);
      }
      break;
    case 'u':
      for(int i = 0; i < curPressFrame - frameReleased; i += 3){
        stroke(random(255));
        line(400, 400-((curPressFrame+i)%400), ((curPressFrame+i)%400), 0);
      }
      break;
    case 'v':
      for(int i = 0; i < curPressFrame - frameReleased; i += 3){
        stroke(random(255));
        line((curPressFrame+i)%400, 0, 0, 400-(curPressFrame+i)%400);
      }
      break;
    case 'w':
      for(int i = 0; i < curPressFrame - frameReleased; i += 3){
        stroke(random(255));
        line(400-((curPressFrame+i)%400), 400, 400, ((curPressFrame+i)%400));
      }
      break;
    case 'x':
      for(int i = 0; i < curPressFrame - frameReleased; i += 3){
        stroke(random(255));
        line(0, (curPressFrame+i)%400, (curPressFrame+i)%400, 400);
      }
      break;
    case 'y':
      for(int i = 0; i < curPressFrame - frameReleased; i += 3){
        stroke(random(255));
        line(400, 400-((curPressFrame+i)%400), 400-((curPressFrame+i)%400), 0);
      }
      break;
    case 'z':
      noStroke();
      fill(random(255));
      ellipse((int)random(2)*400, (int)random(2)*400, 400, 400);
      break;
  }    
}

void keyReleased(){
  frameReleased = frameCount;
  switch(key){
  }
}
Exercise 09: Create a black-and-white abstract image that changes in response to input from the keyboard. Utilize the keyPressed() and keyReleased() functions.