- // MIDI control function information. A MIDI control function may have one
- // or two assigned control numbers depending on whether it supports coarse
- // (7-bit) or fine (14-bit) resolution. If the control function supports
- // fine resolution, the first (respectively, second) member of the structure
- // represents the control number for setting the most (least) significant 7
- // bits of the control function's value.
- struct Control_function
- {
- int msb_control_number_;
- int lsb_control_number_;
- };
-
- // Mapping from supported control functions (enumeration values defined in
- // Audio_controller_value_change::Control) to the corresponding MIDI control
- // numbers.
- static const Control_function control_functions[] =
- {
- // When adding support for new control functions, please note the
- // following:
- // - The order of the control number definitions should be kept
- // consistent with the order of the enumeration values defined in
- // Audio_control_function_value_change::Control.
- // - If the control function has only coarse resolution, the function's
- // control number should be stored in the MSB member of the array
- // element, and the LSB member should be set to a negative value.
-
- { 8, 40 }, // balance
- { 10, 42 }, // pan position
- { 11, 43 }, // expression
- { 91, -1 }, // reverb level (only coarse resolution available)
- { 93, -1 } // chorus level (only coarse resolution available)
- };
-
- string str;
- const Control_function *control_function = &control_functions[control_];
- static const Real full_fine_scale = 0x3FFF;
- static const Real full_coarse_scale = 0x7F;
- bool fine_resolution = (control_function->lsb_control_number_ >= 0);
- // value_ is in range [0.0 .. 1.0]. For directional value ranges,
- // #CENTER will correspond to 0.5 exactly, and my_round rounds
- // upwards when in case of doubt. That means that center position
- // will round to 0x40 or 0x2000 by a hair's breadth.
- int value = (int) my_round (value_ * (fine_resolution ?
- full_fine_scale : full_coarse_scale));