From e4103600ec4dbc10d3e883582a5f670638172022 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Thu, 16 Apr 2020 14:08:11 +0200 Subject: [PATCH] Fix some numCC comparisons which are off by 1 --- src/sfizz/MidiState.cpp | 2 +- src/sfizz/Region.cpp | 64 ++++++++++++++++++++--------------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/sfizz/MidiState.cpp b/src/sfizz/MidiState.cpp index 0b932010..6f463020 100644 --- a/src/sfizz/MidiState.cpp +++ b/src/sfizz/MidiState.cpp @@ -155,7 +155,7 @@ void sfz::MidiState::resetAllControllers(int delay) noexcept const sfz::EventVector& sfz::MidiState::getCCEvents(int ccIdx) const noexcept { - if (ccIdx < 0 || ccIdx > config::numCCs) + if (ccIdx < 0 || ccIdx >= config::numCCs) return nullEvent; return cc[ccIdx]; diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index 501550da..99261839 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -184,13 +184,13 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) bendRange.setEnd(normalizeBend(*value)); break; case hash("locc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::midi7Range)) ccConditions[opcode.parameters.back()].setStart(normalizeCC(*value)); break; case hash("hicc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::midi7Range)) ccConditions[opcode.parameters.back()].setEnd(normalizeCC(*value)); @@ -285,14 +285,14 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) break; case hash("on_locc&"): // fallthrough case hash("start_locc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::midi7Range)) ccTriggers[opcode.parameters.back()].setStart(normalizeCC(*value)); break; case hash("on_hicc&"): // fallthrough case hash("start_hicc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::midi7Range)) ccTriggers[opcode.parameters.back()].setEnd(normalizeCC(*value)); @@ -303,19 +303,19 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) setValueFromOpcode(opcode, volume, Default::volumeRange); break; case hash("volume_curvecc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::curveCCRange)) volumeCC[opcode.parameters.back()].curve = *value; break; case hash("volume_stepcc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::volumeStepRange)) volumeCC[opcode.parameters.back()].step = *value; break; case hash("volume_smoothcc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::smoothCCRange)) volumeCC[opcode.parameters.back()].smooth = *value; @@ -323,7 +323,7 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) case hash("gain_cc&"): case hash("gain_oncc&"): // fallthrough case hash("volume_oncc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::volumeCCRange)) volumeCC[opcode.parameters.back()].value = *value; @@ -333,26 +333,26 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) amplitude = normalizePercents(*value); break; case hash("amplitude_curvecc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::curveCCRange)) amplitudeCC[opcode.parameters.back()].curve = *value; break; case hash("amplitude_stepcc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::amplitudeRange)) amplitudeCC[opcode.parameters.back()].step = normalizePercents(*value); break; case hash("amplitude_smoothcc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::smoothCCRange)) amplitudeCC[opcode.parameters.back()].smooth = *value; break; case hash("amplitude_cc&"): // fallthrough case hash("amplitude_oncc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::amplitudeRange)) amplitudeCC[opcode.parameters.back()].value = normalizePercents(*value); @@ -362,26 +362,26 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) pan = normalizePercents(*value); break; case hash("pan_curvecc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::curveCCRange)) panCC[opcode.parameters.back()].curve = *value; break; case hash("pan_stepcc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::panStepRange)) panCC[opcode.parameters.back()].step = normalizePercents(*value); break; case hash("pan_smoothcc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::smoothCCRange)) panCC[opcode.parameters.back()].smooth = *value; break; case hash("pan_cc&"): case hash("pan_oncc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::panCCRange)) panCC[opcode.parameters.back()].value = normalizePercents(*value); @@ -391,26 +391,26 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) position = normalizePercents(*value); break; case hash("position_curvecc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::curveCCRange)) positionCC[opcode.parameters.back()].curve = *value; break; case hash("position_stepcc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::positionStepRange)) positionCC[opcode.parameters.back()].step = normalizePercents(*value); break; case hash("position_smoothcc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::smoothCCRange)) positionCC[opcode.parameters.back()].smooth = *value; break; case hash("position_cc&"): // fallthrough case hash("position_oncc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::positionCCRange)) positionCC[opcode.parameters.back()].value = normalizePercents(*value); @@ -420,25 +420,25 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) width = normalizePercents(*value); break; case hash("width_curvecc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::curveCCRange)) widthCC[opcode.parameters.back()].curve = *value; break; case hash("width_stepcc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::widthStepRange)) widthCC[opcode.parameters.back()].step = normalizePercents(*value); break; case hash("width_smoothcc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::smoothCCRange)) widthCC[opcode.parameters.back()].smooth = *value; break; case hash("width_oncc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::widthCCRange)) widthCC[opcode.parameters.back()].value = normalizePercents(*value); @@ -518,25 +518,25 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) } break; case hash("xfin_locc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::midi7Range)) crossfadeCCInRange[opcode.parameters.back()].setStart(normalizeCC(*value)); break; case hash("xfin_hicc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::midi7Range)) crossfadeCCInRange[opcode.parameters.back()].setEnd(normalizeCC(*value)); break; case hash("xfout_locc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::midi7Range)) crossfadeCCOutRange[opcode.parameters.back()].setStart(normalizeCC(*value)); break; case hash("xfout_hicc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::midi7Range)) crossfadeCCOutRange[opcode.parameters.back()].setEnd(normalizeCC(*value)); @@ -824,21 +824,21 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) break; case hash("pitch_curvecc&"): // fallthrough case hash("tune_curvecc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::curveCCRange)) tuneCC[opcode.parameters.back()].curve = *value; break; case hash("pitch_stepcc&"): // fallthrough case hash("tune_stepcc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::tuneStepRange)) tuneCC[opcode.parameters.back()].step = *value; break; case hash("pitch_smoothcc&"): // fallthrough case hash("tune_smoothcc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::smoothCCRange)) tuneCC[opcode.parameters.back()].smooth = *value; @@ -847,7 +847,7 @@ bool sfz::Region::parseOpcode(const Opcode& opcode) case hash("tune_oncc&"): case hash("pitch_cc&"): case hash("pitch_oncc&"): - if (opcode.parameters.back() > config::numCCs) + if (opcode.parameters.back() >= config::numCCs) return false; if (auto value = readOpcode(opcode.value, Default::tuneCCRange)) tuneCC[opcode.parameters.back()].value = *value;