The Chroma CPU Plus (CC+): MIDI Velocity Mapsby David Clarke [21030085++] <firstname.lastname@example.org>
CPU Plus Firmware revision 217 adds support for user-defined MIDI velocity mapping. This is accomplished via small sysex files that can be sent to the CC+ to redefine the non-volatile custom map inside the unit.
The user can choose the desired MIDI Tx Velocity lookup table by going into the Configuration Interface [Set Split],  and selecting parameter 29 [P29].
The user has the following two choices:
- int = Internal CC+ velocity map (normal CC+ behaviour)
- CUSt = Custom (user-defined) velocity map
The first selection will choose the default internal CC+ MIDI velocity map - the one which is used for all CC+ units with version 216 or earlier firmware.
The second selection will chose a custom velocity map stored inside the Chroma by a user (sent via MIDI SYSEX).
To send a custom map to the Chroma, a MIDI SYSEX message like the following would be used:
F0 08 00 4B 59 7F 39 dd dd dd .... F7
where dd = 32 bytes, corresponding to the desired 32-position table for MIDI Tx values (from 0 to 127)
You can also request the current custom map to be sent back to you from the CC+ you via SYSEX. That would be done with a MIDI Tx Velocity lookup table dump request, as below:
F0 08 00 4B 59 00 39 F7
The user specifies what their desired mapping is between the Chroma's internal 32-levels of velocity and what corresponding MIDI velocity they would like the CC+ to generate for that.
For instance, the default mapping table is shown below:
|Chroma Velocity||MIDI Velocity|
The Chroma will always attempt to automatically create an inverse mapping table and store that for lookup purposes, to help ensure that the Chroma will respond appropriately when recorded velocity is sent back to it. The Inverse table is created when a new Custom Velocity Transmit table is received via SYSEX.
In order to ensure that the reverse mapping is able to be deterministic, the specified MIDI velocity values should be unique. If they are not unique, then you won't necessarily get a 1:1 mapping in both directions.
For instance, consider if a user was to create a MIDI Tx mapping that had a MIDI velocity of 127 for Chroma Velocity 24, 25 and 26, as below:
|Chroma Velocity||MIDI Velocity|
If you then attempt to create a reverse mapping (e.g., what Chroma Velocity should be created for a given MIDI Velocity), then as you can see, a MIDI velocity of 127 could only produce one of those Chroma Velocity values (24, 25 or 26).
To handle cases like this, the reverse mapping will also use the lowest Chroma value. In the case of the "127" MIDI velocity example above, that would mean a MIDI velocity of 127 would correspond to a Chroma velocity of 24.
To facilitate experimentation with this feature, a series of pre-created velocity mappings have been created and are available here.
The initial SYSEX files are as follows:
- default (a copy of the native CC+ mapping)
- linear/saturated curve (allow higher MIDI velocitys to more easily occur)
- convex curve (greater control over louder notes)
- concave curve (greater control over softer notes)
- experimental (non-uniform handling of velocity)
To use one of these, send the chosen SYSEX file to the Chroma, and set [Set Split], ; [P29] to CUSt.
If you wish to go back to the original mapping, select 'int' from [Set Split], ; [P29].
The last received custom map is remembered inside the CC+, and so the past custom map can be reselected at any time (without needing to send the SYSEX for it back to the CC+).
- A MIDI note velocity of 0 is a special case to also mean "Note off" - and so for expected behaviour, you likely want to avoid using that value in the mapping table.
- Before concluding that the velocity response of your keyboard needs to be corrected, please ensure that the Damper Bar and Stack Switch Adjustments are performed, as these can affect velocity performance:
- No 'default custom' map is programmed into the firmware - so one will need to be loaded via SYSEX to prior to initial use of the Custom mapping feature.
A copy of the native CC+ mapping.
This map allows higher MIDI velocities to occur more easily.
Provides greater control over louder notes.
Provides greater control over softer notes.
Non-uniform handling of velocity.