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
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.
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!
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.