• 4 Votes
    4 Posts
    165 Views
    ChazroxC

    Update:

    Factory Presets auto-populate from Github folder on app launch. (More Presets Soon) SVG's and path numbers save and load in presets. New Theme editor to change the UI look. More themes coming soon.

    Screenshot 2026-07-04 at 5.14.02 PM.png

    Compiled in Hise (showing cool new knob preset also =) )
    Screenshot 2026-07-04 at 5.16.41 PM.png

  • 12 Votes
    82 Posts
    5k Views
    ChazroxC

    I just pushed a major update!

    26 New Presets!
    We now have 'Factory Presets' and 'User Presets' drop down menus.

    The 'Factory Presets' menu is populated by a github folder that I will be adding more knobs to as time goes on. Hopefully I can offer a good variety of knobs to start you off with some cool looks.

    The 'User Preset' saves .json files of your knobs locally and recalls them on app launch.

    KnobDesignerFactoryPresetsNEW.gif

    Here's a short list of other updates:

    Preset Library

    Factory preset browser with live knob thumbnails
    Personal user preset library — save, browse and load your own designs
    One-click preset loading

    SVG Icon Integration

    Drop any SVG file directly onto the knob — auto-converts to HISE instantly
    No manual copy-pasting of path arrays

    Screenshot 2026-07-04 at 2.23.03 PM.png

    Theme System

    Full UI theme editor — customise every colour, font and control size
    Load factory themes from the cloud
    Save and share your own themes
    Screenshot 2026-07-04 at 2.24.08 PM.png

    Screenshot 2026-07-04 at 2.23.38 PM.png

    Colour Workflow

    Copy/paste colours between any pickers across the entire design
    HISE colour slot assignment on every colour (bgColour, itemColour1, itemColour2, textColour)

    Screenshot 2026-07-04 at 2.26.05 PM.png

  • SVG -> base64 Batch conversion?

    7
    0 Votes
    7 Posts
    287 Views
    ChazroxC

    @dannytaurus

    I tried to load a 'duo-tone' svg with Base64SVG and this is the result?

    Screenshot 2026-07-01 at 2.40.49 AM.png

    SVG file:

    Screenshot 2026-07-01 at 2.42.10 AM.png

    Am I doing something wrong or not understanding something?

  • Rotation around center of mass is weird.

    Solved
    14
    0 Votes
    14 Posts
    954 Views
    ChazroxC

    StarKnobNoiseMaskLayerFixed.gif

    Heres the fix:

    MyKnobLaf.registerFunction("drawRotarySlider", function(g, obj) { var a = obj.area; var range = obj.max - obj.min; var stableSize = a[2] * (1.0 - 2.0 * 0.15); var ox = a[0] + (a[2] - stableSize) / 2; var oy = a[1] + (a[2] - stableSize) / 2; var cx = ox + stableSize / 2; var cy = oy + stableSize / 2; var sw = stableSize / 200.0; var startOffset = 2.5; var totalSweep = 2.0 * startOffset; var endOffset = -startOffset + totalSweep * (obj.value - obj.min) / range; var cStarBody3Top = 0xffFF0000; var cStarBody3Bot = 0xff00FBFF; var cStarBody3Outline = 0xfa000000; var starBody3Size = stableSize * 0.76; var starBody3X = cx - starBody3Size * 0.5; var starBody3Y = cy - starBody3Size * 0.5; var starBody3Static = Content.createPath(); starBody3Static.addStar([0.5, 0.5], 3, 0.13, 0.5, 0); starBody3Static.roundCorners(1); var starBody3StaticBounds = starBody3Static.getBounds(starBody3Size).translated(starBody3X, starBody3Y); var starBody3Star = Content.createPath(); starBody3Star.addStar([0.5, 0.5], 6, 0.05, 0.6, endOffset); starBody3Star.roundCorners(1); var starBody3RotBounds = starBody3Star.getBounds(starBody3Size).translated(starBody3X, starBody3Y); // PASS 1: gradient fill g.beginLayer(false); g.setGradientFill([cStarBody3Top, cx, starBody3Y, cStarBody3Bot, cx, starBody3Y + starBody3Size, false]); g.fillPath(starBody3Star, starBody3RotBounds); g.endLayer(); // PASS 2: noise — use full obj.area so noise fills behind mask cleanly g.beginLayer(false); g.applyMask(starBody3Star, starBody3RotBounds, false); g.rotate(endOffset, [cx, cy]); g.addNoise({"alpha": 0.3, "monochromatic": true, "area": [a[0], a[1], a[2] * 2, a[3] * 2]}); g.rotate(-endOffset, [cx, cy]); g.endLayer(); // PASS 3: outline g.beginLayer(false); g.setColour(cStarBody3Outline); g.drawPath(starBody3Star, starBody3RotBounds, 3.06 * sw); g.endLayer(); });
  • Ellipse Masking // Mask makes shape dark.

    Unsolved
    13
    0 Votes
    13 Posts
    937 Views
    ChazroxC

    Update: I bowed out gracefully.....for now lol

  • This topic is deleted!

    Unsolved
    1
    0 Votes
    1 Posts
    6 Views
    No one has replied
  • Drawing gradient along a path? Thermometer style gradient?

    17
    0 Votes
    17 Posts
    1k Views
    dannytaurusD

    @Chazrox Never used them, sorry.

  • Bank headers in flat-list preset browser?

    2
    0 Votes
    2 Posts
    271 Views
    David HealeyD

    @dannytaurus No the column just lists the files. A one column browser is pretty easy to create with a viewport or panel though.

  • 0 Votes
    2 Posts
    238 Views
    griffinboyG

    @Chazrox

    I don't have a "clean" example.
    This is old code too, so not a good example of good c++ node practices or anything like that.

    But here is a c++ node with a global cable(s) set up.

    I've had no problems before, with updating existing c++ headers when adding more global cables.

    If you make sure that the generated global cable code is up to date.
    When you create more cables, you need to re-generate the global cable c++ code in Hise and update those parts in the c++

    This generated stuff needs to be kept up to date with the cable names and IDs in your Hise project:

    enum class GlobalCables { grainpos = 0 }; using cable_manager_t = routing::global_cable_cpp_manager<SN_GLOBAL_CABLE(94428153)>;

    ^ Here, only one global cable exists, however when you add more global cables to your Hise project, this code will need regenerating / updating with the new names and IDs of the cables in your Hise project.

    C++ node example (using one global cable):

    // FILE: Griffin_GrainOsc.h /* Granular OSC node: per-voice state & note-reactive pitch. Each voice owns a Granulator instance via snex::PolyData so reset/prepare are scoped to the active voice. Pitch maps so that MIDI note 60 plays the sample at its original pitch / speed */ #pragma once #include <JuceHeader.h> #include <array> #include <vector> #include <deque> #include <cmath> #include <atomic> #include "src/GriffinGrainOsc/GGO_GranularEngine.h" namespace project { using namespace juce; using namespace hise; using namespace scriptnode; enum ParamID { kGrainSizeMs, kDensityHz, kMainPos, kSpray, kPitchSt, kRandPitch, kRandSize, kStereoSpread, kReverseChance, kEnvMode, kMaxGrains, kNumParams }; enum class GlobalCables { grainpos = 0 }; using cable_manager_t = routing::global_cable_cpp_manager<SN_GLOBAL_CABLE(94428153)>; template<int NV> struct Griffin_GrainOsc : public data::base, public cable_manager_t { SNEX_NODE(Griffin_GrainOsc); struct MetadataClass { SN_NODE_ID("Griffin_GrainOsc"); }; static constexpr bool isModNode() { return false; } static constexpr bool isPolyphonic() { return NV > 1; } static constexpr bool hasTail() { return false; } static constexpr bool isSuspendedOnSilence() { return false; } static constexpr int getFixChannelAmount() { return 2; } static constexpr int NumTables = 0, NumSliderPacks = 0, NumAudioFiles = 1, NumFilters = 0, NumDisplayBuffers = 0; struct Voice { ggrain::Granulator<float> gran; uint32_t lastGrainSm{ 0 }; double lastDensityHz{ -1.0 }; int note{ 60 }; double sr{ 44100.0 }; void prepare(double sampleRate) { sr = sampleRate; gran.prepare(sr); lastGrainSm = 0; lastDensityHz = -1.0; } void reset() { gran.prepare(sr); // keeps grains cleared, parameters intact lastGrainSm = 0; lastDensityHz = -1.0; } void setSample(const float* mono, uint32_t num, double fileSr) { gran.loadSample(mono, num, fileSr); } }; template<typename PD> void process(PD& d) { auto& fix = d.template as<snex::Types::ProcessData<2>>(); auto blk = fix.toAudioBlock(); float* L = blk.getChannelPointer(0); float* R = blk.getChannelPointer(1); auto& v = voices.get(); v.gran.process(L, R, d.getNumSamples()); flushSpawnEvents(); } void prepare(snex::Types::PrepareSpecs s) { sr = s.sampleRate; voices.prepare(s); for (auto& v : voices) { v.prepare(sr); v.gran.setSpawnCallback(&Griffin_GrainOsc::onSpawnThunk, this); v.gran.setSpawnInfoCallback(&Griffin_GrainOsc::onSpawnInfoThunk, this); } // Leave existing param cache alone in runtime use; these are only defaults for first-time init. params[kGrainSizeMs] = (params[kGrainSizeMs] == 0.0 ? 100.0 : params[kGrainSizeMs]); params[kDensityHz] = (params[kDensityHz] == 0.0 ? 5.0 : params[kDensityHz]); params[kMainPos] = (params[kMainPos] == 0.0 ? 0.5 : params[kMainPos]); params[kSpray] = (params[kSpray] == 0.0 ? 0.0 : params[kSpray]); params[kPitchSt] = params[kPitchSt]; // keep params[kRandPitch] = params[kRandPitch]; params[kRandSize] = params[kRandSize]; params[kStereoSpread] = params[kStereoSpread]; params[kReverseChance] = params[kReverseChance]; params[kEnvMode] = (params[kEnvMode] == 0.0 ? 2.0 : params[kEnvMode]); for (auto& v : voices) params[kMaxGrains] = (double)v.gran.capacity(); applyParamsAll(); qCount.store(0, std::memory_order_relaxed); seq.store(0, std::memory_order_relaxed); } template<int P> void setParameter(double v) { static_assert(P < kNumParams); params[P] = v; for (auto& voice : voices) applyParamsForVoice(voice); } void createParameters(ParameterDataList& data) { using PD = parameter::data; PD pSize("GrainSizeMs", { 1.0, 2000.0, 0.01 }); pSize.setDefaultValue(100.0); pSize.setSkewForCentre(100.0); registerCallback<kGrainSizeMs>(pSize); data.add(pSize); PD pDen("DensityHz", { 0.1, 200.0, 0.0001 }); pDen.setDefaultValue(5.0); pDen.setSkewForCentre(10.0); registerCallback<kDensityHz>(pDen); data.add(pDen); PD pPos("Position", { 0.0, 1.0, 0.0001 }); pPos.setDefaultValue(0.0); registerCallback<kMainPos>(pPos); data.add(pPos); PD pSpr("Spray", { 0.0, 1.0, 0.0 }); pSpr.setDefaultValue(0.0); pSpr.setSkewForCentre(0.2); registerCallback<kSpray>(pSpr); data.add(pSpr); PD pPst("PitchSt", { -36.0, 36.0, 0.001 }); pPst.setDefaultValue(0.0); registerCallback<kPitchSt>(pPst); data.add(pPst); PD pRP("RandPitch", { 0.0, 1.0, 0.0 }); pRP.setDefaultValue(0.0); pRP.setSkewForCentre(0.08); registerCallback<kRandPitch>(pRP); data.add(pRP); PD pRS("RandSize", { 0.0, 1.0, 0.0001 }); pRS.setDefaultValue(0.0); pRS.setSkewForCentre(0.4); registerCallback<kRandSize>(pRS); data.add(pRS); PD pSpread("RandPan", { 0.0, 1.0, 0.0001 }); pSpread.setDefaultValue(0.0); pSpread.setSkewForCentre(0.35); registerCallback<kStereoSpread>(pSpread); data.add(pSpread); PD pRev("ReverseChance", { 0.0, 1.0, 0.0001 }); pRev.setDefaultValue(0.0); pRev.setSkewForCentre(0.4); registerCallback<kReverseChance>(pRev); data.add(pRev); PD pEnv("EnvelopeShape", { 0.0, 2.0, 1.0 }); pEnv.setDefaultValue(2.0); registerCallback<kEnvMode>(pEnv); data.add(pEnv); PD pCap("MaxVoiceGrains", { 1.0, (double)128.0, 1.0 }); pCap.setDefaultValue((double)128.0); registerCallback<kMaxGrains>(pCap); data.add(pCap); } /* Safe sample load: - Push newest buffer. - Point all voices at newest buffer (Granulator snapshots pointer/size). - Compact pool keeping newest and any buffers still used by active grains. */ void setExternalData(const snex::ExternalData& ed, int) override { using DT = snex::ExternalData::DataType; if (ed.dataType != DT::AudioFile) return; if (ed.isXYZ()) return; if (ed.isEmpty()) return; if (ed.numChannels <= 0 || ed.numChannels > 2) return; if (ed.numSamples <= 0 || ed.sampleRate <= 0.0) return; auto buf = ed.toAudioSampleBuffer(); const int nc = buf.getNumChannels(); const int ns = buf.getNumSamples(); if (ns <= 0 || (nc != 1 && nc != 2)) return; const double maxSec = 600.0; const int cap = juce::jmin(ns, (int)juce::roundToInt(ed.sampleRate * maxSec)); SampleBuf newest; newest.data.resize((size_t)cap); if (nc == 1) { const float* s0 = buf.getReadPointer(0); for (int i = 0; i < cap; ++i) { float x = s0[i]; if (!std::isfinite(x)) x = 0.0f; newest.data[(size_t)i] = juce::jlimit(-1.0f, 1.0f, x); } } else { const float* L = buf.getReadPointer(0); const float* R = buf.getReadPointer(1); for (int i = 0; i < cap; ++i) { float x = 0.5f * (L[i] + R[i]); if (!std::isfinite(x)) x = 0.0f; newest.data[(size_t)i] = juce::jlimit(-1.0f, 1.0f, x); } } newest.srcRate = ed.sampleRate; pool.push_back(std::move(newest)); const size_t newestIdx = pool.size() - 1; const float* newestPtr = pool[newestIdx].data.data(); const uint32_t newestSz = (uint32_t)pool[newestIdx].data.size(); const double newestSR = pool[newestIdx].srcRate; for (auto& v : voices) v.setSample(newestPtr, newestSz, newestSR); if (pool.size() <= 1) return; size_t write = 0; for (size_t read = 0; read < pool.size(); ++read) { const bool keepNewest = (read == newestIdx); bool keep = keepNewest; if (!keepNewest) { const float* p = pool[read].data.data(); for (auto& v : voices) { if (v.gran.isSamplePointerInUse(p)) { keep = true; break; } } } if (keep) { if (write != read) pool[write] = std::move(pool[read]); ++write; } } pool.resize(write); } void reset() { for (auto& v : voices) { v.reset(); // clear grains; keep parameters/seeds/buffers applyParamsForVoice(v); } qCount.store(0, std::memory_order_relaxed); } void handleHiseEvent(HiseEvent& e) { if (e.isNoteOn()) { auto& v = voices.get(); v.gran.flush(true); v.note = e.getNoteNumberIncludingTransposeAmount(); applyParamsForVoice(v); } } SN_EMPTY_PROCESS_FRAME; void connectToRuntimeTarget(bool addConnection, const runtime_target::connection& c) override { cable_manager_t::connectToRuntimeTarget(addConnection, c); } private: // GUI spawn-event sender juce::Array<juce::var> packed; void flushSpawnEvents() { const int N = qCount.exchange(0, std::memory_order_acq_rel); if (N <= 0) { packed.clearQuick(); return; } packed.clearQuick(); packed.ensureStorageAllocated(N * 3); for (int i = 0; i < N; ++i) { packed.add(juce::var((double)qP0[(size_t)i])); packed.add(juce::var((double)qVel[(size_t)i])); packed.add(juce::var((double)qDurMs[(size_t)i])); } this->sendDataToGlobalCable<GlobalCables::grainpos>(juce::var(packed)); } static void onSpawnThunk(void*, float) {} static void onSpawnInfoThunk(void* user, float p0, float v01ps, float durMs) { auto* self = static_cast<Griffin_GrainOsc*>(user); if (!self) return; const int idx = self->qCount.load(std::memory_order_relaxed); if ((unsigned)idx >= (unsigned)kQueueCap) return; self->qP0[(size_t)idx] = p0; self->qVel[(size_t)idx] = v01ps; self->qDurMs[(size_t)idx] = durMs; self->qCount.store(idx + 1, std::memory_order_release); } void applyParamsAll() { for (auto& v : voices) applyParamsForVoice(v); } void applyParamsForVoice(Voice& v) { const double grainMs = juce::jlimit(1.0, 2000.0, params[kGrainSizeMs]); const double densityHz = juce::jlimit(0.1, 200.0, params[kDensityHz]); uint32_t grainSm = (uint32_t)juce::roundToInt((grainMs * 0.001) * v.sr); if (grainSm == 0) grainSm = 1; const bool lenChanged = (grainSm != v.lastGrainSm); const bool denChanged = (std::abs(densityHz - v.lastDensityHz) > 1e-12); if (lenChanged || denChanged) { v.gran.setParameters(grainSm, densityHz, 0.0); v.lastGrainSm = grainSm; v.lastDensityHz = densityHz; } ggrain::SpawnParams sp{}; sp.mainPos01 = juce::jlimit(0.0, 1.0, params[kMainPos]); sp.spray01 = juce::jlimit(0.0, 1.0, params[kSpray]); sp.sprayMode = ggrain::SprayMode::Gaussian; sp.baseLenSm = grainSm; sp.sizeRand01 = juce::jlimit(0.0, 1.0, params[kRandSize]); // Honor requested pitch exactly (no limiting). UI control is still clamped, but note+UI sum is not. const double uiPitchSt = juce::jlimit(-36.0, 36.0, params[kPitchSt]); const double noteSemis = (double)v.note - 60.0; sp.pitchSemitones = uiPitchSt + noteSemis; sp.pitchRand01 = juce::jlimit(0.0, 1.0, params[kRandPitch]); sp.reverseChance01 = juce::jlimit(0.0, 1.0, params[kReverseChance]); sp.stereoSpread01 = juce::jlimit(0.0, 1.0, params[kStereoSpread]); const int envIdx = (int)juce::jlimit(0.0, 2.0, params[kEnvMode]); sp.envMode = (envIdx == 0 ? ggrain::EnvelopeMode::RectRaisedCos : envIdx == 1 ? ggrain::EnvelopeMode::Triangle : ggrain::EnvelopeMode::Hanning); v.gran.setSpawnParams(sp); const size_t cap = v.gran.capacity(); const size_t want = (size_t)juce::roundToInt(juce::jlimit(1.0, (double)cap, params[kMaxGrains])); v.gran.setMaxActiveGrains(want); } struct SampleBuf { std::vector<float> data; double srcRate{ 44100.0 }; }; static constexpr int kQueueCap = 512; double sr{ 44100.0 }; std::array<double, kNumParams> params{}; snex::PolyData<Voice, NV> voices; std::vector<SampleBuf> pool; std::array<float, kQueueCap> qP0{}; std::array<float, kQueueCap> qVel{}; std::array<float, kQueueCap> qDurMs{}; std::atomic<int> qCount{ 0 }; std::atomic<int> seq{ 0 }; }; }
  • HISE Update broke my project.

    29
    0 Votes
    29 Posts
    2k Views
    David HealeyD

    @Chazrox said in HISE Update broke my project.:

    If its not an xml problem whats my next move?

    If it was me I'd crack open a debugger and see what it says, not a simple thing to explain how to here though.

  • Full Expansions Included Scripts

    12
    0 Votes
    12 Posts
    945 Views
    S

    @David-Healey The Problem was that I was including the same Expansions.js in the actual Expansion! Ive commented that and deleted the file and is working in the exported Plugin!

  • Trading DSP's!

    10
    1 Votes
    10 Posts
    930 Views
    C

    @Chazrox Have got a Glitch FX and a Granular Pitch Delay. Would be interested in the pitch and varispeed!

  • One shared Script Voice Start Modulator for many Samplers?

    5
    0 Votes
    5 Posts
    468 Views
    observantsoundO

    @David-Healey Yes the Global Modulator Container worked beautifully for this.
    Thanks to your video I've now also understood the global modulator container better.

    Regarding the body + release in one sampler:
    That's what I've tried first, but it's bugged when using together with loop regions.
    It's what I described in this earlier post you commented on:
    https://forum.hise.audio/topic/14799/loud-click-artifact-when-using-releasestart-with-looping-enabled/14?_=1781354181861

    I haven't gotten around to testing it with 48kHz samples yet.
    But by now I've found enough use cases to split apart the sections into dedicated samplers.

  • HISE 4.1: Obtaining Peak/RMS Values from Script to a Scripted UI Meter?

    11
    0 Votes
    11 Posts
    793 Views
    ustkU

    Speaking of which...

    https://github.com/christophhart/HISE/pull/984

    I can't believe the math were wrong the whole time
    -> upDecayTime was inverted...

  • Logic crashes on startInternalDrag

    22
    0 Votes
    22 Posts
    2k Views
    Oli UllmannO

    @David-Healey
    @ustk
    @HISEnberg
    @ulrik

    I've created my own little drag-and-drop implementation. Any suggestions for improvements?

    HiseSnippet 1697.3ocuXE0aSbDD9tjbsXWPsHwOfE+P3bIXrSbRHJPaRbR.qRBVj.kHDBs4t02sMm205t0IwBgT+o0eR809T6L6dm8cN1zRDTKPw6Nyry2Ly2N6ttSrzikjHisrKe7v9LK6a5bzPgJrUHkKrZuqk8sbFDE0iJD6FSCr1YXeZRBy2x1d9mhpXWZAK8m+7m2gFQEdrwSYY8ZI2i8bdOtZ7rc15W3QQ6S8YGy6kS6la01SJZIijC.3LuScq9TuynArConZy4X8LZRnk8O5rd2UnqsZ2U7Vm0bYFk5e5pqsg+oqzXs0W4QrldT5iVsoWyMrr+l874JY7QJphkXYuvNR+gGEJuPXbvq4I7SiX3fFVGAd1L89xHeLDwYsZExi76jkmRrfUoy3r17lr1cbNf6yGM+3r2OnEPFaQ9Dn8bEg27EfWi7vqdN3MEHYmCRKXfzscNxKl2WMVBhmuyosPwh6Rg5TdnXz0Zt+pjyCeH4EQ76kPvB98D2a2XY+xsjfYBUsdzyX6GCCFsLtqTu9RjkWsd0MKWFrEClAIjWSi4T.7IkiYAjjKn8Ay5YTAW3.THoCUvhRJC08DE4bZLoudBxSHuMyiALUKYu9RALvsh1fFUptTYxT97IrY4qgMqbMroYkpuChxtxX29DtHMfpV9CkK0uVBS0AXFpWJGn3BlqQXmWBoNizCjCRXsnQQmBT+TwGzZBwChgpI3NIrRbQvynBeybUVhX19jT6hPthsDAKJebTNmzV3y8n.iyj3ym2EQ5pBKFx8SO7FqREXUGOpVBvXQShkQtcoQIrIDCAsLgq3RgKvTPxh9+o7kmSOs.RziaLSTXDiHv7Mb4cqnXWpfnuRkpSmgQzocRZduLWDA+gzcfvCgEIqN3FnKTA05Bcn1NJxsP5DKCAn+LyNR3oQPwxHzOldw1Q7.Ay+X.RtpPdBF.s8cqtDIazykdzncjCD9It0g4q3AgVLyuhoZgAPqPl2Yjiowf5WAtdnPiL2fH4ozn2rDw7kSv..onHAjCYw5aR3jGmFg0hXh.UHL08ueUsZeXD+NBAEQoWUvNiAukij4hpbIH0nFFKOU61rB7abgPnn5C+DpexUU+hBp+qbeU3UUJrfROiwCBUnVSnFWjv8YftoIIxO8D.8Kt3nwOFGeevmKt3T2mCeRSqnoCGa5InoCASCy4TdWWiGqVXwhYpAwBB2DDezne5jOnQ98mEXr585jrdAyfxdPKW14.4QSawUg0E0B5AGqLKDwMq2a0xk.DpUulWD26LlOFP20LSLlCagSC5AKVoYs8pTorEbDKoFW3yt7Ec0zc8N7FnherbIMnvSzln+SNn.aYBRcoopEnIXoaUtB8Bx4F6tbywVLblVbRNKFhV.+aF8l.+9.RC.7vxY9xn9TWwrbc7TwCXoQqIb6.mKJi6Yh3sE9D7.Tx1lxFN9kLvsj8NmEOD.sHHWxnGVzeU++eyGf2KzQ4RLETkb2m.zSjgLCg43USmsnS.zrDPWjwTAbdZmkLyeWV+QPTEhRlWmo34BpWyPHAUYyBDGJI9Y3vGwgrOKlpqEJo7LRen4MKccJxsEv8d2b108rS5lIeZhy5.BB1aezFXo3Poh8BgqduKHiLontcmprT.DwhmpX7R0weJCcEC5cJKdI3z1Hf5loHbwwh2F0Y12FM+kk8LGSmSQonsfqdQelXVWg1J8rc3aup8tTEEuBa5bfdPERwQHXuK6b3ADlKzVxYWVxYJYeK6uczEB.XpzRuU10cQliEGtT6MbLWVz5x7uHY33As2BZtBEzzVrf+9dG3Pex3Ir9L7yx48CequZ9YkYEO+N8KpeZNq34yzOeSQ+n2il5Gy90YEOa8aacAd7+nI9i3svc05mBl2CklUjbSmwaMQu3Xm5AyWRWcG66.CB0WhHaDbaudYuD8lNMWdilaTuw5qUOmfkmPx4YaOrm+yI7WdlzyQ.bxv20QeNcZKMn2F3JSGS3aPCTpPpBglQvSsuxqBg2iJ8GDgmAm+Qp3S4SE.8JJ7xP7gdvsZTCy+T+uXub8+JDusSGtxKb5XbtofQnixWCLl9d+a4rW2tLO0X.tfy9u4qyi6sLuZI3.pJlir3CGz6Hf.5w.uKvyIQV6bXWUy35YD7iXBe8f+F9jJrAN1NUXiLgV8ndwx26YNg.+EEtgdF.SB8u9RImCvwjFV5SMxmm6w84u2yq3RcECW95Z3JWWCadcMb0qqgqccMb8qqgO5e2P72eZ6AJYOy1FKqC5rm9HWa68D3CNzrUq+AfuNwBB
  • How does builder.connectToScript() work?

    6
    0 Votes
    6 Posts
    1k Views
    observantsoundO

    @Christoph-Hart I'm also still encountering this issue.
    I've also tried all kinds of formats
    "{PROJECT_FOLDER}/Scripts/test.js"
    "{PROJECT_FOLDER}/Scripts/ScriptProcessors/test.js"
    "{PROJECT_FOLDER}/test.js"

    I also get onControl cannot be parsed.
    My test.js is a file I saved after adding a blank script processor to my container.

    1:
    "Right-click/connect to external script": Works!
    "Rick-click/reload connected script": Works!

    2:
    Adding script via Builder.connecttoScript: On Control cannot be parsed.
    "Rick-click/reload connected script": Does not work "because connected script is not a valid HISE script. OnControl( cannot be parsed"

    function onVoiceStart(voiceIndex) { "Hallo"; } function onVoiceStop(voiceIndex) { } function onController() { } function onControl(number, value) { }
  • Custom Loop Player loading

    10
    0 Votes
    10 Posts
    678 Views
    David HealeyD

    @svkpowa Aha ok, just took a look at it and it's probably not needed for new projects.

  • How do I port DspNetworks ---> NewProject file ?

    8
    0 Votes
    8 Posts
    626 Views
    ChazroxC

    @HISEnberg @David-Healey Yup that works! I get it now. I've been compiling like a mad man lol

  • Dsp network wont compile: // <--Changed to more relevant title :)

    Solved
    69
    0 Votes
    69 Posts
    4k Views
    ChazroxC

    FIXED!!!!!! 😭 😭

    Screenshot 2026-06-05 at 7.22.38 PM.png

    @David-Healey @HISEnberg @dannytaurus OMG! A Year of trying and it was a stale template file....I wanna cry. lol

    Finally made it to this window:

    Screenshot 2026-06-05 at 7.25.10 PM.png

    and compiled dll successfully !

    Screenshot 2026-06-05 at 7.37.24 PM.png

  • synth.playnote

    5
    0 Votes
    5 Posts
    446 Views
    D

    @David-Healey :Hahaha 👍

12

Online

2.4k

Users

13.8k

Topics

120.4k

Posts