#!/usr/bin/perl
# extreme whitespace v. 0.1
# performance typing.
# amy alexander/uebergeek/deprogramming.us
# updates available at http://deprogramming.us
# contact: deprogramming at deprogramming.us
#
# copyright/left 2003 - released under the Gnu Public License
# http://www.gnu.org/licenses/gpl.txt
#
# you'll probably need to download Time::HiRes and/or
# Term::ReadKey from cpan.org if you don't have them already.
# sorry, doesn't seem to work on perl 5.8 - works on perl 5.6 and 5.6.1
# Term:ReadKey seems to have a bug under Perl 5.8.
use Getopt::Std;
use Time::HiRes(usleep);
use Term::ReadKey;
use Term::ANSIColor;
my %opts;
getopts('mh', \%opts);
if(defined $opts{h}) {
print "usage: $0 [-m] [-h]\n";
print "\t-m\tmonochrome mode - color keys deactivated.\n";
print "\t-h\tdisplay this help message.\n";
print "\t\tsee comments at end of script for runtime keystroke commands.\n";
exit;
}
$|=1;
$starttime = time;
$startphrase = ' ';
$startsleepval = 3000;
$phrase = $startphrase;
$sleepval = $startsleepval;
$dosleep = 1;
$SIG{'INT'}= sub {print color 'reset'; print "adios!\n\n"; exit(0); };
while (1) {
# performance note:
# comment out these next 3 lines if you want the text to never reset on its own.
# you can do that by just putting a # sign at the beginning of each line.
if (int(rand(1100)) == 2) {
$phrase = $startphrase;
}
print "$phrase ";
if ($dosleep) {
usleep ($sleepval);
}
ReadMode 3;
$key = ReadKey(-1);
$now = time;
if ((defined($key)) and ($now > $starttime + 5) and ($key !~ /[0123JK]/)) {
$phrase = $phrase.$key;
}
breakcheck ();
if (!keycheck()) { # first, check key to see if it's an effect.
# if it's not, see if it's a color (except in monochrome mode.)
unless(defined $opts{m}) {
colcheck ();
}
}
$oldkey = $key;
ReadMode 0; # this may appear redundant, but has a subtle visual effect.
}
# end main loop
sub breakcheck {
# checks the phrase to see if it's one that goes in or out of a "break"
if ($phrase =~ /.*HH$/) {
# type HH to go into rapid-rhythm mode...
$dosleep = 0;
$sleepval = 300;
$phrase = ' ';
}
elsif (($phrase =~ /.*\|$/) and !($dosleep)){
# type | to come out of rapid-rhythm mode...
$dosleep = 1;
$starttime = time;
}
}
sub colcheck () {
# checks for color-related keystrokes
my @colors = qw(black red green yellow blue);
if ($key eq '1') {
if ($colchanging) {
$colchanging = 0;
}
else {
$colchanging = 1;
}
}
elsif ($key eq '2') {
if ($underline) {
$underline = 0;
}
else {
$underline = 1;
}
}
elsif ($key eq '3') {
print color 'reset';
$colchanging = 0;
$underline = 0;
}
if ($colchanging == 1) {
($bg) = spewpicker (1,@colors);
print color "on_$bg";
}
if ($underline == 1) {
($fg) = spewpicker (1,@colors);
print color "$fg";
print color "underline";
print color "bold";
}
}
sub keycheck () {
# checks for keystrokes other than color
if ($key eq 'K' ){
$sleepval = $sleepval + 100;
return 1;
}
elsif (($key eq 'J' ) and ($sleepval > 50)) {
$sleepval = $sleepval - 50;
return 1;
}
elsif ($key eq '-') {
$phrase .= ' ';
return 1;
}
elsif ($key eq '>') {
@phrase = split('',$phrase);
$phrase = join(' ',@phrase);
return 1;
}
elsif ($key eq ',') {
$phrase = '';
return 1;
}
elsif ($key eq '<') {
$key = $oldkey;
@phrase = split('',$phrase);
$newphrase = join("\n ",@phrase);
chomp $phrase;
$phrase .= $key;
$phrase .= $key;
}
elsif ($key eq '_') {
if ($dosleep) {
$phrase .= reverse ($phrase);
}
return 1;
}
elsif ($key eq '0') {
$phrase = $startphrase . '';
$starttime = $now;
$sleepval = $startsleepval;
return 1;
}
return 0;
}
sub spewpicker {
my ($numspewings, @spewings) = @_;
my $i;
my @returnspewings = ();
for ($i=1;$i<=$numspewings ;$i++) {
my $pickme = int(rand(@spewings));
push (@returnspewings, $spewings[$pickme]);
}
return @returnspewings;
}
# End of program
####################################################################################
# Extreme Whitespace
#
###############
# General Info:
# Extreme Whitespace takes advantage of your text terminal's natural talent
# as a realtime video instrument!
# About all this script really does it is spew whitespace into your
# terminal for you to type into, with, against, around...
#
##############
# Preparation:
# Linux: make sure lpd - or other print spooler - is turned off!
# (/etc/init.d/lpd stop as root.)
# Works well in Eterm (or in plain console mode).
# But *very slow* in KDE "Konsole" shells.
# Gnome-terminal adds its own special scroll-scratching talents to the mix!
# (Try it under gnome-terminal with excessive use of the up arrow... )
#
# Setting a large font such as lucidasanstypewriter-bold-24 is nice but not essential.
# For example: Eterm -F lucidasanstypewriter-bold-24
#
# Mac OSX: sort of works in OSX Terminal, but it's kind of slow.
#
# Windows: doesn't work right at all, even if you install the librariess.
# However, it works ok over a moderately fast network connection
# to a unix server if you use PuTTy on Windows.
# (Just be sure that lpd or other print spooler isn't running on the server.)
#
#############
# Directions:
# Run the script and start typing.
# Experiment with different typing rhythms! Don't miss out on
# natural special fx keys like Enter, arrow keys, and spacebar!
# Try different combos of those, as well as combos like the | key and _ ...
# Also, try copy/pasting bits of text of various sizes from your other
# shells with your mouse.
#
# Also can be used in automatic mode - pipe in any text
# from your harddrive or the net for teletype eyecandy fun!
#
# Other suggestions:
# Type along with your favorite pop song for reverse karaoke fun!
# Text rapping!
# Raves!
#
####################
# Keystroke commands
# You can learn them or just mess around:
# 0 - reset
# (See "performance note" in the script above to disable automatic resetting.)
# 1 - color mode #1
# 2 - color mode #2
# 3 - reset color mode
#
# - (hyphen) pattern effect
# _ (underscore) palindrome/strobe effect: don't hold down too long or it crashes!
# > extra whitespace effect: don't hold this down too long either!
# ok to hit these two repeatedly though, for varying fx!
#
# , something strange and potentially diagonal.
# combine with up and down arrows for videogame fun!
# < another strange, sort of diagonal thing. but stranger and less diagonal than the ','
# try combining with arrow and color keys, as well as other typing.
#
# J faster.
# K slower.
#
# HH - fast break mode (definitely check this out)
# | (pipe) = back to normal speed mode
#
#
# Ctrl-C (or your normal kill sequence) to quit.
#
#################################
# Video jamming the natural way!
# No patches to build, no peripherals to buy, no DirectX/OpenGL hassles -
# Just peck away!
#
####################################################################################