Feed master opcodes to the handleGroupOpcodes
This commit is contained in:
parent
4e7f15328a
commit
c2360bad45
4 changed files with 40 additions and 5 deletions
|
|
@ -67,7 +67,7 @@ void sfz::Synth::onParseFullBlock(const std::string& header, const std::vector<O
|
|||
break;
|
||||
case hash("group"):
|
||||
groupOpcodes = members;
|
||||
handleGroupOpcodes(members);
|
||||
handleGroupOpcodes(members, masterOpcodes);
|
||||
numGroups++;
|
||||
break;
|
||||
case hash("region"):
|
||||
|
|
@ -177,12 +177,12 @@ void sfz::Synth::handleGlobalOpcodes(const std::vector<Opcode>& members)
|
|||
}
|
||||
}
|
||||
|
||||
void sfz::Synth::handleGroupOpcodes(const std::vector<Opcode>& members)
|
||||
void sfz::Synth::handleGroupOpcodes(const std::vector<Opcode>& members, const std::vector<Opcode>& masterMembers)
|
||||
{
|
||||
absl::optional<unsigned> groupIdx;
|
||||
unsigned maxPolyphony { config::maxVoices };
|
||||
|
||||
for (auto& member : members) {
|
||||
const auto parseOpcode = [&](const Opcode& member) {
|
||||
switch (member.lettersOnlyHash) {
|
||||
case hash("group"):
|
||||
setValueFromOpcode(member, groupIdx, Default::groupRange);
|
||||
|
|
@ -191,7 +191,13 @@ void sfz::Synth::handleGroupOpcodes(const std::vector<Opcode>& members)
|
|||
setValueFromOpcode(member, maxPolyphony, Range<unsigned>(0, config::maxVoices));
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
for (auto& member : masterMembers)
|
||||
parseOpcode(member);
|
||||
|
||||
for (auto& member : members)
|
||||
parseOpcode(member);
|
||||
|
||||
if (groupIdx)
|
||||
setGroupPolyphony(*groupIdx, maxPolyphony);
|
||||
|
|
|
|||
|
|
@ -454,7 +454,7 @@ private:
|
|||
*
|
||||
* @param members the opcodes of the <group> block
|
||||
*/
|
||||
void handleGroupOpcodes(const std::vector<Opcode>& members);
|
||||
void handleGroupOpcodes(const std::vector<Opcode>& members, const std::vector<Opcode>& masterMembers);
|
||||
/**
|
||||
* @brief Helper function to dispatch <control> opcodes
|
||||
*
|
||||
|
|
|
|||
|
|
@ -397,3 +397,25 @@ TEST_CASE("[Synth] Not self-masking")
|
|||
REQUIRE(synth.getVoiceView(2)->getTriggerValue() == 64_norm);
|
||||
REQUIRE(!synth.getVoiceView(2)->canBeStolen());
|
||||
}
|
||||
|
||||
TEST_CASE("[Synth] Polyphony in master")
|
||||
{
|
||||
sfz::Synth synth;
|
||||
synth.loadSfzFile(fs::current_path() / "tests/TestFiles/master_polyphony.sfz");
|
||||
synth.noteOn(0, 65, 64);
|
||||
synth.noteOn(0, 65, 64);
|
||||
synth.noteOn(0, 65, 64);
|
||||
REQUIRE(synth.getNumActiveVoices() == 2); // group polyphony should block the last note
|
||||
synth.allSoundOff();
|
||||
REQUIRE(synth.getNumActiveVoices() == 0);
|
||||
synth.noteOn(0, 63, 64);
|
||||
synth.noteOn(0, 63, 64);
|
||||
synth.noteOn(0, 63, 64);
|
||||
REQUIRE(synth.getNumActiveVoices() == 2); // group polyphony should block the last note
|
||||
synth.allSoundOff();
|
||||
REQUIRE(synth.getNumActiveVoices() == 0);
|
||||
synth.noteOn(0, 61, 64);
|
||||
synth.noteOn(0, 61, 64);
|
||||
synth.noteOn(0, 61, 64);
|
||||
REQUIRE(synth.getNumActiveVoices() == 3);
|
||||
}
|
||||
|
|
|
|||
7
tests/TestFiles/master_polyphony.sfz
Normal file
7
tests/TestFiles/master_polyphony.sfz
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<master> polyphony=2
|
||||
<group> group=2
|
||||
<region> sample=*sine key=65
|
||||
<group> group=3
|
||||
<region> sample=*sine key=63
|
||||
<master> // Empty master resets the polyphony
|
||||
<region> sample=*sine key=61
|
||||
Loading…
Add table
Reference in a new issue