Moved the ccRange to a ccNumber and ccValue
This commit is contained in:
parent
89bf38e35e
commit
4ea288a533
9 changed files with 27 additions and 20 deletions
|
|
@ -49,6 +49,7 @@ namespace config {
|
|||
constexpr float A440 { 440.0 };
|
||||
constexpr unsigned powerHistoryLength { 16 };
|
||||
constexpr float voiceStealingThreshold { 0.00001 };
|
||||
constexpr int numCCs { 143 };
|
||||
} // namespace config
|
||||
|
||||
// Enable or disable SIMD accelerators by default
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
|
||||
#pragma once
|
||||
#include "Range.h"
|
||||
#include "Config.h"
|
||||
#include <limits>
|
||||
#include <cstdint>
|
||||
|
||||
|
|
@ -62,7 +63,8 @@ namespace Default
|
|||
// Region logic: MIDI conditions
|
||||
constexpr Range<uint8_t> channelRange { 1, 16 };
|
||||
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 Range<int> bendRange { -8192, 8192 };
|
||||
constexpr int bend { 0 };
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ int sfz::MidiState::getPitchBend(int channel) const noexcept
|
|||
void sfz::MidiState::ccEvent(int channel, int ccNumber, uint8_t ccValue) noexcept
|
||||
{
|
||||
ASSERT(channel >= 0 && channel < 16);
|
||||
ASSERT(ccNumber >= 0 && ccNumber <= 142);
|
||||
ASSERT(ccNumber >= 0 && ccNumber < config::numCCs);
|
||||
ASSERT(ccValue >= 0 && ccValue <= 127);
|
||||
|
||||
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
|
||||
{
|
||||
ASSERT(channel >= 0 && channel < 16);
|
||||
ASSERT(ccNumber >= 0 && ccNumber <= 127);
|
||||
ASSERT(ccNumber >= 0 && ccNumber < config::numCCs);
|
||||
|
||||
return cc[channel][ccNumber];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -203,7 +203,7 @@ template <class ValueType>
|
|||
inline void setCCPairFromOpcode(const Opcode& opcode, absl::optional<CCValuePair>& target, const Range<ValueType>& 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);
|
||||
else
|
||||
target = {};
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@
|
|||
bool sfz::Region::parseOpcode(const Opcode& opcode)
|
||||
{
|
||||
// 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);
|
||||
return false;
|
||||
}
|
||||
|
|
@ -164,12 +164,12 @@ bool sfz::Region::parseOpcode(const Opcode& opcode)
|
|||
break;
|
||||
case hash("locc"):
|
||||
if (opcode.parameter) {
|
||||
setRangeStartFromOpcode(opcode, ccConditions[*opcode.parameter], Default::ccRange);
|
||||
setRangeStartFromOpcode(opcode, ccConditions[*opcode.parameter], Default::ccValueRange);
|
||||
}
|
||||
break;
|
||||
case hash("hicc"):
|
||||
if (opcode.parameter)
|
||||
setRangeEndFromOpcode(opcode, ccConditions[*opcode.parameter], Default::ccRange);
|
||||
setRangeEndFromOpcode(opcode, ccConditions[*opcode.parameter], Default::ccValueRange);
|
||||
break;
|
||||
case hash("sw_lokey"):
|
||||
setRangeStartFromOpcode(opcode, keyswitchRange, Default::keyRange);
|
||||
|
|
@ -261,11 +261,11 @@ bool sfz::Region::parseOpcode(const Opcode& opcode)
|
|||
break;
|
||||
case hash("on_locc"):
|
||||
if (opcode.parameter)
|
||||
setRangeStartFromOpcode(opcode, ccTriggers[*opcode.parameter], Default::ccRange);
|
||||
setRangeStartFromOpcode(opcode, ccTriggers[*opcode.parameter], Default::ccTriggerValueRange);
|
||||
break;
|
||||
case hash("on_hicc"):
|
||||
if (opcode.parameter)
|
||||
setRangeEndFromOpcode(opcode, ccTriggers[*opcode.parameter], Default::ccRange);
|
||||
setRangeEndFromOpcode(opcode, ccTriggers[*opcode.parameter], Default::ccTriggerValueRange);
|
||||
break;
|
||||
|
||||
// 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));
|
||||
break;
|
||||
case hash("amp_velcurve_"):
|
||||
if (opcode.parameter && Default::ccRange.containsWithEnd(*opcode.parameter)) {
|
||||
{
|
||||
auto value = readOpcode(opcode.value, Default::ampVelcurveRange);
|
||||
if (value)
|
||||
velocityPoints.emplace_back(*opcode.parameter, *value);
|
||||
|
|
@ -371,22 +371,22 @@ bool sfz::Region::parseOpcode(const Opcode& opcode)
|
|||
break;
|
||||
case hash("xfin_locc"):
|
||||
if (opcode.parameter) {
|
||||
setRangeStartFromOpcode(opcode, crossfadeCCInRange[*opcode.parameter], Default::ccRange);
|
||||
setRangeStartFromOpcode(opcode, crossfadeCCInRange[*opcode.parameter], Default::ccValueRange);
|
||||
}
|
||||
break;
|
||||
case hash("xfin_hicc"):
|
||||
if (opcode.parameter) {
|
||||
setRangeEndFromOpcode(opcode, crossfadeCCInRange[*opcode.parameter], Default::velocityRange);
|
||||
setRangeEndFromOpcode(opcode, crossfadeCCInRange[*opcode.parameter], Default::ccValueRange);
|
||||
}
|
||||
break;
|
||||
case hash("xfout_locc"):
|
||||
if (opcode.parameter) {
|
||||
setRangeStartFromOpcode(opcode, crossfadeCCOutRange[*opcode.parameter], Default::velocityRange);
|
||||
setRangeStartFromOpcode(opcode, crossfadeCCOutRange[*opcode.parameter], Default::ccValueRange);
|
||||
}
|
||||
break;
|
||||
case hash("xfout_hicc"):
|
||||
if (opcode.parameter) {
|
||||
setRangeEndFromOpcode(opcode, crossfadeCCOutRange[*opcode.parameter], Default::velocityRange);
|
||||
setRangeEndFromOpcode(opcode, crossfadeCCOutRange[*opcode.parameter], Default::ccValueRange);
|
||||
}
|
||||
break;
|
||||
case hash("xf_cccurve"):
|
||||
|
|
|
|||
|
|
@ -249,7 +249,7 @@ struct Region {
|
|||
// Region logic: MIDI conditions
|
||||
Range<uint8_t> channelRange { Default::midiChannelRange }; //lochan and hichan
|
||||
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
|
||||
absl::optional<uint8_t> keyswitch {}; // sw_last
|
||||
absl::optional<uint8_t> keyswitchUp {}; // sw_up
|
||||
|
|
|
|||
|
|
@ -27,11 +27,12 @@
|
|||
//#include <string>
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include "Config.h"
|
||||
|
||||
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 CCNamePair = std::pair<uint8_t, std::string>;
|
||||
|
||||
|
|
|
|||
|
|
@ -166,15 +166,16 @@ void sfz::Synth::handleControlOpcodes(const std::vector<Opcode>& members)
|
|||
case hash("Set_cc"):
|
||||
[[fallthrough]];
|
||||
case hash("set_cc"):
|
||||
if (member.parameter && Default::ccRange.containsWithEnd(*member.parameter)){
|
||||
for (int channel=1; channel <=16; channel++)
|
||||
midiState.ccEvent(channel, *member.parameter, readOpcode(member.value, Default::ccRange).value_or(0));
|
||||
if (member.parameter && Default::ccNumberRange.containsWithEnd(*member.parameter)) {
|
||||
const auto ccValue = readOpcode(member.value, Default::ccValueRange).value_or(0);
|
||||
for (int channel = 0; channel < 16; channel++)
|
||||
midiState.ccEvent(channel, *member.parameter, ccValue);
|
||||
}
|
||||
break;
|
||||
case hash("Label_cc"):
|
||||
[[fallthrough]];
|
||||
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);
|
||||
break;
|
||||
case hash("Default_path"):
|
||||
|
|
|
|||
|
|
@ -345,6 +345,8 @@ public:
|
|||
*
|
||||
*/
|
||||
void disableFreeWheeling() noexcept;
|
||||
|
||||
const MidiState& getMidiState() const noexcept { return midiState; }
|
||||
protected:
|
||||
/**
|
||||
* @brief The parser callback; this is called by the parent object each time
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue