SYSEX DOCUMENTATION FOR VELOCITY CURVES
The Model X has three velocity tables in memory which can be programmed via SysEx.
A velocity table consists of two sets of four ordered pairs, where each pair is a time (Uint32, microseconds)
followed by a MIDI velocity (Uint16, range 1 to 127). The time number represents the time between make/
break switches when moving a key, where shorter times correspond to higher velocity. Within each set of
four, the pairs are ordered from shortest time/highest velocity rst, to longest time/lowest velocity last.
Each set of four time/velocity pairs denes four breakpoints on a velocity curve. The rst set is for the
white keys, and the second set is for the black keys (which have shorter time values associated with a given
velocity, due to differences in key geometry).
AN EXAMPLE TABLE
{{6000, 127}, {12500, 65}, {21000, 40}, {62000, 1}}, // white keys
{{3600, 127}, {10000, 60}, {18000, 35}, {52800, 1}} // black keys
Use the following data format to set a Velocity Curve via SysEx:
F0 04 15 aa 0A bb 00 cc (dd...) F7
aa = Device ID: 00 to 0A (must match hardware device ID), or 7F to address all devices.
bb = Command: 00 = get; 01 = set; 02 = restore (all) default curves.
cc = Curve number: 0 = soft, 1 = medium, 2 = hard.
(dd…) = curve data, 32 bytes. Include this section only if setting a new curve (bb = 1).
EXAMPLE 1
device ID 0, get data for curve 1 (medium).
F0 04 15 00 0A 00 00 01 F7
EXAMPLE 2
Device ID “all” (7F), set data for curve 2 (hard).
F0 04 15 7F 0A 01 00 02 00 27 08 7F 00 61 54 37 01 2F 64 1B 04 03 50 01 00 17 38 7F 00 4E 10
37 01 0C 50 1B 03 1C 40 01 F7
(bold text above = curve data)
CURVE DATA IN SYSEX FORMAT [32 BYTES]
{
t1w [3], v1w [1], t2w [3], v2w [1], t3w [3], v3w [1], t4w [3], v4w [1],
t1b [3], v1b [1], t2b [3], v2b [1], t3b [3], v3b [1], t4b [3], v4b [1]
}
Where t...w and v...w are time and velocity respectively for the white keys, and t...b and v...b are time and
velocity for the black keys.
[number in brackets = number of SysEx bytes per value]
Each “t” is three bytes encoding 21 data bits (unsigned integer, value represents microseconds), MSB
rst; max byte value 7F 7F 7F. When these three bytes are assembled into a time value the range is 1 to
0x1FFFFF.
Each “v” is one byte, value range 1 to 7F.
(time or velocity value 0 is not allowed)