mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
MPEInstrument: Reset last received values when setting a new MPE zone layout
This commit is contained in:
parent
ae1f5541fc
commit
f59785606c
2 changed files with 32 additions and 8 deletions
|
|
@ -27,30 +27,33 @@ namespace
|
|||
{
|
||||
const uint8 noLSBValueReceived = 0xff;
|
||||
const Range<int> allChannels { 1, 17 };
|
||||
|
||||
template <typename Range, typename Value>
|
||||
void mpeInstrumentFill (Range& range, const Value& value)
|
||||
{
|
||||
std::fill (std::begin (range), std::end (range), value);
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
MPEInstrument::MPEInstrument() noexcept
|
||||
{
|
||||
std::fill_n (lastPressureLowerBitReceivedOnChannel, 16, noLSBValueReceived);
|
||||
std::fill_n (lastTimbreLowerBitReceivedOnChannel, 16, noLSBValueReceived);
|
||||
std::fill_n (isMemberChannelSustained, 16, false);
|
||||
mpeInstrumentFill (lastPressureLowerBitReceivedOnChannel, noLSBValueReceived);
|
||||
mpeInstrumentFill (lastTimbreLowerBitReceivedOnChannel, noLSBValueReceived);
|
||||
mpeInstrumentFill (isMemberChannelSustained, false);
|
||||
|
||||
pitchbendDimension.value = &MPENote::pitchbend;
|
||||
pressureDimension.value = &MPENote::pressure;
|
||||
timbreDimension.value = &MPENote::timbre;
|
||||
|
||||
// the default value for pressure is 0, for all other dimension it is centre (= default MPEValue)
|
||||
std::fill_n (pressureDimension.lastValueReceivedOnChannel, 16, MPEValue::minValue());
|
||||
resetLastReceivedValues();
|
||||
|
||||
legacyMode.isEnabled = false;
|
||||
legacyMode.pitchbendRange = 2;
|
||||
legacyMode.channelRange = allChannels;
|
||||
}
|
||||
|
||||
MPEInstrument::~MPEInstrument()
|
||||
{
|
||||
}
|
||||
MPEInstrument::~MPEInstrument() = default;
|
||||
|
||||
//==============================================================================
|
||||
MPEZoneLayout MPEInstrument::getZoneLayout() const noexcept
|
||||
|
|
@ -58,6 +61,23 @@ MPEZoneLayout MPEInstrument::getZoneLayout() const noexcept
|
|||
return zoneLayout;
|
||||
}
|
||||
|
||||
void MPEInstrument::resetLastReceivedValues()
|
||||
{
|
||||
struct Defaults
|
||||
{
|
||||
MPEDimension& dimension;
|
||||
MPEValue defaultValue;
|
||||
};
|
||||
|
||||
// The default value for pressure is 0, for all other dimensions it is centre
|
||||
for (const auto& pair : { Defaults { pressureDimension, MPEValue::minValue() },
|
||||
Defaults { pitchbendDimension, MPEValue::centreValue() },
|
||||
Defaults { timbreDimension, MPEValue::centreValue() } })
|
||||
{
|
||||
mpeInstrumentFill (pair.dimension.lastValueReceivedOnChannel, pair.defaultValue);
|
||||
}
|
||||
}
|
||||
|
||||
void MPEInstrument::setZoneLayout (MPEZoneLayout newLayout)
|
||||
{
|
||||
releaseAllNotes();
|
||||
|
|
@ -65,6 +85,8 @@ void MPEInstrument::setZoneLayout (MPEZoneLayout newLayout)
|
|||
const ScopedLock sl (lock);
|
||||
legacyMode.isEnabled = false;
|
||||
zoneLayout = newLayout;
|
||||
|
||||
resetLastReceivedValues();
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
|
|||
|
|
@ -376,6 +376,8 @@ private:
|
|||
LegacyMode legacyMode;
|
||||
MPEDimension pitchbendDimension, pressureDimension, timbreDimension;
|
||||
|
||||
void resetLastReceivedValues();
|
||||
|
||||
void updateDimension (int midiChannel, MPEDimension&, MPEValue);
|
||||
void updateDimensionMaster (bool, MPEDimension&, MPEValue);
|
||||
void updateDimensionForNote (MPENote&, MPEDimension&, MPEValue);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue