diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index c2f73319..48295c40 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -250,6 +250,7 @@ void Synth::Impl::clear() changedCCsThisCycle_.clear(); keyLabels_.clear(); keySlots_.clear(); + swSlots_.clear(); keyswitchLabels_.clear(); globalOpcodes_.clear(); masterOpcodes_.clear(); @@ -745,6 +746,18 @@ void Synth::Impl::finalizeSfzLoad() for (unsigned key = loKey; key <= hiKey; ++key) keySlots_.set(key); } + // cache the set of keyswitches assigned + for (const RegionPtr& regionPtr : regions_) { + if (absl::optional sw = regionPtr->lastKeyswitch) { + swSlots_.set(*sw); + } + else if (absl::optional> swRange = regionPtr->lastKeyswitchRange) { + unsigned loKey = swRange->getStart(); + unsigned hiKey = swRange->getEnd(); + for (unsigned key = loKey; key <= hiKey; ++key) + swSlots_.set(key); + } + } } bool Synth::loadScalaFile(const fs::path& path) diff --git a/src/sfizz/SynthMessaging.cpp b/src/sfizz/SynthMessaging.cpp index f8672cca..c441807e 100644 --- a/src/sfizz/SynthMessaging.cpp +++ b/src/sfizz/SynthMessaging.cpp @@ -46,6 +46,14 @@ void sfz::Synth::dispatchMessage(Client& client, int delay, const char* path, co //---------------------------------------------------------------------- + MATCH("/sw/slots", "") { + const BitArray<128>& switches = impl.swSlots_; + sfizz_blob_t blob { switches.data(), static_cast(switches.byte_size()) }; + client.receive<'b'>(delay, path, &blob); + } break; + + //---------------------------------------------------------------------- + MATCH("/cc/slots", "") { const BitArray& ccs = impl.currentUsedCCs_; sfizz_blob_t blob { ccs.data(), static_cast(ccs.byte_size()) }; diff --git a/src/sfizz/SynthPrivate.h b/src/sfizz/SynthPrivate.h index aaf6f72a..5c8b4479 100644 --- a/src/sfizz/SynthPrivate.h +++ b/src/sfizz/SynthPrivate.h @@ -217,6 +217,7 @@ struct Synth::Impl final: public Parser::Listener { std::map ccLabelsMap_; std::vector keyLabels_; BitArray<128> keySlots_; + BitArray<128> swSlots_; std::vector keyswitchLabels_; // Set as sw_default if present in the file