ProjectMIDI Modular Approach
What I've realized (and the subject of a lot of programming books) is that since there is so much that one can do with MIDI, it becomes extremely important to break the programming up into more manageable pieces.
This is the main program. It is responsible for locating and loading all of the other pieces. These other pieces are implemented as .NET assemblies. The technical details of these assemblies, including instructions for creating new assemblies, is located in the developer pages.
The Ink assembly allows writing on top of the displayed sheet music using a tablet PC's stylus. This requires Windows XP Tablet PC Edition. This is a really great way to annotate and mark up your music for live performance.
MIDI Device Assemblies
Support for a specific MIDI device is provided by a device assembly. The device assembly can implement whatever device specific functionality is desired. Typically it will contain a dialog to allow specific voices (patches) to be associated with specific songs and pages. Dialogs can be implemented to allow programming new voices. This of course depends on the capabilities of the particular device.
Input controls present on a MIDI device are named and identified to Project MIDI by the device assembly. These can then be connected by the user to appropriate actions.
Events and Actions Model
Each assembly publishes the events that it generates and the actions that it can respond to. This is done in a manner that does not require a prioriknowledge of other modules. ProjectMIDI then provides several mechanisms to connect events to actions.
Refer to the developer pages if you are interested in the technical details of how all this is implemented.