Support for the reset CC
This commit is contained in:
parent
b00103d342
commit
f2c6ac95a7
4 changed files with 51 additions and 3 deletions
|
|
@ -92,3 +92,13 @@ void sfz::MidiState::reset() noexcept
|
||||||
for (auto& bendValue: pitchBends)
|
for (auto& bendValue: pitchBends)
|
||||||
bendValue = 0;
|
bendValue = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sfz::MidiState::resetAllControllers(int channel) noexcept
|
||||||
|
{
|
||||||
|
ASSERT(channel >= 0 && channel < 16);
|
||||||
|
|
||||||
|
for (int idx = 0; idx < config::numCCs; idx++)
|
||||||
|
cc[channel][idx] = 0;
|
||||||
|
|
||||||
|
pitchBends[channel] = 0;
|
||||||
|
}
|
||||||
|
|
@ -90,6 +90,13 @@ public:
|
||||||
*/
|
*/
|
||||||
void reset() noexcept;
|
void reset() noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Res
|
||||||
|
*
|
||||||
|
* @param channel
|
||||||
|
*/
|
||||||
|
void resetAllControllers(int channel) noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template<class T>
|
template<class T>
|
||||||
using ChannelArray = std::array<T, 16>;
|
using ChannelArray = std::array<T, 16>;
|
||||||
|
|
|
||||||
|
|
@ -443,16 +443,19 @@ void sfz::Synth::cc(int delay, int channel, int ccNumber, uint8_t ccValue) noexc
|
||||||
ASSERT(ccNumber < config::numCCs);
|
ASSERT(ccNumber < config::numCCs);
|
||||||
ASSERT(ccNumber >= 0);
|
ASSERT(ccNumber >= 0);
|
||||||
|
|
||||||
|
|
||||||
AtomicGuard callbackGuard { inCallback };
|
AtomicGuard callbackGuard { inCallback };
|
||||||
if (!canEnterCallback)
|
if (!canEnterCallback)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (ccNumber == config::resetCC) {
|
||||||
|
resetAllControllers(delay, channel);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
midiState.ccEvent(channel, ccNumber, ccValue);
|
midiState.ccEvent(channel, ccNumber, ccValue);
|
||||||
for (auto& voice : voices)
|
for (auto& voice : voices)
|
||||||
voice->registerCC(delay, channel, ccNumber, ccValue);
|
voice->registerCC(delay, channel, ccNumber, ccValue);
|
||||||
|
|
||||||
|
|
||||||
for (auto& region : ccActivationLists[ccNumber]) {
|
for (auto& region : ccActivationLists[ccNumber]) {
|
||||||
if (region->registerCC(channel, ccNumber, ccValue)) {
|
if (region->registerCC(channel, ccNumber, ccValue)) {
|
||||||
auto voice = findFreeVoice();
|
auto voice = findFreeVoice();
|
||||||
|
|
@ -607,3 +610,22 @@ void sfz::Synth::disableFreeWheeling() noexcept
|
||||||
DBG("Disabling freewheeling");
|
DBG("Disabling freewheeling");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sfz::Synth::resetAllControllers(int delay, int channel) noexcept
|
||||||
|
{
|
||||||
|
AtomicGuard callbackGuard { inCallback };
|
||||||
|
if (!canEnterCallback)
|
||||||
|
return;
|
||||||
|
|
||||||
|
midiState.resetAllControllers(channel);
|
||||||
|
for (auto& voice: voices) {
|
||||||
|
voice->registerPitchWheel(delay, channel, 0);
|
||||||
|
for (int cc = 0; cc < config::numCCs; ++cc)
|
||||||
|
voice->registerCC(delay, channel, cc, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto& region: regions) {
|
||||||
|
for (int cc = 0; cc < config::numCCs; ++cc)
|
||||||
|
region->registerCC(channel, cc, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -359,6 +359,15 @@ protected:
|
||||||
void callback(absl::string_view header, const std::vector<Opcode>& members) final;
|
void callback(absl::string_view header, const std::vector<Opcode>& members) final;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/**
|
||||||
|
* @brief Reset all CCs; to be used on CC 121
|
||||||
|
*
|
||||||
|
* @param delay the delay for the controller reset
|
||||||
|
* @param channel the channel on which to reset the controller
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void resetAllControllers(int delay, int channel) noexcept;
|
||||||
|
|
||||||
int numGroups { 0 };
|
int numGroups { 0 };
|
||||||
int numMasters { 0 };
|
int numMasters { 0 };
|
||||||
int numCurves { 0 };
|
int numCurves { 0 };
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue