Tom's Programming Projects
Here are some of the programs I've written over the years.
I've provided download links for many of them because they may be useful or
entertaining. I will not be liable for any bad things that happen as a
result of what you download from this page, but if you have trouble with
something just email me and I'll be glad to help you with it. Note that
all screenshot links will automatically open in new browser windows.
Licensing policy: These programs are free for your personal,
non-commercial use, unless otherwise specified by an individual program. Commercial use is subject to my approval, so please send me
email at explaining what you want to do.
|iRacingTelem (still needs a real name)
|A real-time telemetry analysis and visualization tool for the iRacing simulator.
As you're driving in the iRacing simulator, this program will display (on an external
USB7 7 segment display) the time difference
between your current lap and your best lap to the nearest hundredth of a second. Fastest
laps are automatically validated for integrity and made the new standard for comparison,
stored in simple text files that are used to persist across sessions.
This program can also represent the time difference aurally, using a tone that varies in
frequency. This allows an unconventional and interesting way of perceiving and
comprehending change in time difference over time, which has the additional benefit of
not requiring you to take your eyes off of the road. In practice, it takes significant
getting used to and is not really a substitute for a numeric display, but it can still
be useful in some situations.
|Usable, but not polished enough to release to the public yet.
|A simple text to image converter to enable reading on a cell phone.
My cell phone is a simple Nokia with an excellent 240x320 display but very poor (J2ME)
programming capability. I wanted to be able to view Japanese text on the go, but
the phone doesn't make it easy to view text files and has no Japanese font. It does
a great job viewing image files though, so I wrote this program. This program takes
text copied and pasted into a textbox and generates a series of 1bpp PNG image files
that are formatted to fit the 240x320 display exactly. This approach is simple, extremely
space efficient, and makes it very fast and easy to view the text on the phone with
perfect quality and no dependencies. No fonts or software need to be installed on the
phone: just copy over image files into whatever directory structure you like.
|Usable, but not polished enough to release to the public yet.
|A program that facilitates interaction between MoodLogic
software and the AudioTron
networked MP3 player to let users generate a playlist
based on a song. Leave this
program running on a PC which has your MP3 collection shared and the
MoodLogic software installed. Then, from the front panel of the
AudioTron, you can choose a song in your collection and have a playlist
generated automatically based on that song.
|Completed, usable, but hopelessly obscure. MoodLogic and the AudioTron are both discontinued products now and were never well known to begin with.
|Go to the ACWatch home page. C++
source code is included.
|A point-to-point audio and video conferencing program built for low
latency and ease-of-use. I was getting sick of having a
delay of a few seconds when talking to someone with NetMeeting when my
ping to that person was only 130ms, and the other programs I tried all had
terrible audio quality and/or nasty user interfaces, so I wrote this. It streams 16-bit
16kHz audio over the Internet using UDP packets and the excellent Speex
codec. Latency is low enough to not be noticeable in a conversation,
given a good Internet connection between users (like a sub-100ms ping),
and still quite good on a broadband-to-modem connection. You can
connect to as many people as your bandwidth can support. Requires DirectX 8 or later.
supports real-time low-latency video using a DirectShow-compatible video
capture device and any codec with Video for Windows support. Very
results have been obtained with WMV9, XviD, and VP6 at 320x240, 15-30 fps,
using bit rates from 20kbps to 200kbps. Unlike most programs that
support video, TAConf lets you control everything AND send full-size video
to multiple people at the same time. There is also a focus on
efficiency which lets you make the most out of your available CPU power
|Core functionality complete. Updated occasionally.
|Go to the TAConf home page.
|A simple utility for adjusting two MIDI controllers at
the same time by using the mouse. It's easy: Choose a MIDI
output device, choose one or two controllers to adjust, then drag the
mouse around the main window. I wrote this program mainly to
experiment with controlling cutoff frequency and resonance simultaneously
on the Roland SC-8850. The source code for this program includes
classes I wrote to do MIDI I/O, registry I/O, and double-buffering with
|midicci.exe (30K, program executable) -
C++ source code)
|A second attempt at cool 3D stuff. This time I'm
using Direct3D 8.1, which is much cleaner than previous versions. So
far I'm just playing around. The screenshots below show some
interesting effects obtained by using a particle system and not clearing
the framebuffer between updates. Eventually I did some multitextured
lightmaps and alpha blended texturing, but I don't have screenshots of it
|Development abandoned - need to switch to DX9 (or DX10?!) and start over!
|No download, just: - screenshot
2, screenshot 3,
|A hex (and text) viewer built for speed, efficiency, and simplicity.
Since the 1980's I'd been using an old DOS program called LIST for all of
my hex viewing needs. I finally decided to write a Windows program
with exactly the functionality I needed to do certain data analysis
tasks. I also wanted to try using memory mapped files, which worked
out well. tghex lets you load an unlimited number of
files, of size up to 4GB each, without using more than a few hundred bytes
of memory for each file. You can instantly seek to any part of the
file. Also, you can easily flip between open files by hitting the
New: You can now view files in both hex and text views. This
makes the program especially handy for examining and searching large text
|Core functionality complete. Updated occasionally.
|tghex.exe (40K, program executable) -
|Tom's Spectrum Analyzer
|A program for capturing audio and visualizing it with a waveform
display and spectral analysis, including a voiceprint mode. I used DirectSoundCapture
to capture audio for the purpose of meaningful visualization, updating the display as quickly
as possible. The goal was to get a little experience using DSP and
the Fourier transform, though this can be a handy utility for seeing how
much noise different mixers in your system are letting through or just
seeing what sound looks like in both frequency and time domains.
Several parameters are adjustable to get a closer look at the data. Also be aware that this program will use as much CPU
time as it can get, without taking CPU away from other non-idle processes
- the main processing thread's priority is just above idle. This program requires DirectX 8 or higher.
|tspec.exe (29K, program executable) -
screenshot 1, screenshot
2, screenshot 3
(shows face in voiceprint mode)
C++ source code)
Shifter Utility (formerly known as Shift It!)
|A utility enabling free-shifting with the ACT
LABS RS Shifter and GPL
USB Shifter in
games without native support for it. The RS Shifter is an
add-on for the ACT LABS Force RS wheel, providing a realistic shifting
experience. The GPL USB Shifter is a standalone shifter that can
work along with any manufacturer's wheel. Until recently, these
shifters only fully worked in a handful of
games that provided native support. Now they can be used with almost
any racing game, with a native-like shifting experience for most
games. Just leave this utility running in the background, go into a
supported game, and you can shift gears. This program requires DirectX 7 or higher.
|This utility is available from the ACT
LABS web site.
|A DLL providing a high-level function for sending e-mail,
callable from Visual Basic and any other language supporting DLLs.
It handles everything necessary for sending an
e-mail message, with extensive error checking and reporting.
Multiple file attachments are supported using standard MIME base64
encoding. Using TSMail, sending an e-mail message is as simple as this:
ret = send_email("mail.yourisp.com",
"Subject line", "Message body text (optional)", "textfile.txt
(optional - filename of text file to append to message body)",
"blah.exe,asdf.txt,test.wav (optional - list of files to
|tsmail.zip (27K, program source
code, DLL, and usage instructions)
|A Win32 console app combining ping and traceroute functionality.
I wrote this because I was annoyed with the inaccurate timing of the
Windows ping program, and the slowness of tracert. This program is
accurate to 0.1ms as opposed to the 10-20ms of the standard Windows
ping. I also added some extra features like the ability to sound the
system beep if a ping response is received, an ongoing packet-loss
indicator for continuous pings, a graphical representation of ping time, a delta-time between hops for
traceroutes, and a special outage tracking and reporting mode.
|Completed, usable. Updated rarely.
|ipcheck.exe (26K, program executable)
- screenshot 1,
|Win32 DF ("disk free")
|A Win32 console app summarizing free/total disk space on all
drives/partitions. This was inspired by Kai Uwe Rommel's DF
1.7, a hybrid DOS-OS/2 port of the UNIX df command. I wrote this
because Rommel's DF couldn't handle the size of modern drives and running
it was relatively slow, since it was a 16-bit program. I added some
info not present in his program, as well as a total line for local fixed
disks only. This program sure beats looking at My Computer to
summarize your disk space situation.
|df.exe (22K, program executable) - screenshot
1 (1999), screenshot 2
dfsrc.zip (3K, C source code and
VC++ project files)
|A test program for learning Direct3D Immediate Mode. This is my
first attempt at a 3D engine. The scene consists of a rainbow floor, a particle fountain
of smiling spheres, a large textured Earth, and several cats floating around. You can fly
around the scene and shoot the cats to make them spin and fly up in the air. Make sure you
run this with sound, or you'll miss out on half the fun! Requires DirectX 7 or higher and a 3D accelerator is
strongly recommended. Use w, s, a, d and the mouse to move. 1, 2, and 3 select different
weapons. "I" inverts the mouse and various other keys do various other things. I
encourage you to experiment.
|Development pretty much abandoned - in favor of starting fresh with a new 3D
- an enhanced version of the program with additional graphics, sounds,
and.. gameplay?! (1MB,
ZIP file containing program executable and data) - screenshot
ZIP file containing program executable and data)
|A MIDI player. It has its own playback engine, which allows it
to visualize many of the underlying structures and event flow of the MIDI format.
TMIDI lets the user see what's going on and have control over a couple of things
that most MIDI players don't allow for: reassignment of instruments, global note velocity
and pitch shifts, and tempo. The display shows what notes are being played on each
channel, what instruments are being used, what text events and marker points are in the
file, and there is a track list window showing info about each MIDI track, such as which
controller was last used and what its value was. A detailed analysis feature lets
you dump a human-readable event-by-event interpretation of the MIDI file to a text file
for careful examination.
|Core functionality complete. C++ source code available on home
|Go to the TMIDI Home Page.
Actual download is a <100KB EXE.
|A program for sharing MIDI music data in real-time over a network.
Uses UDP/IP to communicate over the Internet or a LAN. I have tested this by sending data
from myself playing on my MIDI keyboard over a slow 19200 modem connection to others on
the Internet and it works well. Streaming complex MIDI files did not work so well due to
the packet volume and my lack of bandwidth at the time.
(36K, program executable) - screenshot
|A C++ wrapper class for accessing ODBC data sources and
databases. Easily add ODBC database I/O to a C++ program
without having to mess with DAO, ADO, OLEDB, or other scary
acronyms. This class was written using the sql*() ODBC API and has
been used successfully by myself and others in several applications.
Look at the bottom of dbclass.cpp for usage examples.
|dbclass.zip (5K, C++ source
|Tom's HTTP Leech
|A utility for downloading many files through HTTP. Give this program
a URL and it will download everything referenced by that web page. An optional filter lets
you place requirements on the contents of URLs of files to be downloaded - a filter of
.mid would only download MIDI files. Options for local and foreign levels of recursion
allows the program to scan HTML that it downloads for more links, letting you download an
entire web site and even other sites that it links to. An overwrite option lets you
specify whether or not files already on your hard drive should be re-downloaded.
Downloaded files can be all be placed in one directory, or the remote directory structure
can be mirrored on your hard drive.
|Completed, usable. Updated very rarely.
(69K, program executable) - screenshot
|IPServ / IPClient
|A client/server system for tracking peoples' IP addresses. The server
runs as an NT service or Win32 console app and keeps track of peoples' IP addresses. The
client is a Windows program that lives in the system tray and communicates with the
server. It can be configured to keep the server posted as to whether the client is running
or not (which can indicate online vs. offline) as well as check in on a periodic basis. It
can also query the server to see the information for a particular user, including their IP
address, online/offline status, and last seen date and time. This system was
helpful to me for keeping track of the IP addresses of computers with dialup connections
to the Internet. It could have been useful as a layer upon which a general-purpose
communications system (like ICQ) could be built.
|TMail (Tom's E-Mail
|A lightweight scalable POP3/SMTP email client. Resides in the system
tray. Several options for notification of new email, including flashing the scroll lock
light and optional text-to-speech reading of message senders and subjects. Maintains list
of messages in memory - can optionally download message contents on-demand (when you read
the message). This allows the use of IMAP4-style message browsing with a POP3 server. You
can also reply to, forward, and send messages quickly. Basic support for decoding of
multipart MIME messages and quoted-printable encoding. Support for sending and receiving
attachments. Optional support for hierarchical mail folder system including Inbox, Sent,
and Trash folders. Powerful filter support, both automatic (on message receive) and
manual (when you hit F in a folder).
|Completed, usable. Updated rarely.
|Go to the TMail Home Page.
Actual download is a 100KB EXE.
|Adjustable Particle System
|An adjustable 2D particle system using DirectDraw. You can create and
configure various particle emitters and then run the system to see the results.
Created as an exercise in DirectDraw and Win32 GUI. Requires DirectX 6 or higher.
(67K, program executable) - screenshot
|Tom's IRC Client
|A graphical IRC (Internet Relay Chat) client. Capable of
text-to-speech - requires some speech files. Supports multiple
channel windows, DCC chat and file transfer. This was my first Windows program!
|Development abandoned - program is usable but somewhat buggy.
Speech files (required!)
DOS Programs: (most are best run in DOSBox
if using a modern PC)
|An Unreal music file (UMX) ripper for DOS. Extracts MOD, S3M,
XM, and IT modules from Unreal's UMX music file format. Allows wildcards, so usage
is simple: umxrip *.umx Supports future revisions of UMX, such as the
one used by Unreal Tournament. Version 2.0 was released in July of 1999.
|umxrip.zip (24K, ZIP file
containing program executable and C source code)
|Material Texture Map Creator (Stripes)
|A texture map design tool for awning fabric solid and stripe
patterns. Lets users recreate stripe patterns of awning fabric
in digital form, saving output to a text-based description file as well as
a BMP file for use as a texture map. This program was used to create texture maps for over 1500
industry-standard solid and stripe patterns.
|Completed. Ported to Win32 on 6/3/2001, which required two
search/replace operations and the addition of a single line of code.
|No download available - screenshot
|An action/real-time-strategy game for DOS. Supports client/server
multiplayer under Win95 with UDP/IP. See the Bapple
2 web page for more details.
|Development abandoned - program is usable but unfinished. Source code is
available - 500k of C source. Compiles with [DJGPP + Allegro] or [VC++ 5 +
WinAllegro WIP 2 or higher].
for binary and source downloads.
|A simple DNA 3D model generator/viewer for DOS. This was created as
an extra-credit project for a biology class. It generates a visual representation of a
small strand of DNA with valid codons. The double-helix is represented by a series of
points and the bonds are colored lines connecting them. You can rotate the DNA with the
mouse and change parameters of its construction (# of bonds, radius of double-helix,
|dna.zip (26K, program files
and source code) - screenshot
1, screenshot 2,
|July, 1995 (?)
|A vertical scrolling arcade-style shoot-em-up for DOS. Run this with
the -nosound parameter. Once you're in the game, try pressing everything. In particular,
hit G to get all of the guns, which looks neat.
|Development abandoned - it's kind of playable though.
program files) - screenshot
- download currently unavailable
program source code)
|April, 1995 (?)
|A graphical demonstration and advertisement for a local BBS.
Contains several effects including fading, plasma, 3D object scaling and
rotation, wave patterns, palette cycling, column mosaic transition, and a
short looping soundtrack sure to drive you mad after the first loop or
two. Supports Sound Blaster and Gravis Ultrasound. This
program runs beautifully using DOSBox.
|Completed. Made its way to Channel 1, where it resides
to this day.
|wizintro.zip (105K, program
|February, 1995 (?)
|A real-time strategy game for DOS. This was inspired by Warcraft,
Dune 2, and Ultima 6. It's a strange top-down view tile-based real-time strategy game. You
can control units and order them to move around and attack other units or buildings. If
you run the program, be sure to hit D to display the map. Try selecting the buildings
towards the center of the map and creating some units.
|Development abandoned - you can do a few things with it though.
|bapple.zip (838K, program
files) - download currently unavailable
|January, 1995 (?)
|A Mandelbrot/Julia fractal renderer for DOS. This program evolved to
become interactive. The basic Mandelbrot or Julia set is rendered, then you can select a
region with the mouse to zoom in on. 256-color Mode-X and SVGA video modes up to 1024x768
are supported. Palette rotation allows animation of the fractal's colors and a wide
variety of color maps are included. Upon finding a scene that you like, you can save a
"fractal snapshot" (scene description in text format) to snapshot.txt by hitting
S. Then you can edit the file and change parameters (like rendering resolution). Rendering
zooming animations is also possible. A clone of TurboVision (Borland's text-mode GUI) was
constructed to make the program a bit easier to run. Through analysis of the iterative
fractal algorithm, I made the program faster by having it start with low-detail (low # of
max iterations) rendering and move up until it detected that not too many pixels were
being added anymore. This resulted in very little time being wasted on those evil black
pixels. The implementation of this was pretty cool and it made my program faster than most
of the other fractal programs I had seen at the time (but it doesn't compare to anything
serious like Xaos, heh).
If you run the program, I suggest using the default Mode-X
resolution of 360x360 - just hit Alt-F, right-arrow key, and hit Enter to choose Render.
Then use the mouse to pick a region to zoom in on. Left-click zooms in, right-drag resizes
the zoom window. R picks a random color map. Look at render.log afterwards for some
interesting data. Also, if you run the program with a filename as its argument, it will
process that file. Depending on the file it could render an image to the screen and let
you play with it, render a still image to disk (as a PCX file), render a series of PCX
files that animate from one scene to another, or display a saved PCX file in a
screen-saver mode. The program supports wildcards, so you could run it like this: newfrac
|Completed, usable but no documentation. (I thought I'd written some but I can't find
it!) The GUI is somewhat unstable and the SVGA support has not aged well.
|A single-player MUD simulation, or mini-MUD, for DOS. This project
was much larger than anything I had ever done before: 55K of C source code, and I worked
on it off-and-on over the course of a year or so. If you're not familiar with MUDs, think
of them as online multiplayer text adventure games. This program recreates most of the
city of Midgaard from JediMUD and lets you walk around. Features include a working
inventory system, equippable items, a few mobs (NPCs) that wander around, room data stored
in text files, a help system (haha), ANSI color, and a bunch of misc MUD commands.
|Development abandoned - you can walk around and explore the city, but that's about it.
|tommud.zip (75K, program
files and source code)
|Sometime in 1990
|A colorful graphics display for DOS. This is one of my oldest
programs and was pretty cool for its time. Expanding and contracting circles bounce around
the screen leaving colorful paths behind. Runs in 640x350x16-color EGA, though you can
choose the background color from a palette of 64 colors. The program still runs perfectly
(just a bit fast) after 10 years, even under Windows NT and 2000! It
might crash on Windows XP, however...
program executable) - screenshot
- 2008: Visual Studio 2008
- 2005: C# with Visual Studio .NET 2003 and Visual Studio 2005
- 2001: Studied Scheme (dialect of Lisp) for CMPSCI
- 1999: Studied assembly language (X16) and CPU microcode for CMPSCI 201
- 1999: Began learning Visual Basic (with VB 6.0 SP3) for work (Direct3D Retained Mode stuff)
- 1999: Studied Java (with the Sun JDK 1.2) for CMPSCI 187
- 1998: Visual C++ 6.0 (32-bit Windows GUI)
- 1997: DJGPP 2.01 (32-bit DOS), Visual C++
5.0 (32-bit Windows console)
- 1996: Visual C++ 4.2 (32-bit Windows console)
- 1995: Began learning Pascal for high school Computer Science... on an ancient DG mainframe! (RIP)
- 1994: Borland C/C++ 3.1 (16-bit DOS)
- 1992: Began learning C with Rational Systems'
(now Tenberry Software) InstantC (16-bit DOS)
- 1989: QuickBASIC 3.x, 4.2
- ~1987: GWBASIC on an IBM XT clone
- ~1985: Began learning BASIC on the Commodore VIC-20
Back to Tom's Home Page