diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index aad9ddb8..a96d646b 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -53,9 +53,9 @@ sfz::Region::Region(int regionNumber, absl::string_view defaultPath) case hash(x "_stepcc&"): \ case hash(x "_smoothcc&") -bool sfz::Region::parseOpcode(const Opcode& rawOpcode, bool rtSafe) +bool sfz::Region::parseOpcode(const Opcode& rawOpcode, bool cleanOpcode) { - const Opcode opcode = rtSafe ? rawOpcode : rawOpcode.cleanUp(kOpcodeScopeRegion); + const Opcode opcode = cleanOpcode ? rawOpcode.cleanUp(kOpcodeScopeRegion) : rawOpcode; switch (opcode.lettersOnlyHash) { diff --git a/src/sfizz/Region.h b/src/sfizz/Region.h index 036915e7..522e894b 100644 --- a/src/sfizz/Region.h +++ b/src/sfizz/Region.h @@ -186,11 +186,11 @@ struct Region { * This must be called multiple times for each opcode applying to this region. * * @param opcode - * @param rtSafe whether the processing has to be real-time safe + * @param cleanOpcode whether the opcode should be canonicalized * @return true if the opcode was properly read and stored. * @return false */ - bool parseOpcode(const Opcode& opcode, bool rtSafe = false); + bool parseOpcode(const Opcode& opcode, bool cleanOpcode = true); /** * @brief Parse a opcode which is specific to a particular SFZv1 LFO: * amplfo, pitchlfo, fillfo. diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index 7e156a1a..bdf6bafa 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -902,7 +902,7 @@ void Synth::Impl::updateRegions() noexcept if (!update.region) continue; - update.region->parseOpcode(update.opcode, true); + update.region->parseOpcode(update.opcode, false); } regionUpdates_.clear(); diff --git a/src/sfizz/Voice.cpp b/src/sfizz/Voice.cpp index 1f449bd0..69b52eea 100644 --- a/src/sfizz/Voice.cpp +++ b/src/sfizz/Voice.cpp @@ -222,6 +222,7 @@ struct Voice::Impl float baseVolumedB_ { 0.0 }; float baseGain_ { 1.0 }; float baseFrequency_ { 440.0 }; + uint8_t pitchKeycenter_ { Default::key }; float floatPositionOffset_ { 0.0f }; int sourcePosition_ { 0 }; @@ -467,6 +468,7 @@ bool Voice::startVoice(Layer* layer, int delay, const TriggerEvent& event) noexc if (resources.stretch) impl.pitchRatio_ *= resources.stretch->getRatioForFractionalKey(numberRetuned); + impl.pitchKeycenter_ = region.pitchKeycenter; impl.baseVolumedB_ = region.getBaseVolumedB(resources.midiState, impl.triggerEvent_.number); impl.baseGain_ = region.getBaseGain(); if (impl.triggerEvent_.type != TriggerEventType::CC) @@ -1425,7 +1427,7 @@ void Voice::Impl::fillWithGenerator(AudioSpan buffer) noexcept if (!frequencies) return; - float keycenterFrequency = midiNoteFrequency(region_->pitchKeycenter); + float keycenterFrequency = midiNoteFrequency(pitchKeycenter_); fill(*frequencies, pitchRatio_ * keycenterFrequency); pitchEnvelope(*frequencies);