Moved the ccRange to a ccNumber and ccValue

This commit is contained in:
Paul Ferrand 2019-12-17 14:07:12 +01:00
parent 89bf38e35e
commit 4ea288a533
9 changed files with 27 additions and 20 deletions

View file

@ -49,6 +49,7 @@ namespace config {
constexpr float A440 { 440.0 }; constexpr float A440 { 440.0 };
constexpr unsigned powerHistoryLength { 16 }; constexpr unsigned powerHistoryLength { 16 };
constexpr float voiceStealingThreshold { 0.00001 }; constexpr float voiceStealingThreshold { 0.00001 };
constexpr int numCCs { 143 };
} // namespace config } // namespace config
// Enable or disable SIMD accelerators by default // Enable or disable SIMD accelerators by default

View file

@ -23,6 +23,7 @@
#pragma once #pragma once
#include "Range.h" #include "Range.h"
#include "Config.h"
#include <limits> #include <limits>
#include <cstdint> #include <cstdint>
@ -62,7 +63,8 @@ namespace Default
// Region logic: MIDI conditions // Region logic: MIDI conditions
constexpr Range<uint8_t> channelRange { 1, 16 }; constexpr Range<uint8_t> channelRange { 1, 16 };
constexpr Range<uint8_t> midiChannelRange { 0, 15 }; constexpr Range<uint8_t> midiChannelRange { 0, 15 };
constexpr Range<uint8_t> ccRange { 0, 127 }; constexpr Range<uint8_t> ccNumberRange { 0, config::numCCs };
constexpr Range<uint8_t> ccValueRange { 0, 127 };
constexpr uint8_t cc { 0 }; constexpr uint8_t cc { 0 };
constexpr Range<int> bendRange { -8192, 8192 }; constexpr Range<int> bendRange { -8192, 8192 };
constexpr int bend { 0 }; constexpr int bend { 0 };

View file

