Quote:


NOTE ON and NOTE OFF Commands

By far the most common command blocks are the NOTE ON and NOTE OFF commands. A NOTE ON command might contain the following hexadecimal byte sequence:

0x92 NOTE ON, Channel 2
0x3C Pitch = Middle C
0x40 Velocity = 0x40

The hexadecimal value 92 identifies a NOTE ON command for Channel 2. Next, hexadecimal data byte 3C is a pitch (frequency) value corresponding to Middle C on the piano. Notes are assigned integer pitch values, increasing with frequency. There are 12 intervals in an octave, so adding or subtracting 12 (decimal) to a sequence of pitch values would raise or lower the pitch by one octave.

The last byte value of 0x40 indicates a turn-on velocity of 64, decimal. Actually, many keyboards don't use the velocity value at all, but simply use a fixed turn-on and turn-off velocity.

Now let's look at the NOTE OFF command. A typical NOTE OFF command block might appear as:

0x81 NOTE OFF, Channel 1
0x3C Pitch = Middle C
0x40 Velocity = 0x40

Here the bytes represent a NOTE OFF status word on Channel 1, a note pitch of 0x3C (Middle C again), and a turn-off velocity of 0x40.

Implicit NOTE OFF commands

A special case of the NOTE ON command allows it to be interpreted as a NOTE OFF command. This is true whenever the velocity value is zero: a zero-velocity NOTE ON command always equals NOTE OFF for the indicated pitch value.





(emphasis added)

The latter case above is now the defacto method for most cases. For reasons already given, but look at it like this: All Note On data is leaner and meaner than interspersing the Note Off strings. It is faster and demands less state change events.

This also depends on the coding of the software you use to view the MIDI data, though. Some will imply the Note Off that really isn't there, kind of like a smart filtering or interpretation situation. It may be necessary to be able to look at the raw MIDI data in order to see the real.


--Mac