I've been working with Midi protocol for the past month or so. The links
I found to be very useful (and free) are as follows:
http://ccrma-www.stanford.edu/~craig/articles/linuxmidi/
(basic overview of midi programming in Linux)
http://www.borg.com/~jglatt/tech/midispec.htm
(midi protocol)
http://ccrma-www.stanford.edu/~craig/articles/linuxmidi/misc/essenmidi.h
tml
(another midi protocol)
As far as the standardization is concerned, only the messages with
status byte being 0xEF - 0xFF are reserved for vendor-specific stuff
(with a couple of exceptions). Everything else is status byte + 1 or 2
data bytes (i.e. note-on is 144 status byte (meaning note-on on channel
1), then pitch (0-127), and then velocity (0-127)). Status bytes are
generally persistent, so if you have a stream of note-ons on the same
channel only pitch and velocity values are sent, once the first status
byte has been invoked.
Beyond that, it is really rather simple linear protocol (albeit too
rudimentary).
OTOH, lately I've been messing with OSC and found out that it is much
more flexible. I think at least twp commercial apps support it as well,
one of them being Max (+ over a dozen oss apps, such as pd,
supercollider, etc.). See here for more info:
http://cnmat.cnmat.berkeley.edu/OSC/
So, this may be a path to pursue if one wants to attain greater
flexibility.
Hope this helps at least a bit.
Ico