Reinsert default hdcc

This commit is contained in:
Paul Ferrand 2020-10-30 19:27:46 +01:00
parent 77e3562f2b
commit f21864cdc7
3 changed files with 51 additions and 7 deletions

View file

@ -278,6 +278,14 @@ struct Synth::Impl : public Voice::StateListener, public Parser::Listener {
static void updateUsedCCsFromRegion(std::bitset<config::numCCs>& usedCCs, const Region& region);
static void updateUsedCCsFromModulations(std::bitset<config::numCCs>& usedCCs, const ModMatrix& mm);
/**
* @brief Set the default value for a CC
*
* @param ccNumber
* @param value
*/
void setDefaultHdcc(int ccNumber, float value);
int numGroups_ { 0 };
int numMasters_ { 0 };
@ -374,6 +382,8 @@ struct Synth::Impl : public Voice::StateListener, public Parser::Listener {
Parser parser_;
fs::file_time_type modificationTime_ { };
std::array<float, config::numCCs> defaultCCValues_;
};
Synth::Synth()
@ -609,9 +619,11 @@ void Synth::Impl::clear()
modificationTime_ = fs::file_time_type::min();
// set default controllers
resources_.midiState.ccEvent(0, 7, normalizeCC(100)); // volume
resources_.midiState.ccEvent(0, 10, 0.5f); // pan
resources_.midiState.ccEvent(0, 11, 1.0f); // expression
resources_.midiState.resetAllControllers(0);
fill(absl::MakeSpan(defaultCCValues_), 0.0f);
setDefaultHdcc(7, normalizeCC(100));
setDefaultHdcc(10, 0.5f);
setDefaultHdcc(11, 1.0f);
// set default controller labels
insertPairUniquely(ccLabels_, 7, "Volume");
@ -706,16 +718,14 @@ void Synth::Impl::handleControlOpcodes(const std::vector<Opcode>& members)
if (Default::ccNumberRange.containsWithEnd(member.parameters.back())) {
const auto ccValue = readOpcode(member.value, Default::midi7Range);
if (ccValue)
resources_.midiState.ccEvent(
0, member.parameters.back(), normalizeCC(*ccValue));
setDefaultHdcc(member.parameters.back(), normalizeCC(*ccValue));
}
break;
case hash("set_hdcc&"):
if (Default::ccNumberRange.containsWithEnd(member.parameters.back())) {
const auto ccValue = readOpcode(member.value, Default::normalizedRange);
if (ccValue)
resources_.midiState.ccEvent(
0, member.parameters.back(), *ccValue);
setDefaultHdcc(member.parameters.back(), *ccValue);
}
break;
case hash("label_cc&"):
@ -1632,6 +1642,14 @@ void Synth::hdcc(int delay, int ccNumber, float normValue) noexcept
impl.ccDispatch(delay, ccNumber, normValue);
}
void Synth::Impl::setDefaultHdcc(int ccNumber, float value)
{
ASSERT(ccNumber >= 0);
ASSERT(ccNumber < config::numCCs);
defaultCCValues_[ccNumber] = value;
resources_.midiState.ccEvent(0, ccNumber, value);
}
float Synth::getHdcc(int ccNumber)
{
ASSERT(ccNumber >= 0);
@ -1640,6 +1658,14 @@ float Synth::getHdcc(int ccNumber)
return impl.resources_.midiState.getCCValue(ccNumber);
}
float Synth::getDefaultHdcc(int ccNumber)
{
ASSERT(ccNumber >= 0);
ASSERT(ccNumber < config::numCCs);
Impl& impl = *impl_;
return impl.defaultCCValues_[ccNumber];
}
void Synth::pitchWheel(int delay, int pitch) noexcept
{
ASSERT(pitch <= 8192);

View file

@ -344,6 +344,13 @@ public:
* @return the current value
*/
float getHdcc(int ccNumber);
/**
* @brief Get the default value of a controller under the current instrument
*
* @param ccNumber the cc number
* @return the default value
*/
float getDefaultHdcc(int ccNumber);
/**
* @brief Send a pitch bend event to the synth
*

View file

@ -1361,8 +1361,17 @@ TEST_CASE("[Synth] Initial values of CC")
)");
REQUIRE(synth.getHdcc(111) == 0.0f);
REQUIRE(synth.getDefaultHdcc(111) == 0.0f);
REQUIRE(synth.getHdcc(7) == Approx(100.0f / 127)); // default volume
REQUIRE(synth.getDefaultHdcc(7) == Approx(100.0f / 127));
REQUIRE(synth.getHdcc(10) == 0.5f); // default pan
REQUIRE(synth.getDefaultHdcc(10) == 0.5f);
REQUIRE(synth.getHdcc(11) == 1.0f); // default expression
REQUIRE(synth.getDefaultHdcc(11) == 1.0f);
synth.hdcc(0, 10, 0.7f);
REQUIRE(synth.getHdcc(10) == 0.7f);
REQUIRE(synth.getDefaultHdcc(10) == 0.5f);
synth.loadSfzString(fs::current_path() / "init_cc.sfz", R"(
<control> set_hdcc111=0.1234 set_cc112=77
@ -1370,7 +1379,9 @@ TEST_CASE("[Synth] Initial values of CC")
)");
REQUIRE(synth.getHdcc(111) == Approx(0.1234f));
REQUIRE(synth.getDefaultHdcc(111) == Approx(0.1234f));
REQUIRE(synth.getHdcc(112) == Approx(77.0f / 127));
REQUIRE(synth.getDefaultHdcc(112) == Approx(77.0f / 127));
}
TEST_CASE("[Synth] Default ampeg_release")