32 jassert (value >= 0 && value <= 127);
34 auto valueAs14Bit = value <= 64 ? value << 7
35 : int (jmap<float> (
float (value - 64), 0.0f, 63.0f, 0.0f, 8191.0f)) + 8192;
37 return { valueAs14Bit };
42 jassert (value >= 0 && value <= 16383);
53 return normalisedValue >> 7;
58 return normalisedValue;
64 return (normalisedValue < 8192)
65 ? jmap<float> (
float (normalisedValue), 0.0f, 8192.0f, -1.0f, 0.0f)
66 : jmap<float> (
float (normalisedValue), 8192.0f, 16383.0f, 0.0f, 1.0f);
71 return jmap<float> (
float (normalisedValue), 0.0f, 16383.0f, 0.0f, 1.0f);
77 return normalisedValue == other.normalisedValue;
82 return ! operator== (other);
92 MPEValueTests() :
UnitTest (
"MPEValue class",
"MIDI/MPE") {}
94 void runTest()
override
96 beginTest (
"comparison operator");
98 MPEValue value1 = MPEValue::from7BitInt (7);
99 MPEValue value2 = MPEValue::from7BitInt (7);
100 MPEValue value3 = MPEValue::from7BitInt (8);
102 expect (value1 == value1);
103 expect (value1 == value2);
104 expect (value1 != value3);
107 beginTest (
"special values");
109 expectEquals (MPEValue::minValue().as7BitInt(), 0);
110 expectEquals (MPEValue::minValue().as14BitInt(), 0);
112 expectEquals (MPEValue::centreValue().as7BitInt(), 64);
113 expectEquals (MPEValue::centreValue().as14BitInt(), 8192);
115 expectEquals (MPEValue::maxValue().as7BitInt(), 127);
116 expectEquals (MPEValue::maxValue().as14BitInt(), 16383);
119 beginTest (
"zero/minimum value");
121 expectValuesConsistent (MPEValue::from7BitInt (0), 0, 0, -1.0f, 0.0f);
122 expectValuesConsistent (MPEValue::from14BitInt (0), 0, 0, -1.0f, 0.0f);
125 beginTest (
"maximum value");
127 expectValuesConsistent (MPEValue::from7BitInt (127), 127, 16383, 1.0f, 1.0f);
128 expectValuesConsistent (MPEValue::from14BitInt (16383), 127, 16383, 1.0f, 1.0f);
131 beginTest (
"centre value");
133 expectValuesConsistent (MPEValue::from7BitInt (64), 64, 8192, 0.0f, 0.5f);
134 expectValuesConsistent (MPEValue::from14BitInt (8192), 64, 8192, 0.0f, 0.5f);
137 beginTest (
"value halfway between min and centre");
139 expectValuesConsistent (MPEValue::from7BitInt (32), 32, 4096, -0.5f, 0.25f);
140 expectValuesConsistent (MPEValue::from14BitInt (4096), 32, 4096, -0.5f, 0.25f);
146 void expectValuesConsistent (MPEValue value,
147 int expectedValueAs7BitInt,
148 int expectedValueAs14BitInt,
149 float expectedValueAsSignedFloat,
150 float expectedValueAsUnsignedFloat)
152 expectEquals (value.as7BitInt(), expectedValueAs7BitInt);
153 expectEquals (value.as14BitInt(), expectedValueAs14BitInt);
154 expectFloatWithinRelativeError (value.asSignedFloat(), expectedValueAsSignedFloat, 0.0001f);
155 expectFloatWithinRelativeError (value.asUnsignedFloat(), expectedValueAsUnsignedFloat, 0.0001f);
159 void expectFloatWithinRelativeError (
float actualValue,
float expectedValue,
float maxRelativeError)
161 const float maxAbsoluteError = jmax (1.0f, std::abs (expectedValue)) * maxRelativeError;
162 expect (std::abs (expectedValue - actualValue) < maxAbsoluteError);
166static MPEValueTests MPEValueUnitTests;
This class represents a single value for any of the MPE dimensions of control.
float asSignedFloat() const noexcept
Retrieves the current value mapped to a float between -1.0f and 1.0f.
static MPEValue maxValue() noexcept
Constructs an MPEValue corresponding to the maximum value.
static MPEValue centreValue() noexcept
Constructs an MPEValue corresponding to the centre value.
static MPEValue from14BitInt(int value) noexcept
Constructs an MPEValue from an integer between 0 and 16383 (using 14-bit precision).
bool operator==(const MPEValue &other) const noexcept
Returns true if two values are equal.
static MPEValue minValue() noexcept
Constructs an MPEValue corresponding to the minimum value.
float asUnsignedFloat() const noexcept
Retrieves the current value mapped to a float between 0.0f and 1.0f.
MPEValue() noexcept
Default constructor.
int as7BitInt() const noexcept
Retrieves the current value as an integer between 0 and 127.
int as14BitInt() const noexcept
Retrieves the current value as an integer between 0 and 16383.
static MPEValue from7BitInt(int value) noexcept
Constructs an MPEValue from an integer between 0 and 127 (using 7-bit precision).
bool operator!=(const MPEValue &other) const noexcept
Returns true if two values are not equal.
This is a base class for classes that perform a unit test.