Change Contents of the Bubble
View this PageEdit this PageUploads to this PageHistory of this PageHomeRecent ChangesSearchHelp Guide

What is this class about?

Driving Questions for the Course


How did the Wildebeests charge over the ridge in The Lion King?


Uploaded Image: wildebeests.jpg

How did the villagers in The Hunchback of Notre Dame wave and move in crowd scenes?

Uploaded Image: hunchback.jpg

Both of these are cases where Disney moved from traditional drawn cel animation to:

That's what this class is about: How do media professionals structure their use of the computer to capture the structure of the real world and its behavior?

Part 1: Introduction to Java


We start out by learning Java, in the context of media.

Images

We'll manipulate images by creating Picture methods like this:
  /**
   * Method to scale the picture by a factor, and return the result
   * @param scale factor to scale by (1.0 stays the same, 0.5 decreases each side by 0.5, 2.0 doubles each side)
   * @return the scaled picture
   */
  public Picture scale(double factor)
  {
    Pixel sourcePixel, targetPixel;
    Picture canvas = new Picture((int) factor*this.getWidth(),(int) factor*this.getHeight());
    // loop through the columns
    for (double sourceX = 0, targetX=0;
         sourceX < this.getWidth();
         sourceX+=(1/factor), targetX++)
    {
      // loop through the rows
      for (double sourceY=0, targetY=0;
           sourceY < this.getHeight();
           sourceY+=(1/factor), targetY++)
      {
        sourcePixel = this.getPixel((int) sourceX,(int) sourceY);
        targetPixel = canvas.getPixel((int) targetX, (int) targetY);
        targetPixel.setColor(sourcePixel.getColor());
      }
    }
    return canvas;
  }


and use this code in our Interactions in DrJava like this:
> Picture doll = new Picture(FileChooser.pickAFile());
> Picture bigdoll = doll.scale(2.0);
> bigdoll.show();
> bigdoll.write("bigdoll.jpg");


to create transformations like this (yes, dolls on blue screen, for later use in simulations):
Uploaded Image: gal1-face.jpg Uploaded Image: bigdoll.jpg

We'll also use turtle graphics to do drawing with relative motion.

Sampled Sounds


We'll do sound transformations (reversals, normalizing, growing software, growing shorter) for later use in structuring rhythms.

Music


We'll use JMusic to manipulate real music with multiple voices, instruments, and parts.

Part 2: Structuring our Media


Structuring Music


The idea is to be able to group notes into phrases and parts and whole songs, in the kinds of structures that allow for musical exploration.

public class MyFirstSong {
  public static void main(String [] args) {
    Song songroot = new Song();

    SongNode node1 = new SongNode();
    SongNode riff3 = new SongNode();
    riff3.setPhrase(SongPhrase.riff3());
    node1.repeatNext(riff3,16);
    SongNode riff1 = new SongNode();
    riff1.setPhrase(SongPhrase.riff1());
    node1.weave(riff1,7,1);
    SongPart part1 = new SongPart(JMC.PIANO, node1);

    songroot.setFirst(part1);

    SongNode node2 = new SongNode();
    SongNode riff4 = new SongNode();
    riff4.setPhrase(SongPhrase.riff4());
    node2.repeatNext(riff4,20);
    node2.weave(riff1,4,5);
    SongPart part2 = new SongPart(JMC.STEEL_DRUMS, node2);

    songroot.setSecond(part2);
    songroot.show();
  }
}


In order to produce this:

Click me to hear the result: composedsong.midi

We actually see this notation on the screen:
Uploaded Image: composedscore.jpg

Images


What does it mean to change "layering" in an image? We'll explain this in terms of linked lists. Then we'll build a tree of images that will be easy to animate later.

We can use the order of picture elements in a list to determine ordering (linear) on the screen, instead of representating layering. This code:
> FileChooser.setMediaPath("D:/cs1316/MediaSources/");
> PositionedSceneElement tree1 = new PositionedSceneElement(new Picture(FileChooser.getMediaPath("tree-blue.jpg")));
> PositionedSceneElement tree2 = new PositionedSceneElement(new Picture(FileChooser.getMediaPath("tree-blue.jpg")));
> PositionedSceneElement tree3 = new PositionedSceneElement(new Picture(FileChooser.getMediaPath("tree-blue.jpg")));
> PositionedSceneElement doggy = new PositionedSceneElement(new Picture(FileChooser.getMediaPath("dog-blue.jpg")));
> PositionedSceneElement house = new PositionedSceneElement(new Picture(FileChooser.getMediaPath("house-blue.jpg")));
> Picture bg = new Picture(FileChooser.getMediaPath("jungle.jpg"));
> tree1.setNext(tree2); tree2.setNext(tree3); tree3.setNext(doggy); doggy.setNext(house);
> tree1.drawFromMeOn(bg);
> bg.show();
> bg.write("D:/cs1316/first-house-scene.jpg");


Generates this image:
Uploaded Image: first-house-scene.jpg

Tweaking the ordering slightly like this:
> tree2.setNext(doggy); doggy.setNext(tree3); tree3.setNext(house);
> bg = new Picture(FileChooser.getMediaPath("jungle.jpg"));
> tree1.drawFromMeOn(bg);
> bg.show();
> bg.write("D:/cs1316/second-house-scene.jpg");


moves the dog between trees two and three, instead of between tree3 and the house.

That then generates this image:
Uploaded Image: second-house-scene.jpg

Sampled Sounds and Rhythms


We want to be able to create complex rhythms by organizing pieces in trees for easy manipulation and recreation.

Animations


Animations are easy at this point – just write out our images after running through the list or tree.

Part 3: Simulations


We'll start out with continuous simulations: How do we understand the ecology of plants and animals, predators and prey, and simulate it on a computer?

Here's a simulation of disease moving through a population:

We start using UML to understand our growing programs
Uploaded Image: SimulationPackage-disease.jpg

We'll then move to discrete event simulation. If something interesting isn't happening every moment, let's skip the moments where nothing interesting is happening!

If we're generating times randomly, we still have to make sure that real events occur in real time, so we have to deal with sorting event queues and dealing with different kinds of random.

We end up simulating with media results attached – not always wildebeests and villagers, but the same ideas. Here are two example simulation results of villagers attacking a "bad guy."