- •Credits
- •About the Author
- •About the Reviewers
- •www.PacktPub.com
- •Table of Contents
- •Preface
- •Mission Briefing
- •Making Processing talk
- •Reading Shakespeare
- •Adding more actors
- •Building robots
- •Mission Accomplished
- •Mission Briefing
- •Connecting the Kinect
- •Making Processing see
- •Making a dancer
- •Dance! Dance! Dance!
- •Mission Accomplished
- •Mission Briefing
- •Can you hear me?
- •Blinking to the music
- •Making your disco dance floor
- •Here come the dancers
- •Mission Accomplished
- •Mission Briefing
- •Drawing your face
- •Let me change it
- •Hello Twitter
- •Tweet your mood
- •Mission Accomplished
- •Mission Briefing
- •Connecting your Arduino
- •Building your controller
- •Changing your face
- •Putting it in a box
- •Mission Accomplished
- •Mission Briefing
- •Drawing a sprite
- •Initiating the landing sequence
- •Running your sketch in the browser
- •Running the game on an Android phone
- •Mission Accomplished
- •Mission Briefing
- •Rotating a sphere
- •Let there be light
- •From sphere to globe
- •From globe to neon globe
- •Mission Accomplished
- •Mission Briefing
- •Reading a logfile
- •Geocoding IP addresses
- •Red Dot Fever
- •Interactive Red Dot Fever
- •Mission Accomplished
- •Mission Briefing
- •Beautiful functions
- •Generating an object
- •Exporting the object
- •Making it real
- •Mission Accomplished
- •Index
Project 1
Downloading the example code
You can download the example code files for all Packt books you have purchased from your account at http://www.packtpub.com. If you purchased this book elsewhere, you can visit http://www.packtpub. com/support and register to have the files e-mailed directly to you.
6.Now we will add a mousePressed() method to our sketch, which will get called if someone clicks on our sketch window. In this method, we are calling the speak() method of the TTS object we created in the setup() method.
void mousePressed() { tts.speak("Hello, I am a Computer");
}
7.Click on the Run button to start the Processing sketch. A little gray window should appear.
8.Turn on your speakers or put on your headphones, and click on the gray window. If nothing went wrong, a friendly male computer voice named kevin16 should greet you now.
Objective Complete - Mini Debriefing
In steps 1 to 3, we installed an additional library to Processing. The ttslib is a wrapper library around the FreeTTS text-to-speech engine.
Then we created a simple Processing sketch that imports the installed library and creates an instance of the TTS class. The TTS objects match the speakers we need in our sketches. In this case, we created only one speaker and added a mousePressed() method that calls the speak() method of our tts object.
Reading Shakespeare
In this part of the project, we are going to create a Drama thread and teach Processing how to read a Shakespeare script. This thread runs in the background and is controlling the performance. We focus on reading and executing the play in this task, and add the speakers in the next one.
11 
Romeo and Juliet
Prepare for Lift Off
Our sketch needs to know which line of the script is read by which robot. So we need to convert the Shakespeare script into a more machine-readable format. For every line of text, we need to know which speaker should read the line. So we take the script and add the letter J and a separation character that is used nowhere else in the script, in front of every line our Juliet-Robot should speak, and we add R and the separation letter for every line our Romeo-Robot should speak. After all these steps, our text file looks something like the following:
R# Lady, by yonder blessed moon I vow,
R# That tips with silver all these fruit-tree tops --
J# O, swear not by the moon, the inconstant moon,
J# That monthly changes in her circled orb,
J# Lest that thy love prove likewise variable.
R# What shall I swear by?
J# Do not swear at all.
J# Or if thou wilt, swear by thy gracious self,
J# Which is the god of my idolatry,
J# And I'll believe thee.
I have already converted the script of the play into this format, and it can be downloaded from the book's support page at http://www.packtpub.com/support.
Engage Thrusters
Let's write our parser:
1.Let's start a new sketch by navigating to File | New.
2.Add a setup() and a draw() method.
3.Now add the prepared script to the Processing sketch by navigating to Sketch | Add File and selecting the file you just downloaded.
4.Add the following line to your setup() method:
void setup() {
String[] rawLines = loadStrings ( "romeo_and_juliet.txt" );
}
5.If you renamed your text file, change the filename accordingly.
6.Create a new tab by clicking on the little arrow icon on the right and choosing
New Tab.
12
Project 1
7.Name the class Line. This class will hold our text lines and the speaker.
8.Add the following code to the tab we just created:
public class Line { String speaker; String text;
public Line( String speaker, String text ) { this.speaker = speaker;
this.text = text;
}
}
9.Switch back to our main tab and add the following highlighted lines of code to the setup() method:
void setup() {
String[] rawLines = loadStrings ( "romeo_and_juliet.txt" );
ArrayList lines = new ArrayList();
for ( int i=0; i<rawLines.length; i++) { if (!"".equals(rawLines[i])) {
13 
Romeo and Juliet
String[] tmp = rawLines[i].split("#"); lines.add( new Line( tmp[0], tmp[1].trim() ));
}
}
}
10.We have read our text lines and parsed them into the lines array list, but we still need a class that does something with our text lines. So create another tab by clicking on the arrow icon and choosing New Tab from the menu; name it Drama.
11.Our Drama class will be a thread that runs in the background and tells each of the speaker objects to read one line of text. Add the following lines of code to your Drama class:
public class Drama extends Thread { int current;
ArrayList lines; boolean running;
public Drama( ArrayList lines ) { this.lines = lines;
current = 0; running = false;
}
public int getCurrent() { return current;
}
public Line getLine( int num ) {
if ( num >=0 && num < lines.size()) { return (Line)lines.get( num );
}else { return null;
}
}
public boolean isRunning() { return running;
}
}
14
Project 1
12.Now we add a run() method that gets executed in the background if we start our thread. Since we have no speaker objects yet, we will print the lines on the console and include a little pause after each line.
public void run() { running = true;
for ( int i =0; i < lines.size(); i++) { current = i;
Line l = (Line)lines.get(i); System.out.println( l.text ); delay( 1 );
}
running = false;
}
13.Switch back to the main sketch tab and add the highlighted code to the setup() method to create a drama thread object, and then feed it the parsed text-lines.
Drama drama;
void setup() {
String[] rawLines = loadStrings ( "romeo_and_juliet.txt" );
ArrayList lines = new ArrayList();
for ( int i=0; i<rawLines.length; i++) { if (!"".equals(rawLines[i])) {
String[] tmp = rawLines[i].split("#"); lines.add( new Line( tmp[0], tmp[1].trim() ));
}
}
drama = new Drama( lines );
}
14.So far our sketch parses the text lines and creates a Drama thread object. What we need next is a method to start it. So add a mousePressed() method to start the drama thread.
void mousePressed() {
if ( !drama.isRunning()) { drama.start();
}
}
15 
Romeo and Juliet
15.Now add a little bit of text to the draw() method to tell the user what to do. Add the following code to the draw() method:
void draw() { background(255); textAlign(CENTER); fill(0);
text( "Click here for Drama", width/2, height/2 );
}
16.Currently, our sketch window is way too small to contain the text, and we also want to use a bigger font. To change the window size, we simply add the following line to the setup() method:
void setup() {
size( 800, 400 );
String[] rawLines = loadStrings ( "romeo_and_juliet.txt" );
ArrayList lines = new ArrayList();
for ( int i=0; i<rawLines.length; i++) { if (!"".equals(rawLines[i])) {
String[] tmp = rawLines[i].split("#"); lines.add( new Line( tmp[0], tmp[1].trim() ));
}
}
drama = new Drama( lines );
}
17.To change the used font, we need to tell Processing which font to use. The easiest way to find out the names of the fonts that are currently installed on the computer is to create a new sketch, type the following line, and run the sketch:
println(PFont.list());
18.Copy one of the font names you like and add the following line to the Romeo and Juliet sketch:
void setup() {
size( 800, 400 );
textFont( createFont( "Georgia", 24 ));
...
19. Replace the font name in the code lines with one of the fonts on your computer.
16
