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 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
|
||||||
|
|
|
||||||
|
|
@ -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 };
|
||||||
|
|
|
||||||
|
|
@ -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];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 = {};
|
||||||
|
|
|
||||||
|
|
@ -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"):
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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>;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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"):
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue