Use the existing OpcodeScope and ass the "<master>" level

This commit is contained in:
Paul Ferrand 2020-06-15 22:28:09 +02:00
parent 89093b1826
commit 7559dfdd7b
3 changed files with 8 additions and 6 deletions

View file

@ -47,6 +47,8 @@ enum OpcodeScope {
kOpcodeScopeGlobal, kOpcodeScopeGlobal,
//! control scope //! control scope
kOpcodeScopeControl, kOpcodeScopeControl,
//! Master scope
kOpcodeScopeMaster,
//! group scope //! group scope
kOpcodeScopeGroup, kOpcodeScopeGroup,
//! region scope //! region scope

View file

@ -74,7 +74,7 @@ void sfz::Synth::onParseFullBlock(const std::string& header, const std::vector<O
case hash("global"): case hash("global"):
globalOpcodes = members; globalOpcodes = members;
currentSet = sets.front().get(); currentSet = sets.front().get();
lastHeader = Header::Global; lastHeader = OpcodeScope::kOpcodeScopeGlobal;
groupOpcodes.clear(); groupOpcodes.clear();
masterOpcodes.clear(); masterOpcodes.clear();
handleGlobalOpcodes(members); handleGlobalOpcodes(members);
@ -87,17 +87,17 @@ void sfz::Synth::onParseFullBlock(const std::string& header, const std::vector<O
masterOpcodes = members; masterOpcodes = members;
newRegionSet(sets.front().get()); newRegionSet(sets.front().get());
groupOpcodes.clear(); groupOpcodes.clear();
lastHeader = Header::Master; lastHeader = OpcodeScope::kOpcodeScopeMaster;
handleMasterOpcodes(members); handleMasterOpcodes(members);
numMasters++; numMasters++;
break; break;
case hash("group"): case hash("group"):
groupOpcodes = members; groupOpcodes = members;
if (lastHeader == Header::Group) if (lastHeader == OpcodeScope::kOpcodeScopeGroup)
newRegionSet(currentSet->getParent()); newRegionSet(currentSet->getParent());
else else
newRegionSet(currentSet); newRegionSet(currentSet);
lastHeader = Header::Group; lastHeader = OpcodeScope::kOpcodeScopeGroup;
handleGroupOpcodes(members, masterOpcodes); handleGroupOpcodes(members, masterOpcodes);
numGroups++; numGroups++;
break; break;
@ -175,6 +175,7 @@ void sfz::Synth::clear()
for (auto& list : ccActivationLists) for (auto& list : ccActivationLists)
list.clear(); list.clear();
lastHeader = OpcodeScope::kOpcodeScopeGlobal;
sets.clear(); sets.clear();
sets.emplace_back(new RegionSet); sets.emplace_back(new RegionSet);
currentSet = sets.front().get(); currentSet = sets.front().get();

View file

@ -707,9 +707,8 @@ private:
std::vector<RegionPtr> regions; std::vector<RegionPtr> regions;
std::vector<VoicePtr> voices; std::vector<VoicePtr> voices;
// These are more general "groups" than sfz and encapsulates the full hierarchy // These are more general "groups" than sfz and encapsulates the full hierarchy
enum class Header { Global, Master, Group };
RegionSet* currentSet; RegionSet* currentSet;
Header lastHeader { Header::Global }; OpcodeScope lastHeader { OpcodeScope::kOpcodeScopeGlobal };
std::vector<RegionSetPtr> sets; std::vector<RegionSetPtr> sets;
// These are the `group=` groups where you can off voices // These are the `group=` groups where you can off voices
std::vector<PolyphonyGroup> polyphonyGroups; std::vector<PolyphonyGroup> polyphonyGroups;