Personal Projects



Language: C++

Midithor is a music notation application that can output MIDI (.mid) files. It supports keys, meters, clefs, instrumentation, dynamics, note durations, triplets, dots, sharps/flats, octaves, and drums. I created this program because I was sick of the lack of user friendliness in all other notation programs I had tried. With my program, it's very simple to place a note: Simply click on the symbols corresponding to your desired note, then click on the staff to place it. Right click to erase notes for a rest. Tracks can be added simply by clicking beyond the last track, and track properties are accessed simply by clicking on the key signature. Note symbols can be clicked once for a single placement, or twice for permanent placement until they are clicked off. All note symbols have hotkeys easily accessed by the left hand on the keyboard.

Midithor also allows you to play back the song you are working on with your computer's default MIDI device, starting at the beginning of the view. The view can be moved using the left/right arrow keys, page up and page down, home, and end.

You can save your work to a .mth file (my own file format) to keep working on it later, or output it to a .mid file (MIDI music file) so all your friends can hear the song you have written! Here are some example files that I created using Midithor:
Burn Bobonga.mid
Burn Bobonga.mth
Memories of Green.mid
Memories of Green.mth
The original songs Burn Bobonga and Memories of Green are from the game Chrono Trigger which is © Squaresoft.

This program was written in C++ using Windows API. It was a great project for learning about the MIDI file format, calling the Windows MIDI playback drivers, clean class design, and GUI design.






Surface is a map that I created for Natural Selection, which is a mod of Valve's Half-Life. It was created in Valve's Hammer Editor. You will need to have Natural Selection installed to play it, although it was created during version 1.1 and probably won't work in the most recent version of the game.

Most Natural Selection maps at the time were in blocky, grey, claustrophobic spaceship interiors. The game is alien versus marine, and in the version I played, marines would constantly lose, as their ranged weapons were rendered useless when aliens suddenly appeared around a corner three feet away. In my map, there are many more large open spaces. This ended up also being a hindrance to the poor marines, since they are slower than the aliens and couldn't secure critical points as quickly.

I did a lot of unique things in this map. In Natural Selection, players spawn in the ready room, which is an actual modeled room where they can enter different doors in order to choose to play as aliens, as marines, join a randon team, or spectate. My ready room was an adventure in itself. To join marines, you would enter the marine ship. To join aliens, you would climb out a tube into a rocky area and enter a cave. To join random, you would jump out a broken window. To spectate, you would take the platform elevator up to the observation deck. No other ready rooms I had seen were so elaborate.

One of the alien hives was named "Big Gun." The aliens had infested a giant gun that was left over from the previous marine presence. In order to assault the hive, marines would have to climb down the barrel. I had a complex system of triggers set up so that if an alien was defending, he could press the button to cause the gun to fire, sending the marine flying across the level, likely to his death.

While this map did not become an official Natural Selection map and was scorned by some due to its unusual game play, I am very proud of its design, detail, and uniqueness, especially coming from a non-artist. This project helped build my awareness of 3D modeling issues.

DigiPen Class Projects

Robotic Intelligence AI Project


Team size: 2
Language: Lua and C++
Article: Lua and AI.doc

This program is the final project I did with one teammate for our Robotic Intelligence AI class. Our goal was to determine the usefulness of the scripting language Lua as it applies to game AI. In the program, the character must fulfill his three desires: hunger, thirst, and sleepiness. Each desire can be satisfied in two ways: a limitless source that fills the desire over time, or a one-time-use source that partly replenishes the desire instantaneously. Hunger can be satisfied with the fridge or a hamburger, thirst can be satisfied with the sink or a glass of water, and sleepiness can be satisfied with the bed or a cup of coffee. The desire for water increases faster than the desire for food, which increases faster than the desire for sleep.

The character employs a subsumption architecture to determine its actions. At the highest layer, the character determines which desire to fulfill. A high desire will overrule a lesser one, but the character is disinclined to switch goals unless the difference between them is great enough. Once a target desire is decided, the middle layer of the AI (pathfinding) locates the closest object that will fulfill that desire. It then builds a path to the goal using the A* pathfinding algorithm to avoid walls. Finally, the lowest layer of the AI instructs the character to move in the direction of the first element of the built path. This process repeats at every new tile the character enters.

All of the AI for the project was scripted in Lua. Only the graphical display and user interface were coded in C++. We found using Lua to be quite well suited to this application. We noticed no impact to the performance of the program, even when running a non-optimized A* algorithm completely in Lua. Our development speed was quick due to the fact that the script did not have to be recompiled to test changes. Lua's pseudo-code-like syntax made programming the AI behaviors simple and enjoyable. It was fairly straightforward to integrate Lua calls into the C++ engine. The downside to using Lua was that simple type or syntax errors that a strongly typed, compiled language such as C++ would catch were ignored by Lua, making debugging slightly more difficult.

We wrote an article to accompany our program that describes the project in greater detail. It can be read by clicking the link at the top of this section.

Our professor named our project one of the best in the class and gave us extra credit for it!

Linear Differential Equation Visualizer


Language: C#

This application allows you to input the coefficients to a system of linear differential equations and view the resulting slope field. The program analyzes the position of the coefficient matrix on the trace-determinant plane to determine the qualitative behavior of the system (source, sink, center, saddle, etc.). You can also change the coefficients of the harmonic oscillator equation (used in many physics applications such as springs), which will translate into the coefficient matrix, treating the X-axis as position and the Y-axis as velocity.

The coolest feature of this program is the ability to move the slider bars which allow you to slowly change a coefficient of the harmonic oscillator equation and watch the slope field change in real time. This allows you to quickly visualize the effects of different values and see the bifurcation points.

This project was done as an extra project for my Differential Equations class. The class was three credits and my schedule required me to earn four, so my professor allowed me to do this project to earn the extra credit. I used the opportunity to learn a new language: C#. The language was no trouble to pick up, since it is very similar to C++, and made developing the user interface a breeze.