Clamp the various values for good measure
This commit is contained in:
parent
342f1b13d8
commit
2c8a286e37
2 changed files with 12 additions and 10 deletions
|
|
@ -90,9 +90,11 @@ namespace Default
|
||||||
constexpr Range<float> volumeCCRange { -144.0, 48.0 };
|
constexpr Range<float> volumeCCRange { -144.0, 48.0 };
|
||||||
constexpr float amplitude { 100.0 };
|
constexpr float amplitude { 100.0 };
|
||||||
constexpr Range<float> amplitudeRange { 0.0, 100.0 };
|
constexpr Range<float> amplitudeRange { 0.0, 100.0 };
|
||||||
|
constexpr Range<float> normalizedRange { 0.0, 1.0 };
|
||||||
constexpr float pan { 0.0 };
|
constexpr float pan { 0.0 };
|
||||||
constexpr Range<float> panRange { -100.0, 100.0 };
|
constexpr Range<float> panRange { -100.0, 100.0 };
|
||||||
constexpr Range<float> panCCRange { -200.0, 200.0 };
|
constexpr Range<float> panCCRange { -200.0, 200.0 };
|
||||||
|
constexpr Range<float> symmetricNormalizedRange { -1.0, 1.0 };
|
||||||
constexpr float position { 0.0 };
|
constexpr float position { 0.0 };
|
||||||
constexpr Range<float> positionRange { -100.0, 100.0 };
|
constexpr Range<float> positionRange { -100.0, 100.0 };
|
||||||
constexpr Range<float> positionCCRange { -200.0, 200.0 };
|
constexpr Range<float> positionCCRange { -200.0, 200.0 };
|
||||||
|
|
|
||||||
|
|
@ -73,25 +73,25 @@ void sfz::Voice::startVoice(Region* region, int delay, int number, uint8_t value
|
||||||
float gain { baseGain };
|
float gain { baseGain };
|
||||||
if (region->amplitudeCC)
|
if (region->amplitudeCC)
|
||||||
gain *= normalizeCC(midiState.getCCValue(region->amplitudeCC->first)) * normalizePercents(region->amplitudeCC->second);
|
gain *= normalizeCC(midiState.getCCValue(region->amplitudeCC->first)) * normalizePercents(region->amplitudeCC->second);
|
||||||
amplitudeEnvelope.reset(gain);
|
amplitudeEnvelope.reset(Default::normalizedRange.clamp(gain));
|
||||||
|
|
||||||
basePan = normalizeNegativePercents(region->pan);
|
basePan = normalizeNegativePercents(region->pan);
|
||||||
auto pan { basePan };
|
auto pan { basePan };
|
||||||
if (region->panCC)
|
if (region->panCC)
|
||||||
pan += normalizeCC(midiState.getCCValue(region->panCC->first)) * normalizeNegativePercents(region->panCC->second);
|
pan += normalizeCC(midiState.getCCValue(region->panCC->first)) * normalizeNegativePercents(region->panCC->second);
|
||||||
panEnvelope.reset(pan);
|
panEnvelope.reset(Default::symmetricNormalizedRange.clamp(pan));
|
||||||
|
|
||||||
basePosition = normalizeNegativePercents(region->position);
|
basePosition = normalizeNegativePercents(region->position);
|
||||||
auto position { basePosition };
|
auto position { basePosition };
|
||||||
if (region->positionCC)
|
if (region->positionCC)
|
||||||
position += normalizeCC(midiState.getCCValue(region->positionCC->first)) * normalizeNegativePercents(region->positionCC->second);
|
position += normalizeCC(midiState.getCCValue(region->positionCC->first)) * normalizeNegativePercents(region->positionCC->second);
|
||||||
positionEnvelope.reset(position);
|
positionEnvelope.reset(Default::symmetricNormalizedRange.clamp(position));
|
||||||
|
|
||||||
baseWidth = normalizeNegativePercents(region->width);
|
baseWidth = normalizeNegativePercents(region->width);
|
||||||
auto width { baseWidth };
|
auto width { baseWidth };
|
||||||
if (region->widthCC)
|
if (region->widthCC)
|
||||||
width += normalizeCC(midiState.getCCValue(region->widthCC->first)) * normalizeNegativePercents(region->widthCC->second);
|
width += normalizeCC(midiState.getCCValue(region->widthCC->first)) * normalizeNegativePercents(region->widthCC->second);
|
||||||
widthEnvelope.reset(width);
|
widthEnvelope.reset(Default::symmetricNormalizedRange.clamp(width));
|
||||||
|
|
||||||
pitchBendEnvelope.setFunction([region](float pitchValue){
|
pitchBendEnvelope.setFunction([region](float pitchValue){
|
||||||
const auto normalizedBend = normalizeBend(pitchValue);
|
const auto normalizedBend = normalizeBend(pitchValue);
|
||||||
|
|
@ -180,27 +180,27 @@ void sfz::Voice::registerCC(int delay, int ccNumber, uint8_t ccValue) noexcept
|
||||||
// TODO: gain-type events at time 0 may trigger sharp discontinuities; maybe add a minimum delay?
|
// TODO: gain-type events at time 0 may trigger sharp discontinuities; maybe add a minimum delay?
|
||||||
if (region->amplitudeCC && ccNumber == region->amplitudeCC->first) {
|
if (region->amplitudeCC && ccNumber == region->amplitudeCC->first) {
|
||||||
const float newGain { baseGain * normalizeCC(ccValue) * normalizePercents(region->amplitudeCC->second) };
|
const float newGain { baseGain * normalizeCC(ccValue) * normalizePercents(region->amplitudeCC->second) };
|
||||||
amplitudeEnvelope.registerEvent(delay, newGain);
|
amplitudeEnvelope.registerEvent(delay, Default::normalizedRange.clamp(newGain));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (region->volumeCC && ccNumber == region->volumeCC->first) {
|
if (region->volumeCC && ccNumber == region->volumeCC->first) {
|
||||||
const float newVolumedB { Default::volumeRange.clamp(baseVolumedB + normalizeCC(ccValue) * region->volumeCC->second) };
|
const float newVolumedB { baseVolumedB + normalizeCC(ccValue) * region->volumeCC->second };
|
||||||
volumeEnvelope.registerEvent(delay, db2mag(newVolumedB));
|
volumeEnvelope.registerEvent(delay, db2mag(Default::volumeRange.clamp(newVolumedB)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (region->panCC && ccNumber == region->panCC->first) {
|
if (region->panCC && ccNumber == region->panCC->first) {
|
||||||
const float newPan { basePan + normalizeCC(ccValue) * normalizeNegativePercents(region->panCC->second) };
|
const float newPan { basePan + normalizeCC(ccValue) * normalizeNegativePercents(region->panCC->second) };
|
||||||
panEnvelope.registerEvent(delay, newPan);
|
panEnvelope.registerEvent(delay, Default::symmetricNormalizedRange.clamp(newPan));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (region->positionCC && ccNumber == region->positionCC->first) {
|
if (region->positionCC && ccNumber == region->positionCC->first) {
|
||||||
const float newPosition { basePosition + normalizeCC(ccValue) * normalizeNegativePercents(region->positionCC->second) };
|
const float newPosition { basePosition + normalizeCC(ccValue) * normalizeNegativePercents(region->positionCC->second) };
|
||||||
positionEnvelope.registerEvent(delay, newPosition);
|
positionEnvelope.registerEvent(delay, Default::symmetricNormalizedRange.clamp(newPosition));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (region->widthCC && ccNumber == region->widthCC->first) {
|
if (region->widthCC && ccNumber == region->widthCC->first) {
|
||||||
const float newWidth { baseWidth + normalizeCC(ccValue) * normalizeNegativePercents(region->widthCC->second) };
|
const float newWidth { baseWidth + normalizeCC(ccValue) * normalizeNegativePercents(region->widthCC->second) };
|
||||||
widthEnvelope.registerEvent(delay, newWidth);
|
widthEnvelope.registerEvent(delay, Default::symmetricNormalizedRange.clamp(newWidth));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue