• CSS Label Hover Question

    2
    0 Votes
    2 Posts
    16 Views
    GabG

    @Casmat Seems to be either a bug or it needs a proper hover state like the button which I'm not sure but its the same thing for Scriptlabel and Focus don't seem to do anything.

    HiseSnippet 1208.3ocsV80aaaCDmJIpqVqcXAXe.DxdnNC0IR9OINtXXNwwYKnIoAycEaXOTPKQYwEJRAJpj3MLf8Ea.6izdeOrcTTwVNwcqvXU1R.7Nd28iGO963kRQ.IKSHQVNudZJAY8D6QS4p3AwXJGc5wHqOxNRHySPGMMEmkQBQVVq+0ZkV01.U77me0QXFlGPlKBgdifFPNilPUykdY+WRYrSvgjWSSpL618OMPvGHXhb.Hqa6gRwAWgmPt.qm1Z1nuAmEir9B6lMiB5540sUqNdXbqPLtsOo0Ajn8hB53cfW33Ndvu8PVOZXHUIjiTXEICYswQhvoihE2vMA3MzL5XFQOvGMBhrQ7IBVndIpkhFDSYgWdWFJCAd4x44q0M4qOy9bZHcl744sOsPg6bKpl.sVaQ3s9BvyuJ77p.uk.IqJPZCCj1zdTfjlplqQimO19TthHivv9TUnXlKZseec6ABXFb0NI3qHmHgAyrndaOum6Be19ENNvdUlx8Zrz8L7XBy28KcuyxID0.QRpfCCpukQ8VKZCaLaPVVEaBjDHIblH.yNSHt5Pd3IDBqt1JGmc20cXBlx18kjolvAeibLNYmLB.QFkSFolxHihIDHpN0b1IqXQwzy24WbbgmwBYHQ1ykCX6EERBfzJH3y8NR+yHaLT2MQJx4g8bURLOKEKALZTFA.tQDNgxl1y8YGJoX1ypnIi9yjdt64kdaEg2PnShU8fvyBMhK9DRyRYXvMQLR4z+o7LEMZZi.SZoma.Qm8MJwL5DdCphjjsnBE4VUiBs8bYjnRjpSIMhKCsuQVJNLjxmzy0y0eFFM9PuPoJp.7Alwb81oYlKAmQZHxKcXBVNgBp6dmgE1.DCIk4IFrE9C00kGyPUVLNTbCD+zaKdaBuxIiw0gJox+63CF7qNKre0KVbMQVtqs7vznS5sKKRMKiR6kDoVauvt9MwPxrH1NaYpzbLUq5ZpGTKZJ2f4EkyCzIJWA+Bgh7Jd8sAjVC7i68UEEsTc5pdofwHxkpVSLJ+2LrNOOYLQ9b3rDKmLahvg+EYTre2LJUI7Jq1pLQA+TNU8pTB+cQChJO4pYeJQELUUA2ymTx8bTtRI3HJPwTy1LvGU.4pMIPe2oGiU36bD3SHNoDohpWBVGStFZhXH0pYeLI6JkHE5GLihAZWYB6SKCawdXQTersY+Dc67.db+oyGD1+FZnJdlf948MmXlI429w95xKM04fQiLrOnwStqO0Sra2b+tM882uYWj9nYUEcOX+CZ0oiGR6gEsv+.nAlGJOMD1oFhChApMSpdtSZBf3Qat4l+UAPprdez6QZtxJ9zpq312aE+GSt+JFcQezC6m.cxDg4vQuEauouDPoBnBcgdJ59FZJkoUujv+a87deg3l1WRUAwKGiqsDLB0geHvX4MEdp8vnHRfZN.2v9ju+Cy0BPeKPcCr8miURJTOXeQdxHntJf.QmyILMCg0Z5ZKyXO8XcFXDgGVL3ugmRk95wVkJ8uSIJAGHEuMvv.nuKxiKj.XhWbusZ1mqG6tjC9IvUidaPvht5AF1bUMr0pZX6U0vNqpg6spFt+pZX2+aC02b8vbkHwbrAgN+xgED0VVC4XnBrnZE8O7uBewC

    Maybe the answer is in that

    Link Preview Image HISE | Docs

    favicon

    (docs.hise.dev)

  • MIDI CC Factory Assignments?

    2
    0 Votes
    2 Posts
    16 Views
    d.healeyD

    @Chazrox Assign them via midi learn menu, then save the preset.

  • Random Integer from (-1.0 -> +1.0)

    Solved
    22
    0 Votes
    22 Posts
    22 Views
    ChazroxC

    @ustk hmm...I never noticed that in my project yet. I'll keep that in mind. Sometimes a bunch of stuff will stop working and just start working again, I suspect thats whats happening but I just havent seen that message yet. Thanks!

  • Math.randInt / Stop duplicate returns.

    Solved
    3
    0 Votes
    3 Posts
    8 Views
    ChazroxC

    @d-healey Sweet! I'll watch this now. Hope you're having a great day brother! Thanks ๐Ÿ™

  • added scriptable FFT

    28
    0 Votes
    28 Posts
    1k Views
    O

    Another thing to bear in mind - it seems to me that you cannot run an FFT over a typical array. It HAS to be a buffer.

  • Delayed broadcaster fires twice

    Solved
    6
    1 Votes
    6 Posts
    29 Views
    clevername27C

    @Oli-Ullmann I've experienced similar thingsโ€”I think that whole system in HISE has serious issues, though I don' know what may or may not be happening in your case.

  • Multiple start and end ranges in a single AudioLoopPlayer

    10
    0 Votes
    10 Posts
    61 Views
    griffinboyG

    @Orvillain

    I'll give you a peek, but this isn't meant for other people to try and use yet (it's not properly cleaned up or optimized).
    This is the polyphonic sampler node. We then use the Hise Midi processing scripts to target notes / voices and send event data to control the parameters in this node. Meaning that we end up with polyphonic control over the parameters on a voice / note basis. The c++ sampler allows for safe modulation of any parameter, which means we can simply update it from the Hise scripts without worrying.

    #pragma once #include <JuceHeader.h> #include <array> #include <vector> #include <cmath> #include <algorithm> #include <random> #include <limits> #include <new> #include <atomic> namespace project { #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #if defined(_MSC_VER) #define FORCE_INLINE __forceinline #else #define FORCE_INLINE inline __attribute__((always_inline)) #endif using namespace juce; using namespace hise; using namespace scriptnode; static constexpr int FIXED_SHIFT = 16; static constexpr int64_t FIXED_ONE = (int64_t)1 << FIXED_SHIFT; static constexpr int64_t FIXED_MASK = FIXED_ONE - 1; struct SampleSettings { double pitchOffsetCents = 0.0; float volumeMult = 1.0f; float panning = 0.0f; float playbackStartInSamples = 0.0f; float loopStartInSamples = 0.0f; float loopEndInSamples = 0.0f; bool loopMode = false; float xfadeLengthInSamples = 0.0f; }; struct SamplePlayback { const float* sourceL = nullptr; const float* sourceR = nullptr; bool active = false; float amplitude = 1.0f; SampleSettings settings; int64_t phaseAcc = 0; int64_t phaseInc = 0; float playbackStart = 0.0f; float loopStart = 0.0f; float loopEnd = 0.0f; SamplePlayback() noexcept = default; SamplePlayback(const std::array<const float*, 2>& src, float amp, const SampleSettings& s, int bufferLength, double baseDelta) { sourceL = src[0]; sourceR = src[1]; settings = s; amplitude = amp * s.volumeMult; active = true; float pbStart = s.playbackStartInSamples; if (pbStart < 0.f) pbStart = 0.f; if (pbStart > float(bufferLength - 1)) pbStart = float(bufferLength - 1); playbackStart = pbStart; float lStart = s.loopStartInSamples; float lEnd = s.loopEndInSamples; if (!s.loopMode) { lStart = pbStart; lEnd = s.loopEndInSamples; } else { if (lStart < 0.f) lStart = 0.f; if (lStart > float(bufferLength - 1)) lStart = float(bufferLength - 1); if (lEnd < 0.f) lEnd = 0.f; if (lEnd > float(bufferLength - 1)) lEnd = float(bufferLength - 1); } loopStart = lStart; loopEnd = lEnd; phaseAcc = (int64_t)std::llround(pbStart * FIXED_ONE); double centsFact = std::pow(2.0, (s.pitchOffsetCents / 1200.0)); double effectiveSpeed = baseDelta * centsFact; phaseInc = (int64_t)std::llround(effectiveSpeed * FIXED_ONE); } // Marked as inline to help reduce overhead in performance-critical paths. FORCE_INLINE void updateSettings(const SampleSettings& s, int bufferLength) { settings = s; float pbStart = s.playbackStartInSamples; if (pbStart < 0.f) pbStart = 0.f; if (pbStart > float(bufferLength - 1)) pbStart = float(bufferLength - 1); playbackStart = pbStart; float lStart = s.loopStartInSamples; float lEnd = s.loopEndInSamples; if (!s.loopMode) { lStart = pbStart; lEnd = s.loopEndInSamples; } else { if (lStart < 0.f) lStart = 0.f; if (lStart > float(bufferLength - 1)) lStart = float(bufferLength - 1); if (lEnd < 0.f) lEnd = 0.f; if (lEnd > float(bufferLength - 1)) lEnd = float(bufferLength - 1); } loopStart = lStart; loopEnd = lEnd; } // This synthesis function is critical in performance: it is FORCE_INLINE to encourage inlining // and precomputes frequently used values outside the inner loops. FORCE_INLINE int vectorSynthesize(float* outL, float* outR, int blockSize, const AudioBuffer<float>* preXfadeBuffer, float preXfadeLength) { if (!active) return 0; int processed = 0; const float invFixedOne = 1.f / FIXED_ONE; const float leftGain = 0.5f * (1.f - settings.panning); const float rightGain = 0.5f * (1.f + settings.panning); const float ampLeft = amplitude * leftGain; const float ampRight = amplitude * rightGain; const bool loopEnabled = settings.loopMode; const float X = settings.xfadeLengthInSamples; const float endSample = loopEnd; const float crossfadeStartF = loopEnabled ? (endSample - X) : 0.f; const float piOverTwo = float(M_PI * 0.5f); const int64_t fixedEnd = int64_t(endSample * FIXED_ONE); int64_t fixedLoopStart = 0; int64_t fixedCrossfadeStart = 0; int64_t fixedX = 0; if (loopEnabled) { fixedLoopStart = int64_t(loopStart * FIXED_ONE); fixedX = (int64_t)std::llround(X * FIXED_ONE); fixedCrossfadeStart = fixedEnd - fixedX; } while (processed < blockSize) { if (!loopEnabled) { if (phaseAcc >= fixedEnd) { active = false; break; } int64_t samplesToBoundary = (fixedEnd - phaseAcc + phaseInc - 1) / phaseInc; int n = (samplesToBoundary > (blockSize - processed)) ? (blockSize - processed) : int(samplesToBoundary); for (int i = 0; i < n; i++) { int idx = int(phaseAcc >> FIXED_SHIFT); float frac = float(phaseAcc & FIXED_MASK) * invFixedOne; float sampL = sourceL[idx] + frac * (sourceL[idx + 1] - sourceL[idx]); float sampR = sourceR[idx] + frac * (sourceR[idx + 1] - sourceR[idx]); outL[processed + i] += sampL * ampLeft; outR[processed + i] += sampR * ampRight; phaseAcc += phaseInc; } processed += n; } else { if (phaseAcc < fixedLoopStart) { int64_t samplesToBoundary = (fixedLoopStart - phaseAcc + phaseInc - 1) / phaseInc; int n = (samplesToBoundary > (blockSize - processed)) ? (blockSize - processed) : int(samplesToBoundary); for (int i = 0; i < n; i++) { int idx = int(phaseAcc >> FIXED_SHIFT); float frac = float(phaseAcc & FIXED_MASK) * invFixedOne; float sampL = sourceL[idx] + frac * (sourceL[idx + 1] - sourceL[idx]); float sampR = sourceR[idx] + frac * (sourceR[idx + 1] - sourceR[idx]); outL[processed + i] += sampL * ampLeft; outR[processed + i] += sampR * ampRight; phaseAcc += phaseInc; } processed += n; } else if (phaseAcc >= fixedEnd) { int64_t excess = phaseAcc - fixedEnd; phaseAcc = fixedLoopStart + fixedX + excess; continue; } else if (phaseAcc < fixedCrossfadeStart) { int64_t samplesToBoundary = (fixedCrossfadeStart - phaseAcc + phaseInc - 1) / phaseInc; int n = (samplesToBoundary > (blockSize - processed)) ? (blockSize - processed) : int(samplesToBoundary); for (int i = 0; i < n; i++) { int idx = int(phaseAcc >> FIXED_SHIFT); float frac = float(phaseAcc & FIXED_MASK) * invFixedOne; float sampL = sourceL[idx] + frac * (sourceL[idx + 1] - sourceL[idx]); float sampR = sourceR[idx] + frac * (sourceR[idx + 1] - sourceR[idx]); outL[processed + i] += sampL * ampLeft; outR[processed + i] += sampR * ampRight; phaseAcc += phaseInc; } processed += n; } else { int64_t samplesToBoundary = (fixedEnd - phaseAcc + phaseInc - 1) / phaseInc; int n = (samplesToBoundary > (blockSize - processed)) ? (blockSize - processed) : int(samplesToBoundary); if (preXfadeBuffer) { const float* xfadeL = preXfadeBuffer->getReadPointer(0); const float* xfadeR = preXfadeBuffer->getReadPointer(1); int xfadeBufferLen = preXfadeBuffer->getNumSamples(); for (int i = 0; i < n; i++) { int idxPhase = int(phaseAcc >> FIXED_SHIFT); float frac = float(phaseAcc & FIXED_MASK) * invFixedOne; float currentP = float(phaseAcc) * invFixedOne; float posInXfade = currentP - crossfadeStartF; int idx = int(posInXfade); float subFrac = posInXfade - idx; if (idx < 0) idx = 0; else if (idx >= xfadeBufferLen - 1) idx = xfadeBufferLen - 2; float sampL = xfadeL[idx] + subFrac * (xfadeL[idx + 1] - xfadeL[idx]); float sampR = xfadeR[idx] + subFrac * (xfadeR[idx + 1] - xfadeR[idx]); outL[processed + i] += sampL * ampLeft; outR[processed + i] += sampR * ampRight; phaseAcc += phaseInc; } } else { for (int i = 0; i < n; i++) { int idxPhase = int(phaseAcc >> FIXED_SHIFT); float frac = float(phaseAcc & FIXED_MASK) * invFixedOne; float currentP = float(phaseAcc) * invFixedOne; float alpha = (currentP - crossfadeStartF) / X; float crossAngle = alpha * piOverTwo; float tailGain = std::cos(crossAngle); float headGain = std::sin(crossAngle); float sampTailL = sourceL[idxPhase] + frac * (sourceL[idxPhase + 1] - sourceL[idxPhase]); float sampTailR = sourceR[idxPhase] + frac * (sourceR[idxPhase + 1] - sourceR[idxPhase]); float headPos = float(fixedLoopStart) * invFixedOne + (currentP - crossfadeStartF); int idxHead = int(headPos); float fracHead = headPos - idxHead; float sampHeadL = sourceL[idxHead] + fracHead * (sourceL[idxHead + 1] - sourceL[idxHead]); float sampHeadR = sourceR[idxHead] + fracHead * (sourceR[idxHead + 1] - sourceR[idxHead]); float mixL = tailGain * sampTailL + headGain * sampHeadL; float mixR = tailGain * sampTailR + headGain * sampHeadR; outL[processed + i] += mixL * ampLeft; outR[processed + i] += mixR * ampRight; phaseAcc += phaseInc; } } processed += n; } } } return processed; } }; struct Voice { int midiNote = 60; bool isActive = false; float velocity = 1.0f; SamplePlayback playback; void reset(int note, float vel, const std::array<const float*, 2>& sample, int bufferLength, double baseDelta, const SampleSettings& settings) { midiNote = note; velocity = vel; isActive = true; new (&playback) SamplePlayback(sample, velocity, settings, bufferLength, baseDelta); } }; template <int NV> struct Griffin_Sampler : public data::base { SNEX_NODE(Griffin_Sampler); struct MetadataClass { SN_NODE_ID("Griffin_Sampler"); }; static constexpr bool isModNode() { return false; } static constexpr bool isPolyphonic() { return NV > 1; } static constexpr bool hasTail() { return true; } static constexpr bool isSuspendedOnSilence() { return false; } static constexpr int getFixChannelAmount() { return 2; } static constexpr int NumTables = 0; static constexpr int NumSliderPacks = 0; static constexpr int NumAudioFiles = 1; static constexpr int NumFilters = 0; static constexpr int NumDisplayBuffers = 0; PolyData<Voice, NV> voices; ExternalData sampleData; AudioBuffer<float> sampleBuffer; std::array<const float*, 2> sample{ nullptr, nullptr }; std::array<float, 128> pitchRatios{}; double sampleRate = 44100.0; double sampleRateRatio = 1.0; float sampleStartPercent = 0.0f; float loopStartPercent = 0.0f; float loopEndPercent = 1.0f; float playbackStartOffsetInSamples = 0.0f; float loopStartOffsetInSamples = 0.0f; float loopEndOffsetInSamples = 0.0f; double globalPitchOffsetFactor = 1.0; float xfadeFraction = 0.0f; float xfadeLengthInSamples = 0.0f; bool loopMode = false; std::mt19937 randomGen; std::atomic<AudioBuffer<float>*> precomputedXfadeBuffer{ nullptr }; void setExternalData(const ExternalData& ed, int) { sampleData = ed; AudioSampleBuffer tempBuf = ed.toAudioSampleBuffer(); int numSamples = tempBuf.getNumSamples(); int numChannels = tempBuf.getNumChannels(); if (numSamples <= 0) { int fallbackLen = 8; int chs = (numChannels > 0 ? numChannels : 2); AudioSampleBuffer fallback(chs, fallbackLen); fallback.clear(); sampleBuffer.makeCopyOf(fallback, true); } else { sampleBuffer.makeCopyOf(tempBuf, true); } sample[0] = sampleBuffer.getReadPointer(0); if (numChannels > 1) sample[1] = sampleBuffer.getReadPointer(1); else sample[1] = sample[0]; updateDerivedParameters(); } void updateDerivedParameters() { int currentSampleLength = sampleBuffer.getNumSamples(); if (currentSampleLength < 1) currentSampleLength = 1; playbackStartOffsetInSamples = sampleStartPercent * float(currentSampleLength - 1); loopStartOffsetInSamples = loopStartPercent * float(currentSampleLength - 1); loopEndOffsetInSamples = loopEndPercent * float(currentSampleLength - 1); float regionLen = loopEndOffsetInSamples - loopStartOffsetInSamples; if (regionLen < 0.f) regionLen = 0.f; float maxXfade = regionLen * 0.5f; float desiredXfade = xfadeFraction * regionLen; if (desiredXfade > maxXfade) desiredXfade = maxXfade; xfadeLengthInSamples = desiredXfade; if (loopMode && xfadeLengthInSamples > 0.f && sampleBuffer.getNumSamples() > 0) { int xfadeSamples = std::max(1, (int)std::round(xfadeLengthInSamples)); auto* newXfadeBuffer = new AudioBuffer<float>(2, xfadeSamples); for (int ch = 0; ch < 2; ++ch) { float* dest = newXfadeBuffer->getWritePointer(ch); const float* src = sampleBuffer.getReadPointer(std::min(ch, sampleBuffer.getNumChannels() - 1)); for (int i = 0; i < xfadeSamples; i++) { float pos = float(i); float alpha = (xfadeSamples > 1 ? pos / float(xfadeSamples - 1) : 0.f); float tailGain = std::cos(alpha * (float(M_PI) * 0.5f)); float headGain = std::sin(alpha * (float(M_PI) * 0.5f)); float tailPos = loopEndOffsetInSamples - xfadeLengthInSamples + pos; float headPos = loopStartOffsetInSamples + pos; int tailIdx = int(tailPos); int headIdx = int(headPos); float tailFrac = tailPos - tailIdx; float headFrac = headPos - headIdx; int numSamples = sampleBuffer.getNumSamples(); int tailIdx1 = std::min(tailIdx + 1, numSamples - 1); int headIdx1 = std::min(headIdx + 1, numSamples - 1); float tailSample = src[tailIdx] + tailFrac * (src[tailIdx1] - src[tailIdx]); float headSample = src[headIdx] + headFrac * (src[headIdx1] - src[headIdx]); dest[i] = tailGain * tailSample + headGain * headSample; } } AudioBuffer<float>* oldBuffer = precomputedXfadeBuffer.exchange(newXfadeBuffer); if (oldBuffer) delete oldBuffer; } else { AudioBuffer<float>* oldBuffer = precomputedXfadeBuffer.exchange(nullptr); if (oldBuffer) delete oldBuffer; } } void reset() { for (auto& voice : voices) voice.isActive = false; } void prepare(PrepareSpecs specs) { sampleRate = specs.sampleRate; initPitchRatios(); updateDerivedParameters(); voices.prepare(specs); std::random_device rd; randomGen.seed(rd()); } void handleHiseEvent(HiseEvent& e) { if (e.isNoteOn()) { auto& voice = voices.get(); double baseDelta = pitchRatios[e.getNoteNumber()] * sampleRateRatio * globalPitchOffsetFactor; SampleSettings settings; settings.pitchOffsetCents = 0.0; settings.volumeMult = 1.0f; settings.panning = 0.0f; settings.playbackStartInSamples = playbackStartOffsetInSamples; settings.loopStartInSamples = loopStartOffsetInSamples; settings.loopEndInSamples = loopEndOffsetInSamples; settings.loopMode = loopMode; settings.xfadeLengthInSamples = xfadeLengthInSamples; voice.reset(e.getNoteNumber(), e.getFloatVelocity(), sample, sampleBuffer.getNumSamples(), baseDelta, settings); } } template <typename ProcessDataType> void process(ProcessDataType& data) { auto& fixData = data.template as<ProcessData<getFixChannelAmount()>>(); auto audioBlock = fixData.toAudioBlock(); auto* leftChannel = audioBlock.getChannelPointer(0); auto* rightChannel = audioBlock.getChannelPointer(1); int totalSamples = data.getNumSamples(); if (sampleBuffer.getNumSamples() == 0) { audioBlock.clear(); return; } // Pre-clear output buffers std::fill(leftChannel, leftChannel + totalSamples, 0.f); std::fill(rightChannel, rightChannel + totalSamples, 0.f); AudioBuffer<float>* currentXfadeBuffer = precomputedXfadeBuffer.load(); for (auto& voice : voices) { if (!voice.isActive) continue; int n = voice.playback.vectorSynthesize(leftChannel, rightChannel, totalSamples, currentXfadeBuffer, xfadeLengthInSamples); if (!voice.playback.active) voice.isActive = false; } // Lock external sample data for thread-safe UI update. { DataReadLock lock(sampleData); bool uiUpdated = false; for (auto& voice : voices) { if (voice.isActive) { // Convert fixed-point phase accumulator to a float sample position. float currentPos = float(voice.playback.phaseAcc) / float(FIXED_ONE); sampleData.setDisplayedValue(currentPos); uiUpdated = true; break; } } if (!uiUpdated) sampleData.setDisplayedValue(0.0); } } template <typename FrameDataType> void processFrame(FrameDataType&) {} template <int P> void setParameter(double v) { if constexpr (P == 0) { globalPitchOffsetFactor = std::pow(2.0, v / 12.0); for (auto& voice : voices) { if (voice.isActive) { double newBaseDelta = pitchRatios[voice.midiNote] * sampleRateRatio * globalPitchOffsetFactor; double centsFact = std::pow(2.0, (voice.playback.settings.pitchOffsetCents / 1200.0)); double effectiveSpeed = newBaseDelta * centsFact; voice.playback.phaseInc = (int64_t)std::llround(effectiveSpeed * FIXED_ONE); } } } else if constexpr (P == 1) { sampleStartPercent = (float)v; updateDerivedParameters(); } else if constexpr (P == 2) { loopStartPercent = (float)v; updateDerivedParameters(); } else if constexpr (P == 3) { loopEndPercent = (float)v; updateDerivedParameters(); } else if constexpr (P == 4) { xfadeFraction = (float)v; if (xfadeFraction < 0.f) xfadeFraction = 0.f; if (xfadeFraction > 1.f) xfadeFraction = 1.f; updateDerivedParameters(); } else if constexpr (P == 5) { loopMode = (v >= 0.5); updateDerivedParameters(); } if constexpr (P >= 1 && P <= 5) { for (auto& voice : voices) { if (voice.isActive) { SampleSettings newSettings; newSettings.pitchOffsetCents = voice.playback.settings.pitchOffsetCents; newSettings.volumeMult = voice.playback.settings.volumeMult; newSettings.panning = voice.playback.settings.panning; newSettings.playbackStartInSamples = playbackStartOffsetInSamples; newSettings.loopStartInSamples = loopStartOffsetInSamples; newSettings.loopEndInSamples = loopEndOffsetInSamples; newSettings.loopMode = loopMode; newSettings.xfadeLengthInSamples = xfadeLengthInSamples; voice.playback.updateSettings(newSettings, sampleBuffer.getNumSamples()); } } } } void initPitchRatios() { for (int i = 0; i < 128; ++i) pitchRatios[i] = std::pow(2.0f, float(i - 60) / 12.0f); } void createParameters(ParameterDataList& data) { { parameter::data pitchParam("Pitch (semitones)", { -48.0, 24.0, 0.01 }); registerCallback<0>(pitchParam); pitchParam.setDefaultValue(0.0); data.add(std::move(pitchParam)); } { parameter::data startParam("Playhead Start", { 0.0, 1.0, 0.00001 }); registerCallback<1>(startParam); startParam.setDefaultValue(0.0); data.add(std::move(startParam)); } { parameter::data loopStartParam("Loop Start", { 0.0, 1.0, 0.00001 }); registerCallback<2>(loopStartParam); loopStartParam.setDefaultValue(0.0); data.add(std::move(loopStartParam)); } { parameter::data loopEndParam("Sample End", { 0.0, 1.0, 0.00001 }); registerCallback<3>(loopEndParam); loopEndParam.setDefaultValue(1.0); data.add(std::move(loopEndParam)); } { parameter::data xfadeParam("Xfade Length", { 0.0, 1.0, 0.0001 }); registerCallback<4>(xfadeParam); xfadeParam.setDefaultValue(0.0); data.add(std::move(xfadeParam)); } { parameter::data loopModeParam("Loop Mode", { 0.0, 1.0, 1.0 }); registerCallback<5>(loopModeParam); loopModeParam.setDefaultValue(0.0); data.add(std::move(loopModeParam)); } } }; } // namespace project
  • Load preset bank on init

    3
    0 Votes
    3 Posts
    12 Views
    S

    @Lindon Aha! That easy! Thank you!

  • 0 Votes
    22 Posts
    46 Views
    J

    @d-healey thank you for you help one last question how do i get it so that when i make changes on a different pannel
    that the preset with will keep the changes that i made say on a eq but change when i change presets in stead of just keeping the same
    settings from preset to preset

  • How to disable viewport table row selection?

    Solved
    9
    0 Votes
    9 Posts
    153 Views
    d.healeyD

    @Christoph-Hart Here's another use case that doesn't seem possible, combining CSS with paint routines.

    I want to use CSS to draw a rounded image on a panel. I want to use a paint routine to draw some text. Is this achievable? Or can text be drawn with CSS?

  • Quick coding question: Is there a way to check if a variable is a string?

    2
    0 Votes
    2 Posts
    22 Views
    d.healeyD

    @VirtualVirgin

    typeof(myVar) == "string"

    @VirtualVirgin said in Quick coding question: Is there a way to check if a variable is a string?:

    I would like to make an inline function that can accept either an integer or a string as one of the arguments,

    I would try to avoid this. I've started using the type safety stuff in HISE for everything lately and it prevents lots of little type related bugs I used to run into, before they can happen. But to use it you need to allow only one data type possibility per parameter/return value.

    If you want to have one or the other I would create two functions, or turn your strings into numbers with parseInt/parseFloat.

  • Reset All Controls to DEFAULT script?

    7
    0 Votes
    7 Posts
    17 Views
    ChazroxC

    @d-healey forehead slap

    Screenshot 2025-03-26 at 8.56.54โ€ฏAM.png

  • Delay Tempo Sync

    17
    0 Votes
    17 Posts
    95 Views
    X

    @d-healey

    hmmm, good argument ๐Ÿ™„ ๐Ÿ˜ฐ
    then probably better for everyone and then make the ones you don't need invisible ....
    or a possibility to enlarge the font of the TextBox ๐Ÿค  ๐Ÿ˜
    Then my trick with the hidden button works and the value is always ๐Ÿ˜ณ visible.

    similar to here, only the font is a bit small
    textbox_view.png

  • Mouse sensitivity and controlled parameters

    1
    0 Votes
    1 Posts
    13 Views
    No one has replied
  • having trouble triggering each button

    5
    0 Votes
    5 Posts
    18 Views
    D

    @d-healey Thank you so much, this has been a huge help. Iโ€™ll keep learning so that I can become someone who helps others someday as well.

  • ComboBox 'restoreState():' - help

    Solved
    4
    0 Votes
    4 Posts
    27 Views
    ChazroxC

    Im marking this as solved but im still not sure what the cause of the problem in the first place even was. Even tho I got it working, im gonna leave this up in case anybody wants to enlighten me.

    Thanks!

  • Connecting broadcasters query

    10
    0 Votes
    10 Posts
    44 Views
    O

    @d-healey That's the vid that got me started on broadcasters, and I'm very appreciative of it! So thanks!

  • Easiest Way to Add Shadows?

    Solved
    11
    0 Votes
    11 Posts
    91 Views
    ChazroxC

    @clevername27 No problem! ๐Ÿ™

  • Store Parametriq eq settings in Combobox.

    Solved
    8
    1 Votes
    8 Posts
    66 Views
    DabDabD

    @Chazrox Excellent. good job bro.

  • Help With SliderPack and CC Control

    26
    0 Votes
    26 Posts
    97 Views
    S

    @d-healey said in Help With SliderPack and CC Control:

    @StephanS said in Help With SliderPack and CC Control:

    how can it work that the slider states stay at the values i selected before and stays in position to each other when i control it via CC.

    This I don't know, because if you are using the current CC value as the starting point, then it's going to be constantly changing.

    I would forget about the sliderpack for now. Just add two knobs to your UI and see if you can get one knob to control the other in the way you want. Once you have that working you can move to the sliderpack version.

    Hi David,

    thank you very much for your help.
    I now have almost everything as it should be. Unfortunately, I can't manage one function. When I move a slider in the pack, the value is passed on to the slider but this must then be saved again. Could you have a look at the snippet?
    And please don't judge me for the horrible code ;)

    HiseSnippet 2650.3oc0Z07baabEGPVHwjsowwMyzdnGPzkRE4Hwkeyp1wThTRkUePVSYm5wiiJHvRwsBDfFXorny3Y7kdN2Zu1Yx8dsG5Eeq+OzSNsoyzdqGZOmtefOVPPBRoXO0hGfDv962a+g26suEXw11wVG55Z6HIm93wCgRxeWkNisv8q2WCYI0rgj7OPoiIx.5zVS+rSpW+jigt3SNGHs83gZttPCIY4arGErbpkkX+922caMSMKcX3kjjdfMRGd.Z.BGd0101GYZtqlA7Xz.AzEp0T21ptso8HhvtgRVogjNW6T3QZTXKoH8y0b6KI+wJ450UOWux4q.pBpVtPU.nXktExlS2nX074Kk2nWtJZkpPH8N6Xfv1NcvZXnqj7xaaaLtSe6mZw6fGfbQcMgzS.RcH8L+x6ZaZPuEoWUpdejoQaeOlqDwJsC8e2f6+9PkCQFnfqG5GuEqA0PFhNP4khJuaDQd.Q4kUPdSQRxBRZYtj9.kN5Nng3vVn546nzzBCc5oQhShRgiUZo8usRcaBBK75CzNCtqC4j.FYJlM6cTKjM6palNMIV4hUOWyQc+i1Fn9yT84cJDW2dvPaKxIYVg13JD7QfmKI34hAOeRvyGCdgjfWHF7hIAuXL3kRBdoXvKmD7xwfWII3UhAuZRvqFCNHahworwIjbfMdjEjXnEDO1BRL3BhGcAIFdAwiufDCvf3QXPhgX.KFqF6WTazgXhGQQeGV9N6Xd1wBriEYGKwNVlcrB6X06viS7+vYC3zAb9.tA.bK.J83HiEoUanR2w1zD5PidrB6zaiCsMFYpQJ2jYEVMIAXQcAGraq.ryxBDLpgfhw+XMRcKQpgylDTOZJFQzI14flM14dyLRval1wzeQBDo2XCU0l8Tw8gp5ZllcI8ppt8.nqZOG6Arqe3VcNlXcaGUKabZZ+gbOrNo25oY5B2jaiNDYQl+QsslEzjX4OYxehx83V2aq81Y15k2tmfoV2SB6eTqs4VNMxxDYAU6MxRGirsTss3X7hTYz8M2cHco4H3po+b1c9FargoM4NU0Qy5TpaO65jDHPtxqmk13gZtjB3pmY0kpt5pOXqCt+NLh9rOrYiljVXmNQFz5tP7VXrCp6HLLyjM1.1SajI9AT03KpMCMM6fmiE6LBxahqUzloS0i3+yfnBdSUj5OkMvYcSn0o39jKr1Zqxv+4AgWNyAHKBEJ1GgdL0MmYExkDGU54MnIfb2NEESjYVkvQ8Sn1HDtuob8A4n9wpGpQxb6YZSRT42WpaPboUHbYsn00MCwHqptZb6n2mFGLxHzD6eddLmhW1lGlmSxMld1COOXkUoRzy+W2KyNyDYIq5k7xJB4CxMnFAj3aP3wBiQ8+2nCSyvljOdFI0ryKezK.aY.uvKPsN6jV8BoPsNO6SUsdeHYDJpmJB+icEGdVea+QnLeVO0LeD0wM8zBLbvvoFwCiBTHOhIkGSPxzbXi9DCxBnnEylIgO5eSkx6Nij1pd2XdzP9Y8bKpq9STWYkMmjLHQxfoPVMjbtDImKYx4Sjb9jIWHQxERlbwDIWLYxkRjbojIWNQxkSlbkDIWIYxUSjb0jICRNECjcNzmSR1bxx.ImlAlSdFH4DMvbxz.ImpAlStFH4jMvzy1R6OZOEqbbZ1TTjhSVr5X9U3Na5EhEJNRJb7buI52Ch4UiG5.cIk93cqaPU0zAkW8qY4lQywQareuQe9BBUxDszmp7w7RRLgoQElG1n0D43We3H29YzDJF5UPiOUjCDOxwxCKSvrG6gnWZQ3ooYMLoGQ3zwJVFJcleJ3wbBmQQcJylveJtjlOIcpzonOmaXOw4DNaE6pagISXQ5TJ1byGKvGa94iMmO1ByGaderEmO1B9XKMerE8wVd9XK4isx7wV1Ga04ishOVP14CtZ.3EHxABBcfEI1ED7.KPzCDD9.KP7CDD.AKPDDDDBAKPLDvChoSkhlTO6m0y+MaldIlHiXXixDFNcjMF1xJCcbCoGRqNYS85M01Beh9o1LcY5bRhXFqQC5BcDF0x.JIubz02RY1quk3xuoycKB.ssZRJ5zZHzZVKJmjmuTRR91dph.EyVIrum2JgwCGRHCI4apveBSIlhCVCxWdRMo.1KyYe6HroEx7r.OR3aAE42mX.CMrlj7iTJUX86c596u1Aic1ubmV+hFOqk8456rlydmUuRc6yexSa8zrZcVqaEqAkQOYusbImipuV4e4V8JONKx3hVeZqhMW627vcOqbGyGd7EsvFGzXs0kjVf6t2QglRF4dqV5e++3tKL2bQ39q6c9Ws3byGg6eXuO5et3bKDgq5u8O+2VbtEip4uv4Rzukhv8Ee3m82Wbtkip4+3e5es3bqDg6qd1+4qWbtUiv8k+2a9WWHtuKK2H6Dh9u7UWBxQyrd0WJ80WBx4tZ2xbx4+1Pdhjq7e4kgbwuMjKMQn5GRRqueyFzZERxxdUtHUyFBcvHZgR4FvyQ5P9B4mRoAz8Lr8PRIofoIHIA7N887Wle5ZTw5yTJdOblzEheJlwhm7TjAtOsnUNxI8gnS6i8OSRnORO+BnB8ApVXe7pQ075C+VeXM+9w+JMqM.YXXBaa6hnSnD1xQ0FncgXUYWLbXGzyfhetIL7BhwVVod8HZ9cWrx1B593ZS22TSVz276HMMzeFmlFzOsSz0uLhJRMqnSZZFQ6sNZmClkDpAmz0gmz08xt05Z6PtutmlAZjqn5QX3.wugV3443WP9VKT.1aNj4lB4eg0mhFcwioytmV4AzDacMSoYEve0cGp4PTjnzBcTQtGRq.JUtb4bjgjSwgO6YzDtS.0R5Novav6jKghyKp3FWGTbAQEez0AEWb9kAdKSwkDU7CuNn3xhJ9ytNn3JBJ9EZWGTbUQerwa4J1+IPEbx8tVHYvrdXm2dkr3zdu3rqERNx7dVWKjr3De0FdsPxhy78hmbsPxhS88Rm++I43a0paoD7V.h67K59iyqAp8E2tUzsTkEoeGK9BMu91NXKInwaw0nB8sU7D1Du2xbE1tNvmLBZoKbQ0ZzMvWyPuVsun1mpcNrmsy.uWa0C4Op1AvSIcjnAOFR7rcFaoKdwNCrsw8QVmFYaARr6A11C2wh90aLDw2tulKcIMcgXwTApYO1lumGpaZSduOANMO0x1AxWlTQR0G4hsG3eCv1rgcHuxYi23Km2kHlCV7XdR4keeV3OHNSSDt7olKuXolIuQJktTJNHI7sDEmNPwQ1SLLEeakI2gUyWv22Ex9BkQRWsNmTrRLsOX8eIF8H1ptGeHTzsUKpl3lzQbQUBsDqi4I6jL+Wa4jKZ.9CTZiv58mdsxklh2RR50VsRo3al22SYmd8f53PAtrxt+p2L6bWo6YOBSp4cnF1AQleSgDT6XOxQGR5cKKnI8ylHuDMtyOOK8bVcNnkA6jug7yqQ.8bYuFA9MJMPS2w9Dcd3lVq3lrqPzjEaqUmR4P54pfI9bHjej4HQmnqG0TwHl6pRL+UkXgqJwhWUhktpDKeUIVY9DokY1ZDYpK9vFIoCauCebrbvLlx2P5+Aomz72A

53

Online

1.7k

Users

11.4k

Topics

99.3k

Posts