• 4 Votes
    3 Posts
    51 Views
    ChazroxC

    @resonant Thanks bro! 🙏 ⚡

  • 12 Votes
    79 Posts
    3k Views
    ChazroxC

    @digi I can add this. 'Gradient Rotation offset'. I'll push this when I get home tonight.

  • SVG -> base64 Batch conversion?

    7
    0 Votes
    7 Posts
    191 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
    781 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
    780 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
    237 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
    202 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
    820 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
    822 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
    409 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
    687 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
    937 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
    581 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
    543 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
    385 Views
    D

    @David-Healey :Hahaha 👍

9

Online

2.4k

Users

13.8k

Topics

120.4k

Posts