From ca64c584aea7aca9ece3b2bf4a99e5a2b1e4ba9c Mon Sep 17 00:00:00 2001 From: dave Date: Sat, 8 Feb 2025 18:25:59 +0000 Subject: [PATCH] Add start offset multiplier --- hi_core/hi_sampler/sampler/ModulatorSampler.cpp | 7 ++++++- hi_core/hi_sampler/sampler/ModulatorSampler.h | 3 ++- hi_scripting/scripting/api/ScriptingApi.cpp | 14 +++++++++++++- hi_scripting/scripting/api/ScriptingApi.h | 3 +++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/hi_core/hi_sampler/sampler/ModulatorSampler.cpp b/hi_core/hi_sampler/sampler/ModulatorSampler.cpp index b3bda8c85..230aa8763 100644 --- a/hi_core/hi_sampler/sampler/ModulatorSampler.cpp +++ b/hi_core/hi_sampler/sampler/ModulatorSampler.cpp @@ -1286,7 +1286,7 @@ void ModulatorSampler::preStartVoice(int voiceIndex, const HiseEvent& e) else { // hack: the sample start value is normalized so we need to just flip the sign in order to tell startVoice to use a direct sample value - sampleStartModValue = -1.0f * static_cast(getVoice(voiceIndex))->getCurrentHiseEvent().getStartOffset(); + sampleStartModValue = -1.0f * static_cast(getVoice(voiceIndex))->getCurrentHiseEvent().getStartOffset() * startOffsetMultiplier; samplerDisplayValues.currentSampleStartPos = 0.0f; } @@ -1778,6 +1778,11 @@ bool ModulatorSampler::setCurrentGroupIndex(int currentIndex, int eventId) } } +void ModulatorSampler::setStartOffsetMultiplier(int multiplier) +{ + startOffsetMultiplier = multiplier; +} + void ModulatorSampler::setRRGroupVolume(int groupIndex, float gainValue) { if (groupIndex == -1) diff --git a/hi_core/hi_sampler/sampler/ModulatorSampler.h b/hi_core/hi_sampler/sampler/ModulatorSampler.h index 75c91d354..16d34fefc 100644 --- a/hi_core/hi_sampler/sampler/ModulatorSampler.h +++ b/hi_core/hi_sampler/sampler/ModulatorSampler.h @@ -499,7 +499,7 @@ class ModulatorSampler: public ModulatorSynth, /** Sets the current index to the group. */ bool setCurrentGroupIndex(int currentIndex, int eventId=-1); - + void setStartOffsetMultiplier(int multiplier); void setRRGroupVolume(int groupIndex, float gainValue); @@ -758,6 +758,7 @@ class ModulatorSampler: public ModulatorSynth, TimestretchOptions currentTimestretchOptions; double ratioToUse = 1.0; + int startOffsetMultiplier = 1; TimestretchOptions timestretchOptions; diff --git a/hi_scripting/scripting/api/ScriptingApi.cpp b/hi_scripting/scripting/api/ScriptingApi.cpp index a3e19c365..6ce1cb756 100644 --- a/hi_scripting/scripting/api/ScriptingApi.cpp +++ b/hi_scripting/scripting/api/ScriptingApi.cpp @@ -968,7 +968,7 @@ void ScriptingApi::Message::setStartOffset(int newStartOffset) } if (newStartOffset > UINT16_MAX) - reportScriptError("Max start offset is 65536 (2^16)"); + reportScriptError("Max start offset is 65535 (2^16-1)"); #endif @@ -3764,6 +3764,7 @@ struct ScriptingApi::Sampler::Wrapper API_METHOD_WRAPPER_2(Sampler, setAllowReleaseStart); API_VOID_METHOD_WRAPPER_2(Sampler, setGUISelection); API_VOID_METHOD_WRAPPER_1(Sampler, setSortByRRGroup); + API_VOID_METHOD_WRAPPER_1(Sampler, setOffsetMultiplier); }; @@ -3826,6 +3827,7 @@ sampler(sampler_) ADD_API_METHOD_0(getTimestretchOptions); ADD_API_METHOD_0(getReleaseStartOptions); ADD_API_METHOD_1(setReleaseStartOptions); + ADD_API_METHOD_1(setOffsetMultiplier); sampleIds = SampleIds::Helpers::getAllIds(); @@ -4751,6 +4753,16 @@ void ScriptingApi::Sampler::setReleaseStartOptions(var data) #endif } +void ScriptingApi::Sampler::setOffsetMultiplier(int multiplier) +{ + ModulatorSampler* s = dynamic_cast(sampler.get()); + + if (s == nullptr) + reportScriptError("Invalid sampler call"); + + s->setStartOffsetMultiplier(multiplier); +} + String ScriptingApi::Sampler::getAudioWaveformContentAsBase64(var presetObj) { auto fileName = presetObj.getProperty("data", "").toString(); diff --git a/hi_scripting/scripting/api/ScriptingApi.h b/hi_scripting/scripting/api/ScriptingApi.h index fc17fd48c..1477127b5 100644 --- a/hi_scripting/scripting/api/ScriptingApi.h +++ b/hi_scripting/scripting/api/ScriptingApi.h @@ -1001,6 +1001,9 @@ class ScriptingApi /** Sets the options for the release start behaviour. */ void setReleaseStartOptions(var newOptions); + + /** Internally multiply sample start offsets by set amount */ + void setOffsetMultiplier(int multiplier); /** Converts the user preset data of a audio waveform to a base 64 samplemap. */ String getAudioWaveformContentAsBase64(var presetObj);