@ -58,7 +58,7 @@ int sfz::MidiState::getPitchBend(int channel) const noexcept
void sfz::MidiState::ccEvent(int channel, int ccNumber, uint8_t ccValue) noexcept void sfz::MidiState::ccEvent(int channel, int ccNumber, uint8_t ccValue) noexcept
{ {
ASSERT(channel >= 0 && channel < 16); ASSERT(channel >= 0 && channel < 16);
ASSERT(ccNumber >= 0 && ccNumber <= 142); ASSERT(ccNumber >= 0 && ccNumber < config::numCCs);
ASSERT(ccValue >= 0 && ccValue <= 127); ASSERT(ccValue >= 0 && ccValue <= 127);
cc[channel][ccNumber] = ccValue; cc[channel][ccNumber] = ccValue;
@ -67,7 +67,7 @@ void sfz::MidiState::ccEvent(int channel, int ccNumber, uint8_t ccValue) noexcep
uint8_t sfz::MidiState::getCCValue(int channel, int ccNumber) const noexcept uint8_t sfz::MidiState::getCCValue(int channel, int ccNumber) const noexcept
{ {
ASSERT(channel >= 0 && channel < 16); ASSERT(channel >= 0 && channel < 16);
ASSERT(ccNumber >= 0 && ccNumber <= 127); ASSERT(ccNumber >= 0 && ccNumber < config::numCCs);
return cc[channel][ccNumber]; return cc[channel][ccNumber];
} }

View file

@ -203,7 +203,7 @@ template <class ValueType>
inline void setCCPairFromOpcode(const Opcode& opcode, absl::optional<CCValuePair>& target, const Range<ValueType>& validRange) inline void setCCPairFromOpcode(const Opcode& opcode, absl::optional<CCValuePair>& target, const Range<ValueType>& validRange)
{ {
auto value = readOpcode(opcode.value, validRange); auto value = readOpcode(opcode.value, validRange);
if (value && opcode.parameter && Default::ccRange.containsWithEnd(*opcode.parameter)) if (value && opcode.parameter && Default::ccNumberRange.containsWithEnd(*opcode.parameter))
target = std::make_pair(*opcode.parameter, *value); target = std::make_pair(*opcode.parameter, *value);
else else
target = {}; target = {};

View file

@ -35,7 +35,7 @@
bool sfz::Region::parseOpcode(const Opcode& opcode) bool sfz::Region::parseOpcode(const Opcode& opcode)
{ {
// Check that the parameter is well formed // Check that the parameter is well formed
if (opcode.parameter && !sfz::Default::ccRange.containsWithEnd(*opcode.parameter)) { if (opcode.parameter && !sfz::Default::ccNumberRange.containsWithEnd(*opcode.parameter)) {
DBG("Wrong parameter value (" << std::to_string(*opcode.parameter) << ") for opcode " << opcode.opcode); DBG("Wrong parameter value (" << std::to_string(*opcode.parameter) << ") for opcode " << opcode.opcode);
return false; return false;
} }
@ -164,12 +164,12 @@ bool sfz::Region::parseOpcode(const Opcode& opcode)
break; break;
case hash("locc"): case hash("locc"):
if (opcode.parameter) { if (opcode.parameter) {
setRangeStartFromOpcode(opcode, ccConditions[*opcode.parameter], Default::ccRange); setRangeStartFromOpcode(opcode, ccConditions[*opcode.parameter], Default::ccValueRange);
} }
break; break;
case hash("hicc"): case hash("hicc"):
if (opcode.parameter) if (opcode.parameter)
setRangeEndFromOpcode(opcode, ccConditions[*opcode.parameter], Default::ccRange); setRangeEndFromOpcode(opcode, ccConditions[*opcode.parameter], Default::ccValueRange);
break; break;
case hash("sw_lokey"): case hash("sw_lokey"):
setRangeStartFromOpcode(opcode, keyswitchRange, Default::keyRange); setRangeStartFromOpcode(opcode, keyswitchRange, Default::keyRange);
@ -261,11 +261,11 @@ bool sfz::Region::parseOpcode(const Opcode& opcode)
break; break;
case hash("on_locc"): case hash("on_locc"):
if (opcode.parameter) if (opcode.parameter)
setRangeStartFromOpcode(opcode, ccTriggers[*opcode.parameter], Default::ccRange); setRangeStartFromOpcode(opcode, ccTriggers[*opcode.parameter], Default::ccTriggerValueRange);
break; break;
case hash("on_hicc"): case hash("on_hicc"):
if (opcode.parameter) if (opcode.parameter)
setRangeEndFromOpcode(opcode, ccTriggers[*opcode.parameter], Default::ccRange); setRangeEndFromOpcode(opcode, ccTriggers[*opcode.parameter], Default::ccTriggerValueRange);
break; break;
// Performance parameters: amplifier // Performance parameters: amplifier
@ -315,7 +315,7 @@ bool sfz::Region::parseOpcode(const Opcode& opcode)
volumeDistribution.param(std::uniform_real_distribution<float>::param_type(-ampRandom, ampRandom)); volumeDistribution.param(std::uniform_real_distribution<float>::param_type(-ampRandom, ampRandom));
break; break;
case hash("amp_velcurve_"): case hash("amp_velcurve_"):
if (opcode.parameter && Default::ccRange.containsWithEnd(*opcode.parameter)) { {
auto value = readOpcode(opcode.value, Default::ampVelcurveRange); auto value = readOpcode(opcode.value, Default::ampVelcurveRange);
if (value) if (value)
velocityPoints.emplace_back(*opcode.parameter, *value); velocityPoints.emplace_back(*opcode.parameter, *value);
@ -371,22 +371,22 @@ bool sfz::Region::parseOpcode(const Opcode& opcode)
break; break;
case hash("xfin_locc"): case hash("xfin_locc"):
if (opcode.parameter) { if (opcode.parameter) {
setRangeStartFromOpcode(opcode, crossfadeCCInRange[*opcode.parameter], Default::ccRange); setRangeStartFromOpcode(opcode, crossfadeCCInRange[*opcode.parameter], Default::ccValueRange);
} }
break; break;
case hash("xfin_hicc"): case hash("xfin_hicc"):
if (opcode.parameter) { if (opcode.parameter) {
setRangeEndFromOpcode(opcode, crossfadeCCInRange[*opcode.parameter], Default::velocityRange); setRangeEndFromOpcode(opcode, crossfadeCCInRange[*opcode.parameter], Default::ccValueRange);
} }
break; break;
case hash("xfout_locc"): case hash("xfout_locc"):
if (opcode.parameter) { if (opcode.parameter) {
setRangeStartFromOpcode(opcode, crossfadeCCOutRange[*opcode.parameter], Default::velocityRange); setRangeStartFromOpcode(opcode, crossfadeCCOutRange[*opcode.parameter], Default::ccValueRange);
} }
break; break;
case hash("xfout_hicc"): case hash("xfout_hicc"):
if (opcode.parameter) { if (opcode.parameter) {
setRangeEndFromOpcode(opcode, crossfadeCCOutRange[*opcode.parameter], Default::velocityRange); setRangeEndFromOpcode(opcode, crossfadeCCOutRange[*opcode.parameter], Default::ccValueRange);
} }
break; break;
case hash("xf_cccurve"): case hash("xf_cccurve"):

View file

@ -249,7 +249,7 @@ struct Region {
// Region logic: MIDI conditions // Region logic: MIDI conditions
Range<uint8_t> channelRange { Default::midiChannelRange }; //lochan and hichan Range<uint8_t> channelRange { Default::midiChannelRange }; //lochan and hichan
Range<int> bendRange { Default::bendRange }; // hibend and lobend Range<int> bendRange { Default::bendRange }; // hibend and lobend
CCMap<Range<uint8_t>> ccConditions { Default::ccRange }; CCMap<Range<uint8_t>> ccConditions { Default::ccValueRange };
Range<uint8_t> keyswitchRange { Default::keyRange }; // sw_hikey and sw_lokey Range<uint8_t> keyswitchRange { Default::keyRange }; // sw_hikey and sw_lokey
absl::optional<uint8_t> keyswitch {}; // sw_last absl::optional<uint8_t> keyswitch {}; // sw_last
absl::optional<uint8_t> keyswitchUp {}; // sw_up absl::optional<uint8_t> keyswitchUp {}; // sw_up

View file

@ -27,11 +27,12 @@
//#include <string> //#include <string>
#include <array> #include <array>
#include <cmath> #include <cmath>
#include "Config.h"
namespace sfz namespace sfz
{ {
using SfzCCArray = std::array<uint8_t, 142>; using SfzCCArray = std::array<uint8_t, config::numCCs>;
using CCValuePair = std::pair<uint8_t, float> ; using CCValuePair = std::pair<uint8_t, float> ;
using CCNamePair = std::pair<uint8_t, std::string>; using CCNamePair = std::pair<uint8_t, std::string>;

View file

@ -166,15 +166,16 @@ void sfz::Synth::handleControlOpcodes(const std::vector<Opcode>& members)
case hash("Set_cc"): case hash("Set_cc"):
[[fallthrough]]; [[fallthrough]];
case hash("set_cc"): case hash("set_cc"):
if (member.parameter && Default::ccRange.containsWithEnd(*member.parameter)){ if (member.parameter && Default::ccNumberRange.containsWithEnd(*member.parameter)) {
for (int channel=1; channel <=16; channel++) const auto ccValue = readOpcode(member.value, Default::ccValueRange).value_or(0);
midiState.ccEvent(channel, *member.parameter, readOpcode(member.value, Default::ccRange).value_or(0)); for (int channel = 0; channel < 16; channel++)
midiState.ccEvent(channel, *member.parameter, ccValue);
} }
break; break;
case hash("Label_cc"): case hash("Label_cc"):
[[fallthrough]]; [[fallthrough]];
case hash("label_cc"): case hash("label_cc"):
if (member.parameter && Default::ccRange.containsWithEnd(*member.parameter)) if (member.parameter && Default::ccNumberRange.containsWithEnd(*member.parameter))
ccNames.emplace_back(*member.parameter, member.value); ccNames.emplace_back(*member.parameter, member.value);
break; break;
case hash("Default_path"): case hash("Default_path"):

View file

@ -345,6 +345,8 @@ public:
* *
*/ */
void disableFreeWheeling() noexcept; void disableFreeWheeling() noexcept;
const MidiState& getMidiState() const noexcept { return midiState; }
protected: protected:
/** /**
* @brief The parser callback; this is called by the parent object each time * @brief The parser callback; this is called by the parent object each